Spring AOP 學習筆記
阿新 • • 發佈:2018-11-09
1、Spring AOP中的動態代理主要有兩種方式,JDK動態代理和CGLIB動態代理。JDK動態代理通過反射來接收被代理的類,並且要求被代理的類必須實現一個介面。JDK動態代理的核心是InvocationHandler介面和Proxy類。如果目標類沒有實現介面,那麼Spring AOP會選擇使用CGLIB來動態代理目標類。
2、@Transactional宣告式事務
Spring事務管理是通過Spring AOP增強實現的。應該是掃描只要含有註解Transactional,例項化時,就會生成基於委託類的代理類物件進行事務增強。
3、@Transactional什麼情況下會失效?
(1)丟擲的異常是否支援事務回滾?預設回滾UnChecked異常,如果需要回滾Checked異常需要配置
(2)修飾的方法是否是public修飾符?protected修飾符雖然可以被子類重寫,但是在Aop中是無法找到protected修飾的方法的,因為AOP取的是所有public方法(見參考1)
(3)是否含有final修飾符?因為CGLIB需要繼承被代理的類,所以方法和類不能加final修飾符。(如果有final修飾符,肯定不能實現介面的,因為介面不支援final修飾符)
(4)確認事務方法是不是通過代理類呼叫的?如果是直接內部方法呼叫,則事務不生效。原因待分析。
4、如果想要在protected和private修飾的方法上註解 @Transactional怎麼辦?
參考