为什么Spring AOP不能在另一个方法中进行方法调用?

时间:2014-02-07 10:42:22

标签: java spring-aop

为什么Spring AOP不能在另一个方法中进行方法调用?

public class TestAOPService {
    public String getSum(int val1) {
        System.out.println(val1);

        calculateSum(val1, 12);
    }

    public void calculateSum(int val1, int val2){

        System.out.println("Sum" + (val1 + val2));
    }

}

任何人都可以解释如何实现这个目标吗?

1 个答案:

答案 0 :(得分:1)

Because of how proxying works.

例如,Spring创建了一个bean,类型为TestAOPService的实例。然后它意识到它需要代理它来添加方面建议。它将采用实例的类(和接口)类型,并创建JDK代理或CGLIB代理。

代理将在执行建议之后/之前/之前包装实际实例并委托给它。

看起来像这样

Caller --> Proxy.getSum(..) --> Bean.getSum(..)

因此调用者正在代理上调用该方法,并且代理包含建议行为。但是,如果在实例的方法中调用实例的方法,它看起来就是这样

Caller --> Proxy.getSum(..) --> Bean.getSum(..) --> Bean.calculateSum(..)

在代码中,你有这个

public String getSum(int val1) {
    System.out.println(val1);

    calculateSum(val1, 12);
}

实际上是

public String getSum(int val1) {
    System.out.println(val1);

    this.calculateSum(val1, 12);
}

该方法直接在实例上调用,而不是在代理上调用。因此,无法提供任何建议。