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?
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
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.