Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/339.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么SpringAOP不适用于另一个方法中的方法调用?_Java_Spring Aop - Fatal编程技术网

Java 为什么SpringAOP不适用于另一个方法中的方法调用?

Java 为什么SpringAOP不适用于另一个方法中的方法调用?,java,spring-aop,Java,Spring Aop,为什么SpringAOP不适用于另一个方法中的方法调用 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("Su

为什么SpringAOP不适用于另一个方法中的方法调用

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));
    }

}
有人能解释一下如何做到这一点吗?

例如,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);
}
该方法直接在实例上调用,而不是在代理上调用。因此,无法应用任何建议