在研究@Enable*註解的應用之:宣告式事務@EnableTransactionManagement詳解原始碼時,配置中context裝置了一個TransactionInterceptor的bean。對這個類比較好奇因為Interceptor,因為MyBatis功能點之二(1):MyBatis提供的攔截器平臺中也分析過interceptor的使用,這個Spring Interceptor是怎樣成體系工作的呢?
從圖上可以觀察到Advice介面,所以這是Spring AOP實現的增強通知部分。下面從TransactionInterceptor開始倒推邏輯分析Spring AOP的架構:
1、TransactionInterceptor的載入:
在@Enable*註解的應用之:宣告式事務@EnableTransactionManagement詳解中有明確結論——ProxyTransactionManagementConfiguration中Java Bean的方式置於context中。
2、觀察下圖:典型的對應aop配置中的相關內容。
MethodInvocation與MethodInterceptor實現類相互依賴:
ReflectiveMethodInvocation使用TransactionInterceptor中的invoke方法,ReflectiveMethodInvocation自己作為invoke方法的引數;
TransactionInterceptor呼叫TransactionAspectSupport中的 invokeWithinTransaction方法,引數是ReflectiveMethodInvocation.getMethod——被代理物件,targetclass——代理物件。
事務處理邏輯封裝在invokeWithinTransaction方法中。
3、在Spring核心思想之 AOP:在自定義容器基礎上實現AOP功能實現了功能簡單的aop,瞭解aop的執行在beanpostProcessor中。下面驗證下上述事務功能是不是在某個後置處理中呼叫,確定是哪個後置處理器。
閱讀上圖中程式碼可以知道遍歷對當前bean,遍歷使用processor。透過除錯,可知是InfrastructureAdvisorAutoProxyCreator
其類圖如下:
在其父類AbstractAutoProxyCreator方法wrapIfNecessary中進行實際aop代理的處理: