IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Spring Java Discussion :

Comment utiliser l'advice around ? [Framework]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut Comment utiliser l'advice around ?
    Bonjour à tous,

    je suis en train de mettre en place un aspect AOP avec Spring afin de générer automatiquement des messages de log avant et après certaines méthodes. Pour cela, j'ai ajouté un aop:config dans mon fichier config.xml :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    <bean id="loggerAOP" class="test.commons.logger.LoggerAOP" />
     
    	<aop:config>
    		<aop:pointcut id="servicePointcut" expression="execution(* test.*.servicemetier.impl.*.*BS(..))" />
    		<aop:aspect id="serviceAspect" ref="loggerAOP">
    			<aop:before method="logMethodEntry" pointcut-ref="servicePointcut" />
    			<aop:after method="logMethodExit" pointcut-ref="servicePointcut" />
    			<aop:after-returning method="logMethodReturn" returning="result" pointcut-ref="servicePointcut" />
    			<aop:after-throwing method="logMethodThrow" throwing="error" pointcut-ref="servicePointcut" />
    		</aop:aspect>
    	</aop:config>
    Comment vous le constatez, je gère un advice "before" et trois advices "after" (i.e. after, after-returning et after-throwing).

    J'ai entendu dire que l'advice "around" est super et qu'il permet d'englober tout ça en une seule déclaration. Le problème c'est que je ne sais pas comment l'utiliser et j'ai beaucoup de mal à trouver des ressources sur le net à ce sujet.

    Pour vous éclairer un peu, voici ma classe LoggerAOP :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class LoggerAOP {
     
        private Log LOGGER;
     
        public void logMethodEntry(final JoinPoint jp) {
     
            this.LOGGER.info(jp.getSignature().toShortString() + " - DEBUT");
        }
     
        public void logMethodExit(final JoinPoint jp) {
     
            this.LOGGER.info(jp.getSignature().toShortString() + " - FIN");
        }
     
        public void logMethodReturn(final JoinPoint jp, final Object result) {
     
            this.LOGGER.info(jp.getSignature().toShortString() + " - Return:" + result + " - DEBUT");
     
        }
     
        public void logMethodThrow(final JoinPoint jp, final Throwable error) {
     
            this.LOGGER.error((jp.getSignature().toShortString() + " - ERROR"), error);
        }
     
    }
    Si quelqu'un pouvait m'orienter un peu, ou me transmettre un bon tuto, je sui preneur

    Merci d'avance

  2. #2
    Membre émérite Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Par défaut
    tu devrais trouver les infos qu'il te faut ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    public Object doBasicProfiling(ProceedingJoinPoint pjp) throws Throwable {
        // start stopwatch
        Object retVal = pjp.proceed(); // <- c'est l'appel de la methode cible de ton aspect
        // stop stopwatch
        return retVal;
      }

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur d'études J2EE
    Inscrit en
    Avril 2009
    Messages
    82
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Ingénieur d'études J2EE

    Informations forums :
    Inscription : Avril 2009
    Messages : 82
    Par défaut
    Merci pour la réponse, cela m'a mis sur la voie pour trouver la solution. Pour ceux que cela intéresse...

    En fait, l'advice "around" ne fonctionne pas du tout comme "before" et "after" qui ne font que se placer autour de la méthode qui s'exécute quoiqu'il arrive.

    L'advice around permet de définir une méthode "logMethodAround" (par exemple) ayant un ProceedingJoinPoint comme argument :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public Object logMethodAround(ProceedingJoinPoint pjp) throws Throwable {
     
    	MyClass.LOGGER.debug("log avant l'execution de la méthode");
     
    	Object result = pjp.proceed() // Appel de la méthode
     
    	MyClass.LOGGER.debug("log après l'execution de la méthode");
     
    	return result;
     
    }
    En fait, tout réside dans le ProceedingJoinPoint qui permet de maîtriser l'exécution de la méthode sur laquelle appliquer l'aspect AOP. Il suffit de lancer l'exécution de la méthode (via pjp.proceed()) au moment désiré et de faire ce que l'on veut avant et après, voir même catcher une exception.

    C'est génial en fait

    N.B. : il ne faut pas oublier le return, sinon ça ne marche pas.

  4. #4
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour à tous,

    Je débute l'utilisation des intercepteurs (interceptors) avec EJB3.

    - Quels sont les outils ou les framework existants permettant de mesurer le temps de réponse d'une application J2EE ?

    - Comment on configure NetBeans v6.9.1 et le serveur d'application Glassfish v3.1 pour réaliser le profiling et mesurer le temps de réponse d'une application J2EE ?

    - Comment utiliser les intercepteurs avec XML et pas avec des annotations dont le but de mesurer le temps de réponse d'une application J2EE sachant que j'utilise l'IDE NetBeans v6.9.1 et et le serveur d'application Glassfish v3.1?

    Merci.

  5. #5
    Membre émérite Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Par défaut
    merci de créer une nouveau sujet.

  6. #6
    Membre éclairé
    Inscrit en
    Mai 2009
    Messages
    392
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 392
    Par défaut
    Bonjour,

    merci de créer une nouveau sujet.
    Voici le lien de mon nouveau sujet:
    http://www.developpez.net/forums/d11...rceptors-ejb3/

    Merci de me répondre.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 4
    Dernier message: 24/02/2009, 12h06
  2. Comment utiliser un cache ?
    Par TOM-Z dans le forum XMLRAD
    Réponses: 4
    Dernier message: 14/03/2003, 09h55
  3. comment utiliser actionscript ?
    Par webs dans le forum Flash
    Réponses: 3
    Dernier message: 09/02/2003, 23h11
  4. Comment utiliser OUT ?
    Par Bouziane Abderraouf dans le forum CORBA
    Réponses: 3
    Dernier message: 20/07/2002, 09h35
  5. Réponses: 5
    Dernier message: 11/06/2002, 15h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo