@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 对对象进行代理增强
|