スプリングフレームワークを使用する場合、最も使用される機能はスプリングインターセプターです。一般に、トランザクションアノテーション@Transactionalなど、アノテーションを使用してインターセプトを使用します。ただし、クラス内のメソッド呼び出しの場合、インターセプターは無効です。
具体的な例は次のとおりです。
package com.juying.test
public class TestAop {
public void test1() {
test2();
test3();
}
public void test2() {
System.out.println("test2");
}
public void test3() {
System.out.println("test3");
}
}
インターセプター
@Aspect
public class TheAspect {
@Before("execution(* com.juying.test.TestAop.*(..))")
public void checkData() {
System.out.println("checkData");
}
}
TestAopクラスのtest1メソッドを実行すると、checkDataが1回だけ出力されます。
理由:インターセプターは動的プロキシーによって実現されます。動的プロキシーは、新しいプロキシー・クラスを生成することです。すべての情報(クラス名、パッケージ名)が変更されたため、インターセプトできません
public class TestAopXxxxx+地址 {
public void test1() {
test2();
test3();
}
public void test2() {
System.out.println("test2");
}
public void test3() {
System.out.println("test3");
}
}
解決策:
1.他のクラスにインターセプトする必要のあるメソッドを移行します
2.これを使用する代わりに、@ Autowiredインジェクションを呼び出します