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 :

Advice sur @Autowired


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Architecte senior Java EE/Spring - ScrumMaster
    Inscrit en
    Juin 2010
    Messages
    229
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France

    Informations professionnelles :
    Activité : Architecte senior Java EE/Spring - ScrumMaster
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2010
    Messages : 229
    Par défaut Advice sur @Autowired
    Bonjour à tous,

    Je veux tisser un aspect sur l'annotation @Autowired pour détecter les échecs de résolution des beans, dans le cadre d'un portage depuis un environnement Carbon.
    L'idée, c'est d'injecter dans les composants convertis en Spring des compsoants Carbon avec l'annotation Spring. Comme ça, au fur et à mesure des protages, je n'aurai pas à revenir sur ces injections.


    Ma première idée a été de tisser un aspect NoSuchBeanException (throwing) sur @Autowired ; mais je ne suis pas parvenu à tisser sur une annotation ; et puis au moment de l'exception, le mal est fait : impossible de bloquer l'exception a priori.

    Du coup, j'ai fait ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    	<aop:aspectj-autoproxy />
    	<bean id="carbonAutowiredAdvice" class="com.egencia.carbon.components.CarbonAutowiredAdvice" />
    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
     
    @Aspect
    public class CarbonAutowiredAdvice {
        private static final Log LOG = LogFactory.getLog(CarbonAutowiredAdvice.class);
     
        @Around("execution(* org.springframework.beans.factory.support.DefaultListableBeanFactory.resolveDependency(..)) " +
                "&& args(descriptor,beanName)")
        public Object carbonAutowired(ProceedingJoinPoint invocation,
                                      DependencyDescriptor descriptor, String beanName)
        		throws Throwable {
        	Object result = null;
        	try {
    			result = invocation.proceed();
    		} catch (NoSuchBeanDefinitionException se) {
    			LOG.info("////////// attempt to inject Carbon component...");
    			try {
    		    	// retrouver l'interface visée
    				Class c = Class.forName(beanName);
    				assert c.isInterface();
    		    	// chercher le champ DEFAULT_COMPONENT_PATH
    				Field f = c.getField("DEFAULT_COMPONENT_PATH");
    				String componentPath = (String) f.get(null);	//FIXME ok champs static ?
     
    				// retrouver le composant dans Carbon
    				result = Lookup.getInstance().fetchComponent(componentPath);
    			} catch (Exception ce) {
    				LOG.debug(ce);
    				throw se;	// en cas d'échec, on se fait oublier
    			}
    		}
    		return result;
    	}
    }

    Mais rien ne se passe. J'ai l'impression que le tissage n'est implémenté qu'après l'instanciation des beans, non ?
    Si quelqu'un voit une erreur dans le raisonnement ou le code, a une autre idée... je suis preneur parce que là : je vais baisser les bras ;-)
    Merci d'avance.

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Décembre 2003
    Messages
    476
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2003
    Messages : 476
    Par défaut
    Sujet intéressant

    Mais j'ai plus d'interrogations que de réponses

    De mon expérience, les poincuts de Spring AOP fonctionne uniquement sur des beans gérées par Spring.
    Aussi, tu es sûr que DefaultListableBeanFactory est un bean Spring ?
    Si ne n'est pas le cas, tout s'explique

    Sinon, désolé, mais je n'ai pas vraiment de solutions connues à ton problème.
    Je ne connais pas assez les hooks que Spring permet pour créer nos beans.

    Par contre, je trouve ta façon de procéder audacieuse (de l'aop pour résoudre un failover du chargement d'un bean Spring) mais ca reste très couplée à l'implémentation interne de comment Spring se débrouille pour charger ta dépendance.
    Et pour cette raison, même si tu réussis ton coup, mettre à jour ta version de Spring (même pour une révision mineure) pourrait devenir une source d'erreurs assez dure à corriger...

    Bon courage

Discussions similaires

  1. [Framework] [Spring annotation] @Autowired sur prop hérité
    Par obiflo dans le forum Spring
    Réponses: 2
    Dernier message: 11/03/2011, 08h41
  2. Réponses: 1
    Dernier message: 04/11/2009, 15h33
  3. Réponses: 1
    Dernier message: 29/02/2008, 11h07
  4. expressions regulieres sur advice
    Par austin P. dans le forum Spring
    Réponses: 2
    Dernier message: 17/07/2007, 18h07
  5. [Kylix] Kylix embarqué sur PDA ?
    Par Anonymous dans le forum NoSQL
    Réponses: 10
    Dernier message: 29/11/2002, 13h59

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