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