2016-05-25 15 views
2

@Beforeアドバイスを使用してインプレースポイントカット式で単純なSpring AOP(v4)の例を実装しようとしていますが、アスペクトメソッドが呼び出されません。私は必要なすべての依存関係を持っています(spring-aop、aopalliance、aspectweaver)。私は間違って何をしていますか?Spring AOP - @実行前に

package com.xyz; 

public class TestClass { 
    @PostConstruct 
    public void init() { 
     test(); 
    } 
    public void test() { 
     ... 
    } 
} 

態様:

+0

Spring Autoプロキシを有効にしましたか? 'TestClass'のインスタンスをどうやって作りましたか? –

+0

'TestClass'は私のアプリケーションコンテキストで定義されたBeanです。アプリケーションの起動時にライフサイクル全体にわたって実行されますが、ポイントカットは決してヒットしません。私はアプリケーションのコンテキストで ''も持っています。他に必要なものは何ですか? – user1491636

答えて

0
@Aspect 
@Component 
public class MyAspect{ 
    @Before("execution(* com.xyz.TestClass.test())") 
    public void beforeTest() { 
     ...  
    } 
} 

AOPはTestClass.test()春コンテキスト内で呼び出されていないためである実行が、TestClass.init()から簡単/無地呼び出しを有していない理由。 TestClass.test()呼び出しは、スプリングによって管理されるように

package com.xyz; 

public class TestClass { 

    public void test() { 
    ... 
    } 
} 

AnotherTestClassを言う別のクラスにTestClassを注入し、

package com.xyz; 

public class AnotherTestClass { 

    @Autowired 
    private TestClass testClass; 

    public void anotherTest() { 
    testClass.test(); 
    } 
} 
そこから testメソッドを呼び出し、あなたのセットアップは以下のようなものにそれを修正するテストするには
+0

私の例では、 'TestClass'はスプリングマネージドBeanです。それは私のアプリケーションコンテキストを定義しています。十分ではありませんか? – user1491636

+0

いいえ、 'TestClass.test()'が傍受されるという私の答えで述べたように、_another bean_経由で呼び出されるべきです。同じBean内のプレーンな呼び出しは、登録されたアスペクトでは起動しません。 –

+0

Java Bond、別のオプションはありますか? 'TestClass'はautowiredできません。私はそれを 'AnotherTestClass'(アプリケーションコンテキストで定義された別のbean)のコンストラクタを通して設定されるBean(アプリケーションコンテキストで定義されたもの)にすることができます。そのセットアップで動作させる方法はありますか?ありがとう! – user1491636

関連する問題