为什么Spring AOP不支持另一个方法中的方法调用? [英] Why Spring AOP is not working for method call inside another method?

查看:0
本文介绍了为什么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));
    }

}

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

推荐答案

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

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

这篇关于为什么Spring AOP不支持另一个方法中的方法调用?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆