您的位置:首页 > 编程语言 > Java开发

spring Aop嵌套调用的解决办法

2018-03-05 14:52 841 查看
众所周知,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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  spring aop