簡要說一下流程,有的細節略過或者簡化了。
Spring事務其實是使用了Spring自定義標籤的解析功能和SpringAOP功能。
Spring定義了一個自定義標籤,然後定義了這個標籤對應的Parser。這個parser裏面註冊了一個AutoProxyCreator,也註冊了一個Advisor(裏面包含一個Interceptor)。
然後涉及Bean的加載過程,所有bean在創建時候都會包含一個流程,就是調用BeanPostProcessor的postProcessAfterInitialization方法。我們之前註冊的這個AutoProxyCreator就是BeanPostProcessor的一個實現,它的postProcessAfterInitialization方法其實是就是獲取增強然後對這個bean創建代理。那其中獲取到的增強就包括我們之前註冊的那個Advisor。這裏面有個判斷增強是否匹配的過程,怎麼標記我們需要增強的bean呢,就是加事務註解,包含事務屬性。有檢測到事務屬性,就說明這個bean需要這個增強。
增強完了之後,就是實際調用到這個bean的方法的時候,實際上調用的是那個代理,那個代理實際上要調用我們之前提到的那個Interceptor的invoke方法。這個方法裏面,就是先創建事務,然後調用實際被增強的這個方法,然後異常處理包括回滾,然後提交事務。創建事務的流程是根據我們配置的事務屬性的傳播屬性,然後對應不同的回滾流程,也對應不同的提交流程。
整個流程簡單地說完了。下面是看書時候整理的具體的圖可以參考一下。