- Spring Boot進階:原理、實戰(zhàn)與面試題分析
- 鄭天民
- 329字
- 2022-07-05 09:41:50
3.4.2 確保類內(nèi)方法調(diào)用能夠應(yīng)用代理
請注意,并不是所有場景下Spring AOP都是能夠生效的,例如,在代碼清單3-24所示的ServiceImpl中,直接調(diào)用添加了@Transactional注解的handleData()方法時,事務(wù)機制并不會生效。
代碼清單3-24 在類內(nèi)方法上使用代理代碼示例
public class ServiceImpl implements Service { @Override public void performBusiness(){ //事務(wù)無效 this.handleData(); } @Transactional public void handleData() { } }
這是因為Spring AOP是通過代理實現(xiàn)的,而無論是JDK代理還是CGLIB代理,其運行機制是對某一個外部的接口或?qū)崿F(xiàn)類進行代理,像上述代碼中直接調(diào)用ServiceImpl類內(nèi)的方法是不會應(yīng)用代理的。
解決這一問題的常見方法就是使用上下文對象AopContext,示例代碼如代碼清單3-25所示。
代碼清單3-25 AopContext使用代碼示例
public class ServiceImpl implements Service { public void performBusiness(){ //從AopContext中獲取代理對象 ((Service)AopContext.currentProxy()).handleData(); } @Transactional public void handleData() { } }
這里我們直接從AopContext中獲取代理對象。當然,上述代碼生效的前提是確保ProxyFactoryBean的exposeProxy屬性被設(shè)置為true,正如我們在3.2.3節(jié)中討論的那樣。
推薦閱讀
- Java技術(shù)手冊(原書第7版)
- 數(shù)據(jù)結(jié)構(gòu)(Java語言描述)
- oreilly精品圖書:軟件開發(fā)者路線圖叢書(共8冊)
- Raspberry Pi 2 Server Essentials
- Android 應(yīng)用案例開發(fā)大全(第3版)
- Rust Essentials(Second Edition)
- 青少年P(guān)ython編程入門
- Python機器學習:預測分析核心算法
- Scala編程實戰(zhàn)
- Docker:容器與容器云(第2版)
- Greenplum構(gòu)建實時數(shù)據(jù)倉庫實踐
- 深度學習入門:基于Python的理論與實現(xiàn)
- Web前端測試與集成:Jasmine/Selenium/Protractor/Jenkins的最佳實踐
- 和孩子一起學編程:用Scratch玩Minecraft我的世界
- INSTANT EaselJS Starter