2016-03-19 5 views
2

カスタム注釈の@Aroundアドバイスでアスペクトを書き込もうとしていますが、なぜ呼び出されないのかここ 私のコード:カスタム注釈のアスペクトが機能しない

@Aspect 
@Component 
public class AspectMeasureTime { 
    @Around(value = "execution(* com.beh.businesslayer..*(..)) && @annotation(measureTime)") 
    public void measureTime(ProceedingJoinPoint pjp, MeasureTime measureTime) throws Throwable { 
    /*some code*/ 
    } 
} 

@Configuration 
@ComponentScan(basePackages = {"com.beh"}) 
@EnableAspectJAutoProxy(proxyTargetClass = false) 
public class WebConfig { 
} 

package com.beh.businesslayer.businessworkflows.pagefetcher; 
public class PageFetcherWriter implements ItemWriter, StepExecutionListener { 
    @MeasureTime("timee") 
    private void printString(Object s) { 
     logger.info("entry = " + s); 
    } 
} 

package com.beh.businesslayer.businessworkflows.pagefetcher; 
@Target({ElementType.METHOD}) 
@Retention(RetentionPolicy.RUNTIME) 
public @interface MeasureTime { 
    String value(); 
} 

私はこの注釈なしメイクジョインポイントを試したことだし、それが正常に動作します。 @ annotation(com.beh.businesslayer.businessworkflows.pagefetcher.MeasureTime)を試してみると、うまくいきませんでした。なぜ、どのように見えるべきか、何か考えていますか?

+0

AspectJのコンパイル時に織っていますか?またはAspectJのロード時織りですか?または、AspectJはなく、Spring AOPのみですか? –

+0

唯一のバウンドaop – Behemoth

答えて

2

あなたは、あなたが明示的にあなたのアドバイスのポイントカット表現が良いように思わ

@Around(value = "execution(* com.beh.businesslayer..*(..)) && @annotation(measureTime) && args(measureTime)") 
public void measureTime(ProceedingJoinPoint pjp, MeasureTime measureTime) throws Throwable { 
+0

私は例外を受け取りました:java.lang.IllegalArgumentException:エラーが発生しました:: 0 multiple bindings0、BindingTypePattern(com.beh.businesslayer.businessworkflows.pagefetcher.MeasureTime、0) 1つ以上のパラメータ(同じアノテーションインタフェース)が機能しますが、とにかく機能しません。 ( – Behemoth

2

にpasssedされていることにAspectJを伝える必要があり、パラメータを渡すつもりなら、あなたは変更する必要はありませんそれ。

Spring AOPはパブリックメソッドでのみ機能しますが、private void printString(...)メソッドでは機能しません。それをpublicに変更する必要があります。

Spring AOPも任意のオブジェクトでは機能しません。Spring AOPはSpringで管理されるオブジェクト、つまりSpring Beansでのみ動作します。 PageFetcherWriterをスプリングのコンテキストに登録することによって、そのコンポーネントをスプリングのコンポーネントにする必要があります。あなたの設定と好みのユースケースに応じて、これを行う方法はたくさんあります。 @Componentまたは@Serviceと注釈を付けるのが最も一般的な方法です。マネージドBeanのインスタンスを取得するには、すでにSpring AOPインターセプタが適用されている必要があり、アスペクトが動作しているはずです。

EDITステファノCazzolaは、別の問題が見つかりました:あなたの@EnableAspectJAutoProxyに、あなたはproxyTargetClass = trueproxyTargetClass = falseを変更する必要があります。

サブクラスベース(CGLIB)プロキシは、標準のJavaインターフェースベースのプロキシに を対照として作成するかどうかを示します。デフォルトはfalseです。

+0

私はpublic修飾子で試しましたが、実際にはこのクラスの別のメソッドにアノテーションを追加しました。(ItemWriter spring-batchからの書き込み)、しかし、 "printString"メソッドを使って作業したいのですが、これはどうして起こったのでしょうか? – Behemoth

+2

は確実に100%ではありませんが、Springはプロキシインターフェイスを動作させるかもしれません。 –

+0

@Stefanoはい、それは問題になります –

関連する問題