Spring Aop入れ子呼び出し時に有効になりませんでした.


転載元:https://blog.csdn.net/hong10086/article/details/78424481
  Spring AOPは同じクラスで自分の方法で呼び合う時は止められません.例えば、Service類のdoSomethingn 1()の方法でdoSomething 2()を通じて.ステートメントは同じクラスのdoSomething 2メソッドを呼び出し、動作時にデバッグによりdoSomethingn 1アプローチの実行前後に、カスタムのaround adviceが正常に実行されていますが、doSomething 2メソッドの実行前後には希望通りにカスタマイズされたaround adviceが実行されていません.原因は一つはJDK Dynamic Proxy技術に基づいて実現したものである.第二に、CGLOIB技術に基づいて実現された.JDK Dynamic Proxyに基づいたダイナミックエージェントがSpring AOPを見に来ました.
コードは以下の通りです
public interface ICustomerService {  
    public void doSomething1();  
    public void doSomething2();  
}  
 public class CustomerServiceImpl implements ICustomerService {  
  
    public void doSomething1() {  
        System.out.println("Inside CustomerServiceImpl.doSomething1()");  
        doSomething2();  
    }  
  
    public void doSomething2() {  
        System.out.println("Inside CustomerServiceImpl.doSomething2()");  
    }  
}  
_; 下で動的生成代理類の過程をシミュレーションし、JDK Dynamic Proxyを利用すれば、このプロセスは運行時に行われます.Custoomer ServiceImpl類の対象の代理クラス:
 public class CustomerServiceProxy implements ICustomerService {  
  
    private ICustomerService customerService;  
  
    public void setCustomerService(ICustomerService customerService) {  
        this.customerService = customerService;  
    }  
  
    public void doSomething1() {  
        doBefore();  
        customerService.doSomething1();  
        doAfter();  
    }  
  
    public void doSomething2() {  
        doBefore();  
        customerService.doSomething2();  
        doAfter();  
    }  
  
    private void doBefore() {  
        //   ,           
        System.out.println("do some important things before...");  
    }  
  
    private void doAfter() {  
        //   ,            、        
        System.out.println("do some important things after...");  
    }  
}  
  Springは、実際にはコンテナ内でCustomerServiceProxyを生成し、元のCustomerServiceImplCustomerServiceProxyに設定している.doSomething1()メソッドを呼び出し、CustoomerServiceImplクラスにおけるthisキーワードは、現在のdoSomething2()クラスの例を示すthis.doSomething2()という暗黙の意味である.そのプログラムは、CustoomerServiceProxyクラスのCustomerServiceImplメソッドを実行する代わりに、CustomerServiceImplクラスのdoSomething2()方法を実行します.Spring AOPを使用する際に、IOC容器から取得したService Beanオブジェクトはすべて代理対象であり、これらのService Beanオブジェクト自体ではなく、つまり代理対象や代理対象ではない.Service類ではthisキーワードを用いて同類の他の方法を入れ子として呼び出す場合、thisキーワードが引用されるのはこのService Benオブジェクトのプロキシオブジェクトではなく、その自身であるため、Spring AOPはこれらの入れ子コールによって妨げられない方法である.
  はどうやって解けますか?参照https://blog.csdn.net/huangjinlong77/article/details/42707571