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