web-dev-qa-db-ja.com

Spring AOPはいくつかのクラスを除外します

メソッド実行統計のロギングにSpring AspectJを使用していますが、ポイントカット式を変更せずに、いくつかのクラスとメソッドをこれから除外したいと考えています。

特定のメソッドを除外するために、フィルターで除外するために使用するカスタムアノテーションを作成しました。ただし、クラスで同じことを行うことはできません。

これが私のアスペクト定義です-

@Around("execution(* com.foo.bar.web.controller.*.*(..)) "
            + "&& !@annotation(com.foo.bar.util.NoLogging)")
public Object log(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    // logging logic here
}

NoLoggingは、メソッドを除外するためのカスタムアノテーションです。

では、ポイントカット式を変更せずに、また新しいアドバイザーを追加せずに、特定のクラスをフィルターで除外するにはどうすればよいですか?

16
Harshil Sharma

さて、解決策を見つけました-_@target_ PCD(ポイントカット指定子)を使用して、特定の注釈を持つクラスを除外します。この場合、私はすでに_@NoLogging_アノテーションを持っているので、それを使用できます。更新されたポイントカット式は次のようになります-

_@Around("execution(* com.foo.bar.web.controller.*.*(..)) "
            + "&& !@annotation(com.foo.bar.util.NoLogging)" 
            + "&& !@target(com.foo.bar.util.NoLogging)")
public Object log(ProceedingJoinPoint proceedingJoinPoint) throws Throwable {
    // logging logic here
}
_

説明 -

execution(* com.foo.bar.web.controller.*.*(..))-_c.f.b.w.controller_パッケージのすべてのクラスのすべてのメソッド

"&& !@annotation(com.foo.bar.util.NoLogging)"-_@NoLogging_アノテーションが付いていないもの

"&& !@target(com.foo.bar.util.NoLogging)"-およびそのクラスにも_@NoLogging_アノテーションがありません。

したがって、アスペクトから除外するメソッドを持つクラスに_@NoLogging_アノテーションを追加するだけです。

より多くのPCDはSpring AOPのドキュメントにあります- http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-pointcuts-designators

21
Harshil Sharma

Spring AOPドキュメント による

PCDは&& 'ed、||' ed、および! (否定)も。

ですから、これは試行錯誤によるものです。 && !@within @withinは型に適用できます。または、!@target

しかし、もう一度、それはトリッキーかもしれないと思います。

別のアプローチ:2つのポイントカット定義を宣言し、それらを組み合わせる。そして例 ここのドキュメンテーションページ 。私はこれを最初に試します。何かのようなもの

@Pointcut(executionPC() && nonAnnotatedClassesPC() && nonAnnotatedMethodsPC())

免責事項:私が言ったように、これは試行錯誤のように見えます。そして、明確な実用例はありません。

4
Atul