SpringAop关键接口@EnableAspectJAutoProxy
文章目录
@EnableAspectJAutoProxy
是 Spring 中开启基于注解的 AOP 功能的核心注解,其底层通过 导入AspectJAutoProxyRegistrar 来注册AnnotationAwareAspectJAutoProxyCreator,而AnnotationAwareAspectJAutoProxyCreator正是AbstractAutoProxyCreator的关键子类,负责上述所有Advisor的解析、筛选及代理创建流程。
一、@EnableAspectJAutoProxy的核心作用
@EnableAspectJAutoProxy
的源码非常简洁,核心是通过@Import导入AspectJAutoProxyRegistrar:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Import(AspectJAutoProxyRegistrar.class)
public @interface EnableAspectJAutoProxy {
// 是否强制使用CGLIB代理(默认false:优先JDK动态代理)
boolean proxyTargetClass() default false;
// 是否暴露代理对象到ThreadLocal(用于解决自调用无法增强的问题)
boolean exposeProxy() default false;
}
- 作用:开启 Spring 对@Aspect注解切面的支持,使@Before、@After等通知注解生效。
- 关键参数:
- proxyTargetClass:默认false,表示优先使用 JDK 动态代理(目标类需实现接口);设为true时,强制使用 CGLIB 代理(通过继承目标类)。
- exposeProxy:默认false;设为true时,代理对象会被存入ThreadLocal(可通过AopContext.currentProxy()获取),解决 “目标方法自调用无法被增强” 的问题。
二、AspectJAutoProxyRegistrar注册AnnotationAwareAspectJAutoProxyCreator
@Import(AspectJAutoProxyRegistrar.class)的作用是触发AspectJAutoProxyRegistrar的逻辑,其核心功能是向 Spring 容器注册AnnotationAwareAspectJAutoProxyCreator:
class AspectJAutoProxyRegistrar implements ImportBeanDefinitionRegistrar {
@Override
public void registerBeanDefinitions(
AnnotationMetadata importingClassMetadata, BeanDefinitionRegistry registry) {
// 注册AnnotationAwareAspectJAutoProxyCreator
AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry);
// 处理@EnableAspectJAutoProxy的属性(proxyTargetClass、exposeProxy)
AnnotationAttributes enableAspectJAutoProxy =
AnnotationAttributes.fromMap(importingClassMetadata.getAnnotationAttributes(EnableAspectJAutoProxy.class.getName(), false));
if (enableAspectJAutoProxy != null) {
// 设置proxyTargetClass属性
if (enableAspectJAutoProxy.getBoolean("proxyTargetClass")) {
AopConfigUtils.forceAutoProxyCreatorToUseClassProxying(registry);
}
// 设置exposeProxy属性
if (enableAspectJAutoProxy.getBoolean("exposeProxy")) {
AopConfigUtils.forceAutoProxyCreatorToExposeProxy(registry);
}
}
}
}
- AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry):向容器注册AnnotationAwareAspectJAutoProxyCreator的 BeanDefinition,确保其作为 Bean 被实例化。
- 后续逻辑将@EnableAspectJAutoProxy的属性(proxyTargetClass、exposeProxy)设置到AnnotationAwareAspectJAutoProxyCreator的 BeanDefinition 中,影响其代理创建行为。
三、AnnotationAwareAspectJAutoProxyCreator的核心功能
作为AbstractAutoProxyCreator的子类,AnnotationAwareAspectJAutoProxyCreator在 AOP 流程中扮演 “总协调者” 角色,核心能力包括:
- 解析@Aspect切面:通过重写findCandidateAdvisors()方法,调用buildAspectJAdvisors()解析@Aspect注解的切面类,生成Advisor(这是它相比其他 AutoProxyCreator 的关键扩展)。
- 整合所有Advisor:不仅处理@Aspect生成的Advisor,还会收集容器中显式定义的Advisor类型 Bean。
- 筛选与创建代理:继承AbstractAutoProxyCreator的逻辑,对每个 Bean 筛选匹配的Advisor,通过ProxyFactory创建代理对象,并将Advisor转换为拦截器链。
总结:@EnableAspectJAutoProxy的作用链
@EnableAspectJAutoProxy → 导入AspectJAutoProxyRegistrar → 注册AnnotationAwareAspectJAutoProxyCreator → 解析@Aspect切面生成Advisor → 为目标 Bean 创建代理并织入增强逻辑。
简言之,@EnableAspectJAutoProxy是开启 Spring 注解式 AOP 的 “开关”,而AnnotationAwareAspectJAutoProxyCreator是这个开关背后的 “执行者”,贯穿了Advisor从解析到最终生效的全流程。