概述
自动配置AopAutoConfiguration
类的主要任务是根据配置参数使用注解@EnableAspectJAutoProxy
。
该自动配置类通过注解声明了自己生效的条件是 :
- 以下类必须存在于
classpath
:EnableAspectJAutoProxy
Aspect
Advice
AnnotatedElement
- 配置参数
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.auto
spring.aop.proxy-target-class
如果spring.aop.auto
未被设置为false
,则@EnableAspectJAutoProxy
一定会被使用。而@EnableAspectJAutoProxy
使用的效果,主要就是导入AspectJAutoProxyRegistrar
。而AspectJAutoProxyRegistrar
最终是通过AopConfigUtils
注册了一个AOP
代理对象创建器bean
到容器 :
bean
名称 :org.springframework.aop.config.internalAutoProxyCreator
bean
类型: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 {
}
}