现象
仅限于初次接触Spring AOP
的患者😂
SpringBoot项目在使用@Aspect
注解配置切面类后,实际运行的时候并不会执行相关切面类中的代码。
解决
在Application
类前添加@EnableAspectJAutoProxy
注解。
如果不是使用SpringBoot的Spring MVC项目,需要在对应位置添加<aop:aspectj-autoproxy proxy-target-class="true" />
配置。
原因
@EnableAspectJAutoProxy
其实就是控制AOP
的“开关”,不配置这个当然没用啦 ╮(╯▽╰)╭
。
package org.springframework.context.annotation; import java.lang.annotation.Documented; import java.lang.annotation.ElementType; import java.lang.annotation.Retention; import java.lang.annotation.RetentionPolicy; import java.lang.annotation.Target; @Target({ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Import({AspectJAutoProxyRegistrar.class}) public @interface EnableAspectJAutoProxy { boolean proxyTargetClass() default false; boolean exposeProxy() default false; }
@EnableAspectJAutoProxy
用于启用自动代理。有两个参数:
- boolean proxyTargetClass
用于配置代理的具体实现方式。proxyTargetClass 代理实现方式 false
(默认值)使用 java接口
进行代理true
使用 cglib
进行代理 - boolean exposeProxy
配置内部调用的暴露情况,即是否对内部调用也进行代理,默认为false
(不代理内部调用)。
相关学习
这个博客介绍
@EnableAspectJAutoProxy
注解挺详细:
spring @EnableAspectJAutoProxy背后的那些事(spring AOP源码赏析)