web-dev-qa-db-fra.com

Spring AOP Exclude Some Classes

J'utilise Spring AspectJ pour consigner les statistiques d'exécution des méthodes, cependant, je veux exclure certaines classes et méthodes de cela sans changer l'expression de pointcut.

Pour exclure certaines méthodes, j'ai créé une annotation personnalisée que j'utilise pour filtrer. Cependant, je ne peux pas faire de même avec les cours.

Voici ma définition d'aspect -

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

NoLogging est mon annotation personnalisée pour exclure des méthodes.

Alors, comment puis-je filtrer certaines classes sans changer l'expression du point de coupe et sans ajouter de nouveaux conseillers?

16
Harshil Sharma

D'accord, j'ai trouvé la solution - utilisez @target PCD (désignateurs de point) pour filtrer les classes avec des annotations spécifiques. Dans ce cas, j'ai déjà l'annotation @NoLogging Donc je peux l'utiliser. L'expression de point de coupe mise à jour deviendra alors la suivante -

@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
}

Explication -

execution(* com.foo.bar.web.controller.*.*(..)) - toutes les méthodes de toutes les classes dans le package c.f.b.w.controller

"&& !@annotation(com.foo.bar.util.NoLogging)" - qui n'ont PAS d'annotation @NoLogging dessus

"&& !@target(com.foo.bar.util.NoLogging)" - et dont la classe n'a PAS non plus d'annotation @NoLogging.

Alors maintenant, je dois simplement ajouter l'annotation @NoLogging À n'importe quelle classe dont je veux exclure les méthodes de l'aspect.

Plus de PCD peuvent être trouvés dans la documentation Spring AOP - http://docs.spring.io/spring/docs/current/spring-framework-reference/html/aop.html#aop-pointcuts-designators

21
Harshil Sharma

Selon documentation Spring AOP

PCD peut être && 'ed, ||' ed, et! (nié) aussi.

Donc je suppose que c'est plus un exercice d'essais et d'erreurs. Je pense que vous pouvez essayer quelque chose comme && !@within @within s'applique aux types. Ou vous pouvez essayer !@target

Mais là encore, je pense que cela pourrait être délicat.

Autre approche: déclarer deux définitions de coupe et les combiner. Et par exemple, ici sur la page de documentation . J'essaierais cela en premier. Quelque chose comme

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

Avertissement: comme je l'ai dit, cela ressemble plus à des essais et erreurs. Et je n'ai pas d'exemple de travail clair.

4
Atul