官术网_书友最值得收藏!

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é)中討論的那樣。

主站蜘蛛池模板: 克拉玛依市| 乌鲁木齐市| 涟源市| 伽师县| 乌兰察布市| 平阳县| 罗田县| 府谷县| 大姚县| 石狮市| 许昌县| 科尔| 日土县| 盐亭县| 潼关县| 阜南县| 出国| 大冶市| 墨脱县| 益阳市| 西乡县| 垣曲县| 石城县| 武平县| 波密县| 甘谷县| 六安市| 龙游县| 广丰县| 达拉特旗| 龙海市| 和顺县| 封开县| 信阳市| 博湖县| 惠水县| 鄱阳县| 双江| 抚州市| 开阳县| 林芝县|