概述
自动配置AopAutoConfiguration类的主要任务是根据配置参数使用注解@EnableAspectJAutoProxy。
该自动配置类通过注解声明了自己生效的条件是 :
- 以下类必须存在于
classpath:EnableAspectJAutoProxyAspectAdviceAnnotatedElement
- 配置参数
spring.aop.auto值不为false如果该参数未使用则相当于
spring.aop.auto值为true
AopAutoConfiguration又包含了如下两个内置配置类,分别对应配置参数spring.aop.proxy-target-class值为true/false两种情况 :
注意,如果配置参数
spring.aop.proxy-target-class未被设置,则将这种情况作为spring.aop.proxy-target-class值为true来理解。
JdkDynamicAutoProxyConfiguration- 在
spring.aop.proxy-target-class为false时生效 - 生效时使用注解
@EnableAspectJAutoProxy(proxyTargetClass = false)
- 在
CglibAutoProxyConfiguration- 在
spring.aop.proxy-target-class为false或者缺失时生效 - 生效时使用注解
@EnableAspectJAutoProxy(proxyTargetClass = true)
- 在
从上面分析可以看出,AopAutoConfiguration主要是综合使用如下两个配置参数决定如何使用注解@EnableAspectJAutoProxy :
spring.aop.autospring.aop.proxy-target-class
如果spring.aop.auto未被设置为false,则@EnableAspectJAutoProxy一定会被使用。而@EnableAspectJAutoProxy使用的效果,主要就是导入AspectJAutoProxyRegistrar。而AspectJAutoProxyRegistrar最终是通过AopConfigUtils注册了一个AOP代理对象创建器bean到容器 :
bean名称 :org.springframework.aop.config.internalAutoProxyCreatorbean类型:AnnotationAwareAspectJAutoProxyCreator- 属性
order:HIGHEST_PRECEDENCE bean角色 :ROLE_INFRASTRUCTURE
源代码
源代码版本 : spring-boot-autoconfigure-2.1.3.RELEASE
package org.springframework.boot.autoconfigure.aop;
// 忽略 import 行
/**
* org.springframework.boot.autoconfigure.EnableAutoConfiguration
* Auto-configuration for Spring's AOP support. Equivalent to enabling
* org.springframework.context.annotation.EnableAspectJAutoProxy in your
* configuration.
*
* The configuration will not be activated if spring.aop.auto=false. The
* proxyTargetClass attribute will be true, by default, but can be
* overridden by specifying spring.aop.proxy-target-class=false.
*
*/
@Configuration
// 仅在这些类存在于 classpath 时生效
@ConditionalOnClass({ EnableAspectJAutoProxy.class, Aspect.class, Advice.class,
AnnotatedElement.class })
// 仅在属性 spring.aop.auto 缺失或者明确指定为 true 时生效
@ConditionalOnProperty(prefix = "spring.aop", name = "auto", havingValue = "true", matchIfMissing = true)
public class AopAutoConfiguration {
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = false)
// 在配置参数 spring.aop.proxy-target-class 值被明确设置为 false 时生效
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class",
havingValue = "false", matchIfMissing = false)
public static class JdkDynamicAutoProxyConfiguration {
}
@Configuration
@EnableAspectJAutoProxy(proxyTargetClass = true)
// 在配置参数 spring.aop.proxy-target-class 缺失或者值被明确设置为 true 时生效
@ConditionalOnProperty(prefix = "spring.aop", name = "proxy-target-class",
havingValue = "true", matchIfMissing = true)
public static class CglibAutoProxyConfiguration {
}
}

本文深入探讨了Spring Boot中AopAutoConfiguration类的作用,详细分析了其如何根据配置参数spring.aop.auto和spring.aop.proxy-target-class决定使用@EnableAspectJAutoProxy注解的方式,以及如何在不同条件下启用JdkDynamicAutoProxyConfiguration和CglibAutoProxyConfiguration。
574





