メソッド実行統計のロギングに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
は、メソッドを除外するためのカスタムアノテーションです。
では、ポイントカット式を変更せずに、また新しいアドバイザーを追加せずに、特定のクラスをフィルターで除外するにはどうすればよいですか?
さて、解決策を見つけました-_@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
Spring AOPドキュメント による
PCDは&& 'ed、||' ed、および! (否定)も。
ですから、これは試行錯誤によるものです。 && !@within
@withinは型に適用できます。または、!@target
しかし、もう一度、それはトリッキーかもしれないと思います。
別のアプローチ:2つのポイントカット定義を宣言し、それらを組み合わせる。そして例 ここのドキュメンテーションページ 。私はこれを最初に試します。何かのようなもの
@Pointcut(executionPC() && nonAnnotatedClassesPC() && nonAnnotatedMethodsPC())
免責事項:私が言ったように、これは試行錯誤のように見えます。そして、明確な実用例はありません。