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 :

Charger des classes externes dans un contexte Spring


Sujet :

Spring Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut Charger des classes externes dans un contexte Spring
    Bonjour,

    Voici le contexte de ma demande:
    J'ai une application sous Spring 3.0.5 exécutée dans un Tomcat. je dois pouvoir exécuter des classes externes au projets, le but étant de pouvoir facilement ajouter/retirer des classes avec simplement un redémarrage de l'appli pour prise en compte.
    Ces classes implémentent toutes une même Interface pour dynamiquement les exécuter, elles font appel à des manager de l'application.

    1/ Dans la conf du Tomcat, j'ai ajouté le path vers le répertoire contenant les classes puis ai monté ces classes dans un manager du projet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    @Autowired
    private Set<IClasseExterne> mesClassesExternes;
    Malheureusement ça ne fonctionne pas, mes classes externes n'ont pas la visibilité sur les classes de la webapp. Bilan l'interface IClasseExterne n'est pas reconnue, pas moyen d'utiliser les managers du projet.

    2/ Dans un manager de l'appli je tente loader les classes programmatiquement:

    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
     
    @PostConstruct
    public void loadClasses() throws Exception {
    ClassLoader cl = new URLClassLoader(new URL [] {new URL("file://path/dossier/des/classes/")}, this.getClass().getClassLoader());
    		ClassPathScanningCandidateComponentProvider c = new ClassPathScanningCandidateComponentProvider(true);
    		c.setResourceLoader(new DefaultResourceLoader(cl));
    		c.addIncludeFilter(new AssignableTypeFilter(IAlerteIRRule.class));
    		Set<BeanDefinition> set = c.findCandidateComponents("aa.bb.cc");
    		alerteIRRules = new HashSet<IAlerteIRRule>(); 
    		for (BeanDefinition b : set) {
    			String className = b.getBeanClassName();
    			logger.debug("Classe loadee : " + className);
    			Class<?> clazz = cl.loadClass(className);
    			IClasseExterne r = (IClasseExterne) clazz.newInstance();
    			mesClassesExternes.add(r);
    		}
      }
    Je récupère mes classes, mais les manager dans les classes externes ne sont pas monté (@Autowired). ça se comprend vu que je ne les instancie pas avec Spring, mais là je ne vois pas comment faire.

    Merci d'avance pour votre aide

  2. #2
    Membre averti
    Ingénieur développement logiciels
    Inscrit en
    Mars 2007
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Service public

    Informations forums :
    Inscription : Mars 2007
    Messages : 29
    Par défaut
    Ok, j'ai réussi à instancier mes classes dans le contexte Spring

    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
     
    @PostConstruct
    public void loadClasses() throws Exception {
    ClassLoader cl = new URLClassLoader(new URL [] {new URL("file://path/dossier/des/classes/")}, this.getClass().getClassLoader());
    		ClassPathScanningCandidateComponentProvider c = new ClassPathScanningCandidateComponentProvider(true);
    		c.setResourceLoader(new DefaultResourceLoader(cl));
    		c.addIncludeFilter(new AssignableTypeFilter(IClasseExterne.class));
    		Set<BeanDefinition> set = c.findCandidateComponents("aa.bb.cc");
    		mesClassesExternes= new HashSet<IClasseExterne>(); 
    		for (BeanDefinition b : set) {
    			String className = b.getBeanClassName();
    			logger.debug("Classe loadee : " + className);
    			Class<?> clazz = cl.loadClass(className);
    			IClasseExterne r = (IClasseExterne) clazz.newInstance();
                            // applicationContext monté par Spring dans le manager. (@autowired)
                            applicationContext.getAutowireCapableBeanFactory().autowireBean(r);
     
    			mesClassesExternes.add(r);
    		}
      }
    C'est un peu lent au démarrage, j'ai l'impression qu'il scanne d'autres dossiers, mais ça marche

    Si vous avez une meilleure approche, n'hésitez pas !

  3. #3
    Membre Expert
    Homme Profil pro
    Développeur Java/Scala
    Inscrit en
    Octobre 2007
    Messages
    1 086
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Scala

    Informations forums :
    Inscription : Octobre 2007
    Messages : 1 086
    Par défaut
    Tu peux regarder du coté de la classe ServiceLoader qui fait exactement ce que tu veux.
    http://docs.oracle.com/javase/6/docs...iceLoader.html


    En gros il faut que tu mettes tes classes externes dans un ou plusieurs jars.
    Dans ton appli principale tu créé un FactoryBean pour créer ton set.
    Ce FactoryBean appelle le ServiceLoader pour récupérer dans ton classpath toutes les implémentations dont tu as besoin.



    C'est très pratique pour réaliser une architecture de type plugin et se basant sur ce qui est disponible dans le classpath.

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

Discussions similaires

  1. [NetBeans] Inclure des package externes dans mon jar
    Par JavaEli dans le forum NetBeans
    Réponses: 4
    Dernier message: 13/03/2011, 20h34
  2. [URLClassLoader] Charger des classes dans le workspace
    Par bitbis dans le forum Eclipse Java
    Réponses: 2
    Dernier message: 29/06/2007, 14h31
  3. PHP5: charger des fichiers textes dans une base MYSQL
    Par koueletbak dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/03/2006, 11h14
  4. Réponses: 4
    Dernier message: 15/03/2006, 11h22
  5. Réponses: 16
    Dernier message: 06/11/2005, 15h37

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