衆所周知,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;
}
}