18

メソッド実行統計のロギングに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メソッドを除外するための私のカスタム注釈です。

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

4

2 に答える 2

28

わかりましたので、解決策を見つけました@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 ) にあります。

于 2016-08-10T06:45:38.067 に答える
4

Spring AOPのドキュメントによると

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

ですから、これは試行錯誤の練習だと思います。&& !@within@within が型に適用されるようなものを試すことができると思います。または、試すことができます!@target

しかし、それはまた難しいかもしれないと思います。

別のアプローチ: 2 つのポイントカット定義を宣言し、それらを結合します。例については、こちらのドキュメント ページをご覧ください。私はこれを最初に試します。何かのようなもの

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

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

于 2016-08-08T11:34:18.880 に答える