私は次のようなビジネスクラスを持っています:
class A {
public void sayHello(String name){
System.out.println("hello "+name);
}
public void openDoorForJack(){
System.out.println("door opened");
this.sayHello("Jack");
}
}
アスペクトクラスは次のとおりです。
@Aspect
class Aspect {
@Pointcut("execution (* com..*.sayHello(String)) && args(name)")
public void beforeSayHelloPointCut(String name) {}
@Before("beforeSayHelloPointCut(name)")
public void beforeSayHello(String name) throws Throwable {
System.out.println(name+" is knocking");
}
}
春にこれらすべての Bean を構成した後、LTW を使用してオンにします
<aop:aspectj-autoproxy/>
<context:load-time-weaver aspectj-weaving="on" weaver-class="org.springframework.instrument.classloading.InstrumentationLoadTimeWeaver"/>
もちろん、aspectjrt、aspectj-weaver、spring-instrument は配置されています。-javaagent:path/spring-instrument.jar は VM オプションに渡され、aop.xml は META-INF の下にあります。
<!DOCTYPE aspectj PUBLIC
"-//AspectJ//DTD//EN" "http://www.eclipse.org/aspectj/dtd/aspectj.dtd">
<aspectj>
<weaver>
<!-- only weave classes in specific packages -->
<include within="*"/>
</weaver>
<aspects>
<!-- weave in just this aspect -->
<aspect name="com.Aspect"/>
</aspects>
</aspectj>
次のようなテストを実行すると:
applicationContext.getBean(A.class).sayHello("Jack");
結果は完璧に見える
Jack is knocking
Hello Jack
しかし、内部で sayHello を呼び出すテストを実行すると、
applicationContext.getBean(A.class).openDoorForJack();
インターセプトはまったく発生しません
door opened
Hello Jack
私がLTWを使用する理由は、「this」または「super」を使用したメソッド呼び出しも傍受できるようにしたいからですが、そうしなかったようです。誰かが問題を指摘するのを手伝ってくれますか?私が見逃したものはありますか?
- - - - - - - - - - - - - - 編集 - - - - - - - - - - - ------------
いくつかのデバッグの後、どこが間違っているかを発見しました
実際には、パッケージcom.bussiness
の下に「クラス A」があり、パッケージcom.aspect
の下
に「クラス Aspect」があります
。 xmlのようにフォローする
<weaver>
<!-- only weave classes in specific packages -->
<include within="com.aspect.*"/>
</weaver>
これは正しくありません。次のように変更した後、織り込む必要があるクラスを含むパッケージである必要があります。
<weaver>
<!-- com package and its sub package all get woven-->
<include within="com..*"/>
</weaver>
それは最終的に動作します