接着上一篇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