spring源码获取所有Advisor记录

mac2024-05-15  28

接着上一篇spring实例化包含@Transational注解类(不论是类上还是方法上)的流程。

1.在BeanPostProcesser的实现类AbstractAutoProxyCreator的wrapIfNecessary方法里调用getAdvicesAndAdvisorsForBean方法

2.在其父类AbstractAdvisorAutoProxyCreator的getAdvicesAndAdvisorsForBean方法里会调用findEligibleAdvisors方法

3.在findCandidateAdvisors方法里委托advisorRetrievalHelper属性查找advisor,这里的advisorRetrievalHelper的类型是BeanFactoryAdvisorRetrievalHelper

 

4.在findAdvisorBeans方法里首先使用BeanFactoyUtils根据类型获取所有的beanName,再调用getBean方法获取所有Advisor实例对象

 

而其中有关事务处理的BeanFactoryTransactionAttributeSourceAdvisor的bean加载其实是在ProxyTransactionManagementConfiguration类中完成的。

ProxyTransactionManagementConfiguration类继承了抽象类AbstractTransactionManagementConfiguration,我们看下AbstractTransactionManagementConfiguration类里有定义了什么。这个类最重要就是决定了用哪个事务管理器,以便设置给TransactionInterceptor对象。

 

在ProxyTransactionManagementConfiguration类中除了配置了BeanFactoryTransactionAttributeSourceAdvisor外还配置了AnnotationTransactionAttributeSource类型 的TransactionAttributeSource和TransactionInterceptor对象,其中AnnotationTransactionAttributeSource的作用就是通过解析注解获取事务属性对象TransactionAttribute

 

最新回复(0)