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 :

[Spring 2.5][AOP][XML] Configuration d'un Logger [Framework]


Sujet :

Spring Java

  1. #1
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut [Spring 2.5][AOP][XML] Configuration d'un Logger
    Bonjour,

    J'essaie d'utiliser les fonctionnalités de Spring (version 2.5) permettant la programmation par aspects mais quelque chose semble m'échapper. J'arrive parfaitement à faire des aspects avec l'API AspectJ mais je n'arrive pas à utiliser les aspects configuré via XML.

    J'ai essayé ici de faire un exemple simple dont le but est de logger la fonction doIt.

    Jars dans mon projet :
    - spring.jar
    - commons-loggings.jar
    - aspectjweaver.jar

    Mon unique classe :
    - doIt : la fonction a loggué.
    - log : l'aspect qui sera utilisé pour loggé ma fonction doIt.
    - main : permet d'initialiser spring et de lancer la fonction doIt.

    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
     
    public class Logger {
    	public void doIt() {
    		System.out.println("DoIt");
    	}
     
    	public void log() {
    		System.out.println("Log!");
    	}
     
    	public static void main(String args[]) {
    		ClassPathResource resource = new ClassPathResource("applicationContext.xml");
    		XmlBeanFactory factory = new XmlBeanFactory(resource);
    		Logger logger = (Logger)factory.getBean("logger");
    		logger.doIt();
    	}
    }
    Mon fichier de configuration :
    - logger : le bean référençant mon unique classe.
    - pointcut pour la fonction doIt.
    - before aspect utilisant la fonction log de mon unique classe Logger.

    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
     
    <?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/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
     
    	<bean id="logger" class="Logger"/>
    	<aop:config>
    		<aop:pointcut id="doItOperation" expression="execution(* doIt(..))"/>
    		<aop:aspect ref="logger">
    			<aop:before pointcut-ref="doItOperation" method="log"/>
    		</aop:aspect>
    	</aop:config>
    </beans>
    Merci.

  2. #2
    Membre confirmé

    Inscrit en
    Avril 2005
    Messages
    317
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 317
    Points : 553
    Points
    553
    Par défaut
    Que ce passe-t-il à l'éxécution ?
    As-tu un message d'erreur ?
    <aop:pointcut id="doItOperation" expression="execution(* doIt(..))"/>
    J'ai l'impression que ton expression régulière n'est pas bonne.
    Ce serait pas plutot <aop:pointcut id="doItOperation" expression="execution(* Logger.doIt(..))"/>

  3. #3
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Merci de ta réponse.

    J'obtiens simplement le message de chargement de beans de Spring et mon DoIt:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    DoIt
    2 déc. 2007 19:51:55 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
    J'ai essayé de changer mon pointcut mais rien n'y fait. D'ailleurs le pointcut ne semble pas en cause car il marche avec AspectJ et le code suivant :
    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
     
    @Aspect
    public class Logger {
    	public void doIt() {
    		System.out.println("DoIt");
    	}
     
    	@Pointcut("execution(* doIt(..))")
    	public void cutdoIt() {}
     
    	@Before("cutdoIt()")
    	public void log() {
    		System.out.println("Log!");
    	}
     
    	public static void main(String args[]) {
    		ClassPathResource resource = new ClassPathResource("applicationContext.xml");
    		XmlBeanFactory factory = new XmlBeanFactory(resource);
    		Logger logger = (Logger)factory.getBean("logger");
    		logger.doIt();
    	}
    }
    Cela est plutôt ennuyeux car j'essaie de me servir des aspects de Spring basé en XML pour gérer mes transactions pour l'accès à mes données.

    Merci.

  4. #4
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    J'ai trouvé mon problème. Il fallait utiliser ApplicationContext aulieu de XmlBeanFactory comme fabrique pour les classes. Voici la solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public static void main(String args[]) {
        ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
        Logger logger = (Logger)context.getBean("logger");
        logger.doIt();
    }

  5. #5
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    Bonjour,

    Je me suis basé sur les post précédents afin d'utiliser la programmation par aspect qu'offre spring.
    Voici les versions des jar utilisés :
    spring-2.5.5.jar
    aspectjweaver-1.6.jar

    Le problème que je rencontre est que l'aspect configuré est bien chargé, mais qu'il n'est pas utilisé. Voici la log :
    30 juil. 2008 10:20:51 org.springframework.context.support.AbstractApplicationContext prepareRefresh
    INFO: Refreshing org.springframework.context.support.ClassPathXmlApplicationContext@4a63d8: display name [org.springframework.context.support.ClassPathXmlApplicationContext@4a63d8]; startup date [Wed Jul 30 10:20:51 CEST 2008]; root of context hierarchy
    30 juil. 2008 10:20:51 org.springframework.beans.factory.xml.XmlBeanDefinitionReader loadBeanDefinitions
    INFO: Loading XML bean definitions from class path resource [applicationContext.xml]
    30 juil. 2008 10:20:51 org.springframework.context.support.AbstractApplicationContext obtainFreshBeanFactory
    INFO: Bean factory for application context [org.springframework.context.support.ClassPathXmlApplicationContext@4a63d8]: org.springframework.beans.factory.support.DefaultListableBeanFactory@1742700
    30 juil. 2008 10:20:52 org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
    INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory@1742700: defining beans [logger,org.springframework.aop.config.internalAutoProxyCreator,doItOperation,org.springframework.aop.aspectj.AspectJPointcutAdvisor#0]; root of factory hierarchy
    DoIt
    Est-ce que quelqu'un a une idée d'où peut venir le problème ?

    merci d'avance !
    The path of excess
    leads to the tower of wisdom.
    (Enigma)

  6. #6
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Bonjour,

    Tu as utilisé quelle version de mon programme ? Celui avec les annotations ou celui avec la configuration dans le fichier XML ?

    Celui avec les annotations utilise @AspectJ, il y a donc une phase de compilation supplémentaire. Avec Eclipse, il suffit d'installer AJDT.

    Si tu utilises la configuration XML, il ne devrait pas y avoir de problème. Si c'est le cas, montre moi ton programme de test.

  7. #7
    Membre habitué
    Inscrit en
    Avril 2004
    Messages
    170
    Détails du profil
    Informations forums :
    Inscription : Avril 2004
    Messages : 170
    Points : 174
    Points
    174
    Par défaut
    J'ai utilisé la configuration via le fichier xml.
    applicationContext.xml :
    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
     
    <?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/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
     
     
     
    	<bean id="logger" class="monPackage.Logger"/>
    	<aop:config>
    		<aop:pointcut id="doItOperation" expression="execution(* doIt*(..))"/>
    		<aop:aspect ref="logger">
    			<aop:before pointcut-ref="doItOperation" method="log"/>
    		</aop:aspect>
    	</aop:config>
    </beans>
    La classe logger est identique à celle de ton post :
    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
     
    public class Logger {
    	public void doIt() {
    		System.out.println("DoIt");
    	}
     
    	public void log() {
    		System.out.println("Log!");
    	}
     
    	public static void main(String args[]) {
    		ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});
    	    Logger logger = (Logger)context.getBean("logger");
    	    logger.doIt();
    	}
    }
    Ai-je raté qqch ?
    The path of excess
    leads to the tower of wisdom.
    (Enigma)

  8. #8
    Membre averti
    Profil pro
    Développeur Java
    Inscrit en
    Novembre 2007
    Messages
    301
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2007
    Messages : 301
    Points : 368
    Points
    368
    Par défaut
    Je n'ai pas trouvé de problème par contre j'ai trouvé une solution pour le contourner.

    Note : Il semblerait qu'il est impossible d'appliquer sur une classe contenant des aspects un aspect (ici c'est le cas, la méthode log s'applique à la méthode doIt). Peut être pour éviter un problème de boucle.

    Voici donc mon code qui marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class TestLog {
    	public void doIt() {
    		System.out.println("doIt");
    	}
     
    	public static void main(String[] args) {
    		ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"classpath:applicationContext.xml"});
    		TestLog testLog = (TestLog)context.getBean("logged");
    		testLog.doIt();
    	}
    }
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    public class Logger {	
    	public void log() {
    		System.out.println("Log!");
    	}
    }
    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
    <?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/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
        http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd">
     
    	<bean id="logger" class="Logger"/>
     
    	<bean id="logged" class="TestLog"/>
     
    	<aop:config>
    		<aop:pointcut id="doItOperation" expression="execution(* *.doIt(..))"/>
    		<aop:aspect ref="logger">
    			<aop:before pointcut-ref="doItOperation" method="log"/>
    		</aop:aspect>
    	</aop:config>
    </beans>

  9. #9
    Nouveau Candidat au Club
    Inscrit en
    Juin 2005
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 1
    Points : 1
    Points
    1
    Par défaut
    Bonjour,

    je rebondis sur la discussion pour poser une petite question.

    En fait, dans le cadre d'une configuration "Schema-based AOP support
    If" (comme indiqué au chapitre 6.3 de la doc de référence Spring), je ne comprends pas pourquoi il est nécessaire d'avoir le jar "aspectjweaver.jar".

    Je pensais que cette configuration pour l'AOP permettait d'être indépendante de l'implémentation AspctJ. Est-ce que quelque-chose m'aurait échappé ?

    En tout cas, merci pour votre support, le forum est riche d'aide pour ceux qui utilisent Spring.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 27/04/2010, 21h43
  2. [Data] [débutante][spring][ibatis] Error parsing XML
    Par stardust dans le forum Spring
    Réponses: 4
    Dernier message: 12/12/2006, 17h58
  3. Réponses: 1
    Dernier message: 31/10/2006, 16h50
  4. [XML] Configurer la couleur d'un edittext
    Par Turlututuchapopointu dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 01/03/2006, 10h45

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