目錄
spring的事務管理是如何實現的?
Spring的AOP的底層實現原理
spring的事務管理是如何實現的?
首先,spring的事務是由aop來實現的,首先要生成具體的代理對象,然后按照aop的整套流程來執行具體的操作邏輯,正常情況下要通過通知來完成核心功能,但是事務不是通過通知實現的,而是通過一個TransactionInterceptor來實現的,然后調用invoke來實現具體的邏輯。
詳細:
1、先做準備工作,解析各個方法上事務相關的屬性,根據具體的屬性來判斷是否開始新事務
2、當需要開啟的時候,獲取數據庫連接,關閉自動提交功能,開啟事務
3、執行具體的sql邏輯操作
4、在操作過程中,如果執行失敗了,那么會通過completeTransactionAfterThrowing看來完成事務
的回滾操作,回滾的具體邏輯是通過doRollBack方法來實現的,實現的時候也是要先獲取鏈接對象,通過連接對象來回滾。
5、如果執行過程中,沒有任何意外情況的發生,那么通過commitTransactionAfterReturning來完
成事務的提交操作,提交的具體邏輯是通過doCommit方法來實現的,實現的時候也要獲取鏈接,通過鏈接對象來提交
6、當事務執行完畢之后需要清除相關的事務信息cleanupTransactionInfo如果想要聊的更加細致的話,需要知道TransactionInfo,TransactionsStatus
Spring的AOP的底層實現原理
aop是ioc的一個擴展功能,aop只是在ioc的整個流程中新增的一個擴展點:BeanPostProcessor
bean的創建過程中有一個步驟可以對bean進行擴展實現,aop本身就是一個擴展功能,所以在
BeanPostProcessor的后置處理方法中來進行實現
1、代理對象的創建過程(advice,切面,切點)
2、通過jdk或者cglib的方式來生成代理對象
3、在執行方法調用的時候,會調用到生成的字節碼文件中,直接回找到DynamicAdvisoredInterceptor類中的intercept方法,從此方法開始執行
4、根據之前定義好的通知來生成攔截器
5、從攔截器鏈中依次獲取每一個通知開始進行執行,在執行過程中,為了方便找到下一個通知是哪個,會有一個CglibMethodInvocation的對象,找的時候是從-1的位置依次開始查找并且執行的。