2011-07-28 9 views
5

@Serviceでアノテーション付けされたすべてのBeanのすべてのパブリックメソッドを代行受信する最も単純なポイントカット式は何ですか?たとえば、私はそれがこのbeanの両方のパブリックメソッドに影響を与えると期待しています:サービスの任意のパブリックメソッドのAOPポイントカット式

@Service 
public MyServiceImpl implements MyService { 
    public String doThis() {...} 
    public int doThat() {...} 
    protected int doThatHelper() {...} // not wrapped 
} 

答えて

4

このdocumentationは非常に役立つはずです。

私は、すべてのパブリックメソッド用と、@Serviceで注釈付けされたすべてのクラス用の2つの個別のポイントカットを作成し、次に他の2つのポイントカット式を組み合わせた3つ目のポイントカットを作成します。

が使用する指定子れる(ポイントカット指定子サポート7.2.3.1)を見てみましょう。私はあなたがパブリックメソッドを見つけるための「実行」指示子と、あなたの注釈を見つけるための「注釈」指示子の後にいると思います。

次に、それらを結合するための()の7.2.3.2ポイントカット式の組み合わせを参照してください。

私はがありません。があります。これは主にドキュメントから取られています。

@Pointcut("execution(public * *(..))") //this should work for the public pointcut 
private void anyPublicOperation() {} 

//@Pointcut("@annotation(Service)") this might still work, but try 'within' instead 
@Pointcut("@within(Service)") //this should work for the annotation service pointcut 
private void inTrading() {} 

@Pointcut("anyPublicOperation() && inTrading()") 
private void tradingOperation() {} 
+1

これらのポイントカットはテストされていますか?私が知る限り、 '@ annotation'はジョインポイントを定義するのではなく、そのコンテキストを収集します。代わりに '@ within'を使うべきでしょうか? – Constantiner

+0

私はこれらのポイントカットをテストしていないという答えに言及しました。しかし、私は同意します。質問者はおそらくむしろ@withinを使用して目的の結果を得るでしょう。 –

+0

あなたの答えを修正する方が良いのではないでしょうか?現在のように機能しないかもしれないと思う。私は 'within'を使って質問していることをやっていますが、うまくいきますが、' @ within'を使うべきであることが分かりました。 –

関連する問題