SpringAop关键接口`@EnableAspectJAutoProxy`

发布于:2025-08-15 ⋅ 阅读:(10) ⋅ 点赞:(0)

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 流程中扮演 “总协调者” 角色,核心能力包括:

  1. 解析@Aspect切面:通过重写findCandidateAdvisors()方法,调用buildAspectJAdvisors()解析@Aspect注解的切面类,生成Advisor(这是它相比其他 AutoProxyCreator 的关键扩展)。
  2. 整合所有Advisor:不仅处理@Aspect生成的Advisor,还会收集容器中显式定义的Advisor类型 Bean。
  3. 筛选与创建代理:继承AbstractAutoProxyCreator的逻辑,对每个 Bean 筛选匹配的Advisor,通过ProxyFactory创建代理对象,并将Advisor转换为拦截器链。

总结:@EnableAspectJAutoProxy的作用链

@EnableAspectJAutoProxy → 导入AspectJAutoProxyRegistrar → 注册AnnotationAwareAspectJAutoProxyCreator → 解析@Aspect切面生成Advisor → 为目标 Bean 创建代理并织入增强逻辑。

简言之,@EnableAspectJAutoProxy是开启 Spring 注解式 AOP 的 “开关”,而AnnotationAwareAspectJAutoProxyCreator是这个开关背后的 “执行者”,贯穿了Advisor从解析到最终生效的全流程。


网站公告

今日签到

点亮在社区的每一天
去签到