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 :

Bean factory on the fly


Sujet :

Spring Java

  1. #1
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut Bean factory on the fly
    Bonjour à tous !

    Je me casse les dents sur Spring, donc je viens demander aux experts ...

    J'ai besoin de générer des beans à la volée, mais que ceux-ci soient "springés" ...

    La finalité est que j'ai besoin de faire de l'AOP sur les proxys qui seront générés.

    Pourquoi ? Une explication !

    Je dois gérer les traductions d'une appli web. Pour simplifier et utiliser les mécanismes standards Spring & Co, je veux éviter d'injecter un objet dans tous mes objects à moi (car tous ne sont pas gérés spring).

    Aussi, je veux simplement faire un Helper accessible grâce à des méthodes "static" qui me rends mes objets paramétrés. Ensuite, quand j'invoque une méthode de ces objets "translate()" par exemple, HOP l'aop fait le job.

    J'ai fait un "Builder" sur mes objets pour simplifier, et j'ai aussi déjà mes méthodes "static" via mon Helper.

    Je n'arrive juste pas a faire générer par Spring mes objets ...

    Je peux mettre du code ou autre si besoin sans soucis.

    Merci à vous par avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    <context:spring-configured />
    ou
    @EnableSpringConfigured
    et
    (il faut spring-aspects.jar, et au choix : compile- ou load-time weaving)

    http://www.springindepth.com/2.5.x/0.10/ch06s03.html


    Ou avec AspectJ, mais avec un .aj pas un .java avec @Aspect...

  3. #3
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    +1 @Configurable est la voie à utiliser. Attention que tu ne peux annoter que des beans prototype avec @Configurable:


    Code xml : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    <context:spring-configured />
    <bean class="com.TaClasse"/>

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    @Configurable
    public class TaClasse {
      @AutoWired
      TaProp taProp;
      //....
    }

    Et l'utilisation:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TaClasse tc = new TaClasse();
    tc.uneMethode();
    tc.uneAutreMethode();

  4. #4
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Merci à vous, j'ai bien galéré quelques jours, j'ai finalement trouvé une solution, mais avec 50% de ce que je voulais faire ...

    J'ai réussi à faire ma factory.

    J'ai déclaré mon bean "prototype" dans mon context et via une interface. Ensuite applicationContext.getBean() me génère mes instances springées.

    Par contre j'ai changé mon AspectJ autonome par in Spring AOP with AspectJ ...

    C'est là que j'ai bloqué malgré les tutos ... Mon aspect est détecté et chargé par Spring, mais ne trigger jamais ... Malgré le fait que les beans soient Springés et aient une interface et donc des méthodes publiques.

    J'ai réussi en jouant avec les priorités de chargement des beans et les contextes.

    Je suis débloqué, et mes collègues aussi du coup ...

    Mais j'espère bien faire marcher cet AOP ... Mais je ne sais pas comment faire ...

  5. #5
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Tu fais du compile time woving ou du runtime woving pour tes aspets?

  6. #6
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Ha oui pardon, c'est du LTW ...

    En compile c'est mieux ou plus simple ?

  7. #7
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    En compile time ça nécessite une étape de compilation supplémentaire, mais à l'exécution c'est plus simple.

    Puisque tu fais du LTW, tu peux nous expliquer ce que tu as comme architecture? Conteneur web? Application autonome? Personnellement, je préfère le Compile time dans le cas d'un conteneur web, car le load time nécessite que le conteneur web / J2EE te fournisse un classloader supportant ce genre de feature. Ou alors de démarrer le conteneur avec l'agent préchargé, ce qui est plus lourd. N'hésite pas à poster non plus tes logs. Quand l'agent aop démarre il affich des messages, quand il a des soucis, aussi.

  8. #8
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Alors j'avais essayé le "compile", mais j'avais des soucis de mise en place avec mon IDE et maven (j'utilise d'autres outils comme Lombok qui font déjà ça tout seul)

    Niveau archi, j'ai 2 serveurs, un BO java et un FO GWT. Les 2 communiquent en WebService/RMI/Hessian selon les cas ...

    Dans mon cas, c'est la partie FO qui m'intéresse et que je voulais utiliser avec de l'AOP.

    Mon but étant de faire de l'internationalisation lors de la génération des vues par GWT (ou Vaadin ici exactement).

    Je ne voulais pas injecter ou utiliser des méthodes statiques de traduction car dans certains cas, les clés de trad sont auto générées ...

    J'ai donc créé un object (ici I18nKey) qui respecte une convention INTERNE de structure et qui ensuite me permets de générer mes IHMs (formulaires, tableaux, etc ...)
    Un de ces objet 'I18nKey' me permets de générer plusieurs spécialisations liées à mon besoin (label, texte si vide, texte si erreur, texte raccourci, etc ...) donc véhiculer cet objet est plus important que juste la String à traduire.

    A la base j'utilisait donc l'AOP pour trapper les GETTERS des objets du framework GWT (VAADIN) et donc traduire à la volée sans efforts.

    Mais je me suis heurté à des problèmes :
    - Tous les objets n'ont pas les getters
    - Certains accèdent directement à la propriété
    - Certaines classes utilisent des STATIC PRIVATE FINAL inner classes ...
    - Pas réussi à utiliser AspectJ sur des enums implémentant une interface spécifique

    Donc je me suis dit que pour palier, j'alais utiliser l'AOP sur mon objet i18nKey, car il à une méthode"build()" qui renvoie la clé ... Donc la traduire à ce moment ...

    C'est là qu'il fallait un objet SPRINGABLE et le début de mon message sur ce forum ... Car AspectJ autonome passait sur les objets AVANT que le contexte Spring soit initialisé complètement.

    J'ai tout passé en Spring aspects (AOP with aspectj), mais dans les logs j'avais juste comme quoi mon Weaver était détecté ... Mais jamais il n'était exécuté (pourtant il marchait en aspectj pur) ...
    Besoin de débloquer, donc j'ai cherché quelques jours, puis essayé autre solution ...

    Pour le moment, j'ai réussi sans avec de l'héritage et des confs spring ... Ca fonctionne mais je n'aime pas rester sur un échec, et je sais que l'AOP me sera utile !

    Voilà ...

  9. #9
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    GWT c'est transformé en javascript, il n'y a plus de Spring à ce niveau là et encore moins d'AOP. Si tu veux du IOC dans GWT, il faut t'orienter vers des solution comme GIN. Spring ne s'occupe que du coté serveur, il n'y a rien dans la partie javascript. Je suis même étonné que GWT n'aie par ralé lors de la compilation sur ces annotations inconnues.

  10. #10
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Je rajoute ceci:

    - Tous les objets n'ont pas les getters
    - Certains accèdent directement à la propriété
    L'AOP s'en fou, ici il interviens directement à la sortie du new. C'est l'équivalent de faire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    X x = new X();
    contexteSpring.configureBean(x);
    return x;
    - Certaines classes utilisent des STATIC PRIVATE FINAL inner classes ...


    une instance statique finale ne pourra pas être injectée, car elle a toutes les chances d'être créée avant même que spring n'aie démarré.


    - Pas réussi à utiliser AspectJ sur des enums implémentant une interface spécifique
    un enum n'a pas de constructeur public, même Spring ne peux pas les créer. Ca n'a pas de sens de vouloir y faire de l'injection Spring.

    Car AspectJ autonome passait sur les objets AVANT que le contexte Spring soit initialisé complètement.
    Si l'aspect se déclenche avant, c'est que l'objet est créé avant que Spring ne charge, tu ne peux rien faire dans ce cas, faut revoir ton code pour que l'objet soit créé après Spring. En passant en LTW avec spring aop, t'as juste déclalé le déclenchement des pointcut, qui du coup au lieu de merder sur ces objet, ne voient plus du tout ces objet car créés trop tôts.

  11. #11
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    Faudrait voir le code de ces Aspects pour donner une réponse plus complète…

  12. #12
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Avec @Configurable, on ne code pas les aspect, on ne fait qu'activer des aspects présents dans Spring. Du coup leur code importe peu.

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Avec @Configurable, on ne code pas les aspect, on ne fait qu'activer des aspects présents dans Spring. Du coup leur code importe peu.
    Je parle des Aspects développés pour gérer l'internationalisation dont il est fait référence au début de la discussion.

  14. #14
    Membre habitué
    Homme Profil pro
    Inscrit en
    Avril 2005
    Messages
    277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38

    Informations forums :
    Inscription : Avril 2005
    Messages : 277
    Points : 143
    Points
    143
    Par défaut
    Merci pour toutes ces réponses.

    Alors niveau AOP, si cela m'est utile car mon Framework (vaadin) basé sur GWT me permets de m'affranchir du javascript, tout est en java, Back comme Front !
    Donc lorsqu'il lit les beans, intercepter pour traduire est faisable ! D'où mon idée ^^

    Ensuite pour l'aspect voici mon code :

    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
    @Aspect
    public class I18nAspect {
     
      @Autowired
      private I18N i18n;
     
      @Around("execution(public String com.accelinn.atlas.common.i18n.I18nKeyImpl.*(..))")
      public String translateI18nBuild(final ProceedingJoinPoint joinPoint) throws Throwable {
        return getString((String) joinPoint.proceed(joinPoint.getArgs()));
      }
     
      protected String getString(..........) {
        // Do the translation with i18n.get(...);
      }
     
    }
    Je vous passe les méthodes internes avec les signatures Object et Object [] ...
    J'ai essayé aussi sur l'interface, rien de plus ... Idem en ciblant seulement la méthode build();

    Voila l'objet en question

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    import static com.google.common.base.CaseFormat.LOWER_CAMEL;
    import static com.google.common.base.CaseFormat.UPPER_CAMEL;
    import static com.google.common.base.CharMatcher.JAVA_UPPER_CASE;
    import static com.google.common.base.CharMatcher.anyOf;
    import static com.google.common.base.Joiner.on;
    import static com.google.common.collect.Iterables.transform;
     
    import org.springframework.beans.factory.config.ConfigurableBeanFactory;
    import org.springframework.context.annotation.Scope;
    import org.springframework.stereotype.Component;
     
    import com.google.common.base.Converter;
    import com.google.common.base.Function;
    import com.google.common.base.Joiner;
    import com.google.common.base.Splitter;
    import com.google.common.base.Strings;
     
    @Component
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public class I18nKeyImpl
            implements I18nKey {
     
        // TODO : Implement thread safe cache
     
        public final static String NOT_FOUND_PREFIX = "!";
     
        public final static String KEY_PREFIX = "[";
        public final static String KEY_SUFFIX = "]";
        public final static String PATH_SEPARATOR = ".";
     
        private final static String SHORT_PATH = "short";
        private final static String DESC_PATH = "desc";
        private final static String EMPTY_PATH = "empty";
        private final static String ERROR_PATH = "error";
     
        private final static Converter<String, String> converter = UPPER_CAMEL.converterTo(LOWER_CAMEL);
        private final static Function<String, String> toLowerCamel = new Function<String, String>() {
            @Override
            public String apply(String input) {
                if (input == null)
                    return null;
                else if ((JAVA_UPPER_CASE.countIn(input) + anyOf("_").countIn(input)) == input.length())
                    return input;
                else
                    return converter.convert(input);
            }
        };
     
        private String path;
        private String module;
        private String object;
        private String group;
        private String property;
        private String value;
     
        public I18nKey setPath(String path) {
            this.path = path;
            return this;
        }
     
        public I18nKey setModule(String module) {
            this.module = module;
            return this;
        }
     
        public I18nKey setObject(String object) {
            this.object = object;
            return this;
        }
     
        public I18nKey setGroup(String group) {
            this.group = group;
            return this;
        }
     
        public I18nKey setProperty(String property) {
            this.property = property;
            return this;
        }
     
        public I18nKey setValue(String value) {
            this.value = value;
            return this;
        }
     
        /**
         * @return
         */
        private String getPath() {
            if (this.path != null)
                return this.path;
            else
                return on(".").skipNulls().join(this.module, this.object, this.group, this.property, this.value);
        }
     
        /**
         * Get the standard translation key.
         * 
         * @return the string to convert
         */
        public String getKey() {
            return build(null);
        }
     
        /**
         * Get the SHORT translation key.<br>
         * <br>
         * Generaly used into table headers or in minimal forms.
         * 
         * @return the string to convert
         */
        public String getShortKey() {
            return build(SHORT_PATH);
        }
     
        /**
         * Get the DESCRIPTION translation key.<br>
         * <br>
         * Generaly used to describe the thing. For example into tootips.
         * 
         * @return the string to convert
         */
        public String getDescriptionKey() {
            return build(DESC_PATH);
        }
     
        /**
         * Get the EMPTY translation key.<br>
         * <br>
         * Used to indicate how the object must be filled.
         * 
         * @return the string to convert
         */
        public String getEmptyKey() {
            return build(EMPTY_PATH);
        }
     
        /**
         * Get the ERROR translation key.<br>
         * <br>
         * Used to indicate that the value is incorrect
         * 
         * @return the string to convert
         */
        public String getErrorKey() {
            return build(ERROR_PATH);
        }
     
        /**
         * Internal method to encapsulate the key with the generic Square Brackets.
         * 
         * @param path
         * @return the string to convert
         */
        public String build(final String suffix) {
     
            String path = getPath();
            if (Strings.emptyToNull(suffix) != null)
                path += PATH_SEPARATOR + suffix;
     
            StringBuffer key = new StringBuffer(KEY_PREFIX);
            key.append(Joiner.on(PATH_SEPARATOR)
                    .join(transform(Splitter.on(PATH_SEPARATOR).split(path.toString()), toLowerCamel)));
            key.append(KEY_SUFFIX);
     
            return key.toString();
        }
     
        @Override
        public String toString() {
            return getKey();
        }
     
    }
    C'est ce code qui trigger pas avec Spring AOP ...
    Et c'est cette classe qui a besoin du I18N qui fonctionnait pas en AspectJ ...

  15. #15
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    Spring AOP fonctionne avec le proxying, en définissant le pointcut sur la classe d'implémentation, il ne matchera jamais la classe du proxy.
    Par contre le proxy implémentera les interfaces : donc définissez les méthodes à intercepter dans des interfaces et le pointcut sur l'interface.


    Et je reste sur mon idée que vous auriez eu moins de souci à faire un .aj dès le début.

  16. #16
    Expert éminent sénior
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 481
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 481
    Points : 48 806
    Points
    48 806
    Par défaut
    Ha non, mais les Autowired et configurable, c'est pour des classes java. Là t'essaie de Springer un aspect, ça va vraiment pas marcher

    Bon si je lit bien ce que tu essaie de faire:

    I18nKeyImpl fait tout sauf de la traduction, contrairement à ce que son nom indique, I18nAspect enrobe tout ça et traduit les valeurs de retour de n'importe quel méthode type String à travers I18N.get(), I18N étant un objet spring.

    Pourquoi tu ne fais pas simplement ceci?


    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
    @Component
    @Scope(value = ConfigurableBeanFactory.SCOPE_PROTOTYPE)
    public class I18nKeyImpl
            implements I18nKey {
     
        @Autowired I18N i18n;
     
        /**
         * Get the SHORT translation key.<br>
         * <br>
         * Generaly used into table headers or in minimal forms.
         * 
         * @return the string to convert
         */
        public String getShortKey() {
            return build(SHORT_PATH);
        }
     
        public String getShortValue(){
            return i18n.get(getShortKey());
        }
     
    //etc...

  17. #17
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 938
    Points : 4 359
    Points
    4 359
    Par défaut
    Citation Envoyé par tchize_ Voir le message
    Ha non, mais les Autowired et configurable, c'est pour des classes java. Là t'essaie de Springer un aspect, ça va vraiment pas marcher
    avec un .aj, il faut le déclarer comme bean en XML en utilisant factory-method :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    <bean id=... factory-method="aspectOf"/>
    et l'injection fonctionnera

    et normalement @Component sur un @Aspect doit fonctionner aussi.

Discussions similaires

  1. Réponses: 2
    Dernier message: 20/11/2008, 15h10
  2. Bean Factory renvoie null
    Par ::Fistons dans le forum Spring
    Réponses: 16
    Dernier message: 09/07/2007, 09h23
  3. [MySQL] thumbnail persistant ou on the fly?
    Par darkbob dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 14/06/2007, 16h35
  4. Réponses: 2
    Dernier message: 31/05/2007, 12h19
  5. Création d'objects "on the fly"
    Par ploxien dans le forum Langage
    Réponses: 6
    Dernier message: 09/05/2007, 09h52

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