在 Spring Boot 中使用 Spring AOP 我们通常会这样进行 Maven 引入:
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId> <version>2.3.5.RELEASE</version> </dependency>上面这个依赖内部会引入这样两个依赖:
<dependency> <groupId>org.springframework</groupId> <artifactId>spring-aop</artifactId> <version>5.2.10.RELEASE</version> <scope>compile</scope> </dependency> <dependency> <groupId>org.aspectj</groupId> <artifactId>aspectjweaver</artifactId> <version>1.9.6</version> <scope>compile</scope> </dependency>引入相关依赖后,同样可以使用 @EnableAspectJAutoProxy 注解来驱动整个 Spring AOP 依赖,不过在 Spring AOP 中你不需要显示地使用这个注解,因为在 spring-boot-autoconfigure 中,有一个 AOP 自动配置类,我们一起来看看
AopAutoConfigurationorg.springframework.boot.autoconfigure.aop.AopAutoConfiguration,Spring Boot 中的 AOP 自动配置类
@Configuration @ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class, AnnotatedElement.class }) @ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true) public class AopAutoConfiguration { @Configuration @EnableAspectJAutoProxy(proxyTargetClass = false) @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "false", matchIfMissing = false) public static class JdkDynamicAutoProxyConfiguration { } @Configuration @EnableAspectJAutoProxy(proxyTargetClass = true) @ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class", havingValue = "true", matchIfMissing = true) public static class CglibAutoProxyConfiguration { } }可以看到这个 @Configuration 配置类中有两个条件注解,都是基于 @Conditional 扩展的注解,如下:
@ConditionalOnClass 注解:value 中的所有 Class 对象在当前 JVM 必须存在才会注入当前配置类;
因为你通过 Spring Boot 引入了 aspectjweaver 这个包,Aspect、Advice 和 AnnotatedElement 三个 Class 对象也就存在了,而 EnableAspectJAutoProxy 这个注解本身就存在 Spring 中,所以这个注解是满足条件的
@ConditionalOnProperty 注解:指定的配置为 true 才会注入当前配置类
这个注解会判断 spring.aop.auto 是否为 true,没有配置默认为 true,所以这个注解也是满足条件的
所以得到的结论就是,当你引入 spring-boot-starter-aop 依赖后,Spring Boot 中会注入 AopAutoConfiguration 这个配置类,在这个配置类中的静态内部类使用了 @EnableAspectJAutoProxy 这个注解,那么也就会注册 Spring AOP 自动代理对象。
总结通过本文,我们可以知道 @EnableAspectJAutoProxy 这个模块驱动注解会借助 @Import 注解注册一个 AnnotationAwareAspectJAutoProxyCreator 自动代理对象,也就开启了 Spring AOP 自动代理,驱动了整个 Spring AOP 模块。