2

私は次のようなビジネスクラスを持っています:

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>

それは最終的に動作します

4

1 に答える 1

0

動的プロキシを試してください。動作するはずです。簡単ではありませんが、これが必要だと思います。

詳細: AOP を使用して引数のスーパーでメソッド呼び出しをインターセプトする方法は?

于 2015-10-25T05:40:46.750 に答える