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 :

Problème de déclaration d'un pointcut [Framework]


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut Problème de déclaration d'un pointcut
    Bonjour,

    J'ai un petit souci pour déclarer un point cut.

    J'aimerais intercepter tous appels d'une méthode plug sur les classes finissant par Module dans n'importe quel package, par exemple :

    org.jtheque.modules.TestModule.plug()
    com.xyz.abc.zui.SecondModule.plug()
    ThirdModule.plug()

    J'ai essayé toute une série de pointcut aspectj, mais j'ai pas encore réussi

    Voici quelques uns de ceux que j'ai essayé :

    @Before("execution(* ...*Module.plug())")
    @Before("execution(* ..*Module.plug())")
    @Before("execution(* *Module.plug())")
    @Before("execution(* *.*Module.plug())")
    @Before("execution(* *..*Module.plug())")

    Je suis un peu à court d'idées

    Si quelqu'un savait comment réaliser un tel pointcut, ce serait cool

  2. #2
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @Before("execution (* * ..*Module.plug(..))")
     
    ou 
     
    @Before("execution (* * ..*Module.plug())")
    Et ca ?
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  3. #3
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Non plus

  4. #4
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Heuuu c'est pas normal ca

    J'ai fait un test simple

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    package test.pack1;
     
     
    public class BlablaModule {
     
    	public void plug(){
    		System.out.println("Blabla");
     
    	}
     
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public class TotoModule {
     
    	public void plug(){
    		System.out.println("Toto");
     
    	}
    }
    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
     
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans" 
    	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    	xmlns:p="http://www.springframework.org/schema/p"
    	xmlns:context="http://www.springframework.org/schema/context"
    	xmlns:aop="http://www.springframework.org/schema/aop" 
    	xsi:schemaLocation="
    		http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd 
    		http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd 
    		http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.0.xsd">
     
    	<!-- activate aspect aop proxying (aspects classes needs to be defined in spring config, see below) -->
    	<aop:aspectj-autoproxy/>
     
    	<!-- define our logging aspect which is using aop annotations  -->
    	<bean class="aop.LoggingAspect"/>
     
    	<bean name="blabla" class="test.pack1.BlablaModule"></bean>
    	<bean name="toto" class="test.pack2.TotoModule"></bean>
     
     
    </beans>
    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
     
    package aop;
     
    import org.aspectj.lang.JoinPoint;
    import org.aspectj.lang.annotation.Aspect;
    import org.aspectj.lang.annotation.Before;
     
     
     
    @Aspect
    public class LoggingAspect {	
     
    	@Before("execution (* * ..*Module.plug())")
    	public void logWebController(JoinPoint joinPoint) {
    		System.out.println(joinPoint.getSignature().getDeclaringTypeName() + "." + joinPoint.getSignature().getName());
    	}
    }
    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
    27
    28
     
    package test;
     
    import org.springframework.context.ApplicationContext;
    import org.springframework.context.support.ClassPathXmlApplicationContext;
     
    import test.pack1.BlablaModule;
    import test.pack2.TotoModule;
     
     
    public class Main {
     
    	/**
             * @param args
             */
    	public static void main(String[] args) {
    		ApplicationContext  context = new ClassPathXmlApplicationContext("applicationContext.xml");
     
    		BlablaModule blabla = context.getBean("blabla",BlablaModule.class);
     
    		TotoModule toto = context.getBean("toto",TotoModule.class);
     
    		blabla.plug();
    		toto.plug();
     
    	}
     
    }
    et J'ai comme sortie :

    test.pack1.BlablaModule.plug
    Blabla
    test.pack2.TotoModule.plug
    Toto
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  5. #5
    Rédacteur
    Avatar de Hikage
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    1 177
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 1 177
    Par défaut
    Tu sais nous montrer la config spring etc ?
    Hikage
    SCJP / SCWCD & SCWSJD Certified / Spring Framework Certified
    [Personal Web] [CV]

    F.A.Q Spring Framework - Participez !

  6. #6
    Expert confirmé
    Avatar de Baptiste Wicht
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2005
    Messages
    7 431
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : Suisse

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2005
    Messages : 7 431
    Par défaut
    Pas de soucis :

    Mon aspect :

    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
    @Aspect
    public class ModuleLoggingAspect {
        @Pointcut("execution (* * ..*Module.plug())")
        public void modulePlug(){}
     
        @Before("modulePlug()")
        public void logBeforePlug(JoinPoint joinPoint){
            Logger.getLogger(getClass()).trace("Module " + joinPoint.getSourceLocation().getWithinType().getSimpleName() + " plug started");
        }
     
        @After("modulePlug())")
        public void logAfterPlug(JoinPoint joinPoint){
            Logger.getLogger(getClass()).trace("Module " + joinPoint.getSourceLocation().getWithinType().getSimpleName() + " plug finished");
        }
    }
    Une classe qui devrait être interceptée :

    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
    @Module(name = "primary-module-test", description = "ModuleContainer primaire de test", author = "Baptiste Wicht",
            version = "1.0", coreVersion = "2.0", jarFile = "Primary-Module-Test.jar")
    @PrimaryModule(icon = "org/jtheque/core/tests/integration/module/primary/resources/test.png")
    @ModuleDefinition(updateURL = "http://jtheque.developpez.com/public/versions/PrimaryTestModule.versions")
    public class PrimaryTestModule {
        @PrePlug
        private static void prePlug() {
            System.out.println("I'm fast here");
        }
     
        @Plug
        private static void plug() {
            System.out.println("I'm here");
        }
     
        @UnPlug
        private static void unplug() {
            System.out.println("I'm out");
        }
    }
    Le fichier qui définit le bean à intercepter :

    Code XML : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xmlns:aop="http://www.springframework.org/schema/aop"
           xsi:schemaLocation="
                http://www.springframework.org/schema/aop
                http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
                http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans.xsd">
     
        <aop:aspectj-autoproxy/>
     
        <bean id="testModule" class="org.jtheque.core.tests.integration.module.primary.PrimaryTestModule" lazy-init="false" />
     
    </beans>

    et le fichier de config de l'aspect :

    Code XML : 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
    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
           xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
           xsi:schemaLocation="
                http://www.springframework.org/schema/beans
                http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"
           default-lazy-init="true">
     
        <!-- Aspects -->
     
        <bean class="org.jtheque.core.spring.aspect.ManagerLoggingAspect"/>
     
        <bean class="org.jtheque.core.spring.aspect.ModuleLoggingAspect"/>
     
        <bean class="org.jtheque.core.spring.aspect.PhasesCounterAndLoggingAspect"/>
    </beans>

    Mon application context est une ClassPathXmlApplicationContext qui charge plusieurs fichiers XML dont les 2 cités plus haut.

    Par contre, je viens de penser maintenant que je récupère l'instance du module via un post-processeur de bean et que j'enregistre ensuite directement le bean du post-processeur dans mon application.

    Est-ce possible qu'en faisant ça j'aie l'instance réelle et non pas l'instance décorée par le proxy ?

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

Discussions similaires

  1. Inclusion de classes / problème de déclaration
    Par scal-80 dans le forum C++
    Réponses: 5
    Dernier message: 21/06/2006, 16h28
  2. Réponses: 2
    Dernier message: 27/05/2006, 12h13
  3. problème de déclaration
    Par dirty_boy dans le forum C
    Réponses: 2
    Dernier message: 16/09/2005, 11h56
  4. Réponses: 11
    Dernier message: 29/04/2005, 19h45
  5. Problème de déclaration de segment avec use32
    Par le mage tophinus dans le forum Assembleur
    Réponses: 2
    Dernier message: 10/01/2003, 10h17

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