spring Aop嵌套調用的解決辦法

衆所周知,Spring AOP在同一個類裏自身方法相互調用時是無法攔截的。

問題示例代碼

    public String say(String a) {
        System.out.println("say a=" + a);
        say2(a);
        return a + a;
    }

    public String say2(String a) {
        System.out.println("say2 a=" + a);
        return a + a;
    }

兩個方法經過AOP代理,執行時都實現系統日誌記錄。單獨使用say2時,沒有任何問題。但say就有問題了。say裏調用的say2方法是原始的,未經過AOP增強的。

spring Aop嵌套調用的解決辦法

方法1,將自身注入到自身
示例代碼

package com.subject.spring;

import org.springframework.aop.framework.AopContext;
import org.springframework.aop.framework.AopProxy;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class OneBean {
    @Resource
    private OneBean oneBean;

    public OneBean() {
        System.out.println("構造器OneBean加載..." + this);
    }

    public String say(String a) {
        System.out.println("say a=" + a);
        //say2(a);
        oneBean.say2(a);
//        ((OneBean)AopContext.currentProxy()).say2(a) ;
        return a + a;
    }

    public String say2(String a) {
        System.out.println("say2 a=" + a);
        return a + a;
    }
}

方法2,使用AopContext.currentProxy())來操作

package com.subject.spring;

import org.springframework.aop.framework.AopContext;
import org.springframework.aop.framework.AopProxy;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;

@Service
public class OneBean {


    public OneBean() {
        System.out.println("構造器OneBean加載..." + this);
    }

    public String say(String a) {
        System.out.println("say a=" + a);
        //say2(a);
        ((OneBean)AopContext.currentProxy()).say2(a) ;
        return a + a;
    }

    public String say2(String a) {
        System.out.println("say2 a=" + a);
        return a + a;
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章