@EnableAspectJAutoProxy 注解如何开启 spring aop

@EnableAspectJAutoProxy 注解
  • 通过 @Import 注解向 spring 容器中注入 AspectJAutoProxyRegistrar 一个注册器
    在这里插入图片描述
AspectJAutoProxyRegistrar 注册器
  • 通过 AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary() 方法向容器中注册一个 AspectJ注解自动代理对象
    在这里插入图片描述
向容器中注入 AnnotationAwareAspectJAutoProxyCreator
  • 向容器注入该对象之后,就可以通过注解的方式来使用 spring aop
    在这里插入图片描述
向 spring 容器中注册自动代理创建器的逻辑
  • 向 spring 容器中注入对象 AUTO_PROXY_CREATOR_BEAN_NAME = “org.springframework.aop.config.internalAutoProxyCreator”
  • 可以看到该对象的优先级是最高的,注册的优先级高于其他 aop bean 对象的注册,就是在 spring 容器初始化 [ refresh() ] 的时候注册到 spring 容器中
    在这里插入图片描述
向 spring 容器注册代理创建器对象整体流程
  • refresh()
  • invokeBeanFactoryPostProcessors(beanFactory)
  • PostProcessorRegistrationDelegate.invokeBeanFactoryPostProcessors(beanFactory, getBeanFactoryPostProcessors())
  • invokeBeanDefinitionRegistryPostProcessors(currentRegistryProcessors, registry, beanFactory.getApplicationStartup())
  • postProcessor.postProcessBeanDefinitionRegistry(registry)
  • processConfigBeanDefinitions(registry)
  • this.reader.loadBeanDefinitions(configClasses)
  • loadBeanDefinitionsForConfigurationClass(configClass, trackedConditionEvaluator)
  • loadBeanDefinitionsFromRegistrars(configClass.getImportBeanDefinitionRegistrars())
  • registrars.forEach((registrar, metadata)
    registrar.registerBeanDefinitions(metadata, this.registry, this.importBeanNameGenerator))
  • registerBeanDefinitions(importingClassMetadata, registry)
  • AopConfigUtils.registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry)
  • registerAspectJAnnotationAutoProxyCreatorIfNecessary(registry, null)
  • registerOrEscalateApcAsRequired(AnnotationAwareAspectJAutoProxyCreator.class, registry, source)
  • RootBeanDefinition beanDefinition = new RootBeanDefinition(cls)
可以通过 debug 的方式查看创建 org.springframework.aop.aspectj.annotation.AnnotationAwareAspectJAutoProxyCreator 的流程

在这里插入图片描述

总结
  • 通过 @EnableAspectJAutoProxy 注解引入类型为 AnnotationAwareAspectJAutoProxyCreator 的 bean,这个 bean 会根据 AspectJ 的注解收集 Advisor ,通过收集的 Advisor 创建代理,底层又会把 Advisor 中的 Advice 转换为 MethodInvocation 拦截目标方法的执行
  • 注册该对象之后就是开启 自动代理对象创建,spring aop 就是通过动态代理的方式实现,所以可以说是开启代理的功能
  • 这些对象都是在 spring 容器初始化的时候先一步创建出来,在初始化的时候提前创建好,在后续的对象创建的时候,会判断对象是否有使用 aop 的功能,从而在创建对象的时候通过 BeanPostProcessor 对对象进行代理增强
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值