Spring AOP入口类的实例化
入口类注册
@EnableTransactionManagement
InfrastructureAdvisorAutoProxyCreator
@EnableAspectJAutoProxy
AnnotationAwareAspectJAutoProxyCreator
1.两注解只有其中一个
1.1 @EnableTransactionManagement
1.2 @EnableAspectJAutoProxy
2. 两注解共存
(1)结果:只有一个入口类实例化对象。
(2)分析原因:
1、@EnableTransactionManagement注解引入了TransactionManagementConfigurationSelector
类,该类在selectImports方法中引入了AutoProxyRegistrar类。
2、AutoProxyRegistrar类实现了ImportBeanDefinitionRegistrar接口,在实现的registerBeanDefinitions方法中,注册bean。
3、在AopConfigUtils工具类中,定义了一个属性。
4、而这个beanName就是AnnotationAwareAspectJAutoProxyCreator的beanName。AnnotationAwareAspectJAutoProxyCreator是@EnableAspectJAutoProxy注解注册的。
5、执行过程
会首先判断注册器中没有beanName = internalAutoProxyCreator的BeanDefinition,没有的话才会新建BeanDefinition。
如果注册器中已经有了beanName = internalAutoProxyCreator的BeanDefinition,就会取出来判断优先级,哪个优先级高就把BeanDefinition的beanClassName属性替换成哪个。
6、那优先级是怎么判断的呢?
在AopConfigUtils工具类中,定义了一个List属性。
index越大优先级越高。
(3)结论
同时使用两个注解的时候,会根据优先级来进行最后的决策。最终只有一个beanName = internalAutoProxyCreator的BeanDefinition存在。所以说两个注解同时开启,就只有一个入口类。