@AspectJ coupe transverse (pointcut) pour toutes les méthodes d'une classe spécifique d'annotation
Je veux surveiller toutes les méthodes publiques de toutes les Classes avec des annotations (dire @Moniteur) (remarque: l'Annotation est au niveau de la classe). Ce pourrait être une coupe transverse (pointcut) pour cela?
Note: je suis à l'aide de @AspectJ style Spring AOP.
- Ci-dessous on travaille à étendre. @Coupe transverse (pointcut) ("exécution(* (@org.rejeev.Moniteur *).*(..))") Mais maintenant, le conseil est en train d'être exécuté deux fois. Aucun indice?
- Un autre point est que le @Moniteur d'annotation est sur une interface et il y a une classe qui implémente. La présence d'une interface et la classe sera la cause de double de l'exécution de ces conseils?
- Vous devez accepter l'excellente réponse ci-dessous. Cela lui donne la réputation. Rares sont les gens qui peut DONC répondre à AspectJ questions.
Vous devez vous connecter pour publier un commentaire.
Vous devez combiner un type coupe transverse (pointcut) avec une méthode de coupe transverse (pointcut).
Ces pointcuts va faire le travail pour trouver toutes les méthodes publiques à l'intérieur d'une classe marquée avec un @Moniteur annotation:
Conseils de la dernière coupe transverse (pointcut) qui combine les deux premiers et vous avez terminé!
Si vous êtes intéressé, j'ai écrit un feuille de triche avec @AspectJ style ici avec un correspondant exemple de document ici.
À l'aide d'annotations, comme décrit dans la question.
Annotation:
@Monitor
Annotation sur la classe,
app/PagesController.java
:Annotation sur la méthode,
app/PagesController.java
:Annotations personnalisées,
app/Monitor.java
:Aspect de l'annotation,
app/MonitorAspect.java
:Permettre AspectJ,
servlet-context.xml
:Inclure AspectJ bibliothèques,
pom.xml
:Monitor
être un PrintempsComponent
?Component
annotation est utilisé pour dire au Printemps conteneur à appliquer inclure la classe dans le AspectJ weaver chose. Par défaut, le Printemps ne regarde queController
,Service
, et d'autres des annotations spécifiques, mais pasAspect
.@Component
annotation sur le@interface
pas leAspect
. Pourquoi est-ce nécessaire?@Component
annotation qui le rend si au Printemps le compiler avec le AspectJ Cio/DI orientée aspect du système. Je ne sais pas comment le dire autrement. docs.printemps.io/printemps/docs/3.2.x/printemps-cadre de la référence/...Quelque chose comme ça:
Notez que vous ne devez pas avoir d'autres conseils sur la même classe avant celui-ci, parce que les annotations seront perdues après l'utilisation de proxy.
Utilisation
Vous pouvez également définir la coupe transverse (pointcut) comme
execution(public * @Monitor *.*(..))
œuvres, trop.il devrait être suffisant pour marquer votre aspect de la méthode comme ceci:
ont un coup d'oeil à cette pour un guide étape par étape sur ce.
La façon la plus simple semble être :
Il va intercepter l'exécution de toutes les méthodes précisés par "@MyHandling' dans 'YourService' classe. Pour intercepter toutes les méthodes sans exception, il suffit de mettre l'annotation directement sur la classe.
Pas question de privé /public, portée ici, mais gardez à l'esprit que le printemps de l'aop ne peut pas utiliser aspect pour les appels de méthode dans la même instance (généralement privé), car il n'utilise pas la classe de proxy dans ce cas.
Nous utilisons @Autour de conseils ici, mais c'est fondamentalement la même syntaxe avec @Avant, @Après ou des conseils.
Par la voie, @MyHandling annotation doit être configuré comme ceci :
// perform actions after
ne sera jamais appelé, car nous sommes de retour la valeur de la ligne avant.Vous pouvez utiliser le Printemps PerformanceMonitoringInterceptor et d'enregistrer par programmation de l'avis à l'aide d'un beanpostprocessor.
À partir du Printemps
AnnotationTransactionAspect
: