Je veux surveiller toutes les méthodes publiques de toutes les classes avec une annotation spécifiée (par exemple @Monitor) (note: l'annotation est au niveau de la classe). Quel pourrait être un point de départ possible pour cela? Remarque: j'utilise le style Spring AOP de @AspectJ.
java
aop
aspectj
spring-aop
Rejeev Divakaran
la source
la source
Réponses:
Vous devez combiner un pointcut de type avec un pointcut de méthode.
Ces pointcuts feront le travail pour trouver toutes les méthodes publiques à l'intérieur d'une classe marquée d'une annotation @Monitor:
Conseil le dernier pointcut qui combine les deux premiers et vous avez terminé!
Si vous êtes intéressé, j'ai écrit une feuille de triche avec le style @AspectJ ici avec un exemple de document correspondant ici.
la source
En utilisant des annotations, comme décrit dans la question.
Annotation:
@Monitor
Annotation sur la classe,
app/PagesController.java
:Annotation sur méthode
app/PagesController.java
:Annotation personnalisée,
app/Monitor.java
:Aspect pour l' annotation,
app/MonitorAspect.java
:Activer AspectJ,
servlet-context.xml
:Inclure les bibliothèques AspectJ,
pom.xml
:la source
Monitor
doit-elle être un ressortComponent
?Component
annotation est utilisée pour indiquer au conteneur Spring d'appliquer l'inclusion de la classe dans l'objet tisserand AspectJ. Par défaut, Spring regarde seulementController
,Service
et d' autres annotations spécifiques, mais nonAspect
.@Component
annotation sur le@interface
pas leAspect
. Pourquoi est-ce nécessaire?@Component
annotation fait en sorte que Spring le compilera avec le système orienté aspect AspectJ IoC / DI. Je ne sais pas comment le dire différemment. docs.spring.io/spring/docs/3.2.x/spring-framework-reference/…Quelque chose comme ca:
Notez que vous ne devez avoir aucun autre conseil sur la même classe avant celle-ci, car les annotations seront perdues après le proxy.
la source
Utilisation
la source
il devrait suffire de marquer votre méthode d'aspect comme ceci:
jetez un œil à ceci pour un guide étape par étape à ce sujet.
la source
Vous pouvez également définir le point de coupe comme
la source
execution(public * @Monitor *.*(..))
travaux plus simples aussi.Le moyen le plus simple semble être:
Il interceptera l'exécution de toutes les méthodes spécifiquement annotées avec «@MyHandling» dans la classe «YourService». Pour intercepter toutes les méthodes sans exception, il suffit de mettre l'annotation directement sur la classe.
Peu importe la portée privée / publique ici, mais gardez à l'esprit que spring-aop ne peut pas utiliser l'aspect pour les appels de méthode dans la même instance (généralement privés), car il n'utilise pas la classe proxy dans ce cas.
Nous utilisons les conseils @Around ici, mais c'est fondamentalement la même syntaxe avec @Before, @After ou tout autre conseil.
À propos, l'annotation @MyHandling doit être configurée comme ceci:
la source
// perform actions after
ne sera jamais appelé car nous retournons la valeur dans la ligne précédente.Vous pouvez utiliser PerformanceMonitoringInterceptor de Spring et enregistrer les conseils par programme à l'aide d'un beanpostprocessor.
la source
De Spring's
AnnotationTransactionAspect
:la source