Spring Aop入れ子呼び出し時に有効になりませんでした.
2682 ワード
転載元: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を見に来ました.
コードは以下の通りです
はどうやって解けますか?参照https://blog.csdn.net/huangjinlong77/article/details/42707571
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
を生成し、元のCustomerServiceImpl
をCustomerServiceProxy
に設定している.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