ExempleCh04_04_InjectionDependanceRetourTélécharger Programme qui montre une injection de dependance par un fichier de configuration ExempleCh04_04.pdf ExempleCh04_04.java // Programme qui montre une injection de dependance par un fichier de configuration // import java.util.*; import fr.cnam.test.*; public class ExempleCh04_04 { public static void main(String[] args) throws Exception { // Liaison directe System.out.println("CAS 1 : Avec une liaison directe"); PersonneLister plist = new PersonneLister("../carnet.txt"); List<Personne> lp = plist.chercherParNom(null); for(Personne p:lp) System.out.println(p.toString()); System.out.println("===================================================="); // Utilisation d'un fichier de configuration // System.out.println("CAS 2 : Avec injection de la classe LecteurFichierPersonne"); Injecteur injecteur = new Injecteur(); PersonneLister lister = (PersonneLister)injecteur.injecter("../config1.txt","fr.cnam.test.PersonneLister"); lp = lister.chercherParNom(null); for(Personne p:lp) System.out.println(p.toString()); System.out.println("Recherche de LAF :"); System.out.println("------------------"); lp = lister.chercherParNom("LAF"); for(Personne p:lp) System.out.println(p.toString()); System.out.println("===================================================="); // Utilisation d'un deuxieme fichier de configuration System.out.println("CAS 3: Avec injection de la classe InitPersonne"); injecteur = new Injecteur(); lister = (PersonneLister)injecteur.injecter("../config2.txt","fr.cnam.test.PersonneLister"); lp = lister.chercherParNom(null); for(Personne p:lp) System.out.println(p.toString()); System.out.println("Recherche de AAA :"); System.out.println("------------------"); lp = lister.chercherParNom("AAA"); for(Personne p:lp) System.out.println(p.toString()); // Pour démontrer que l'injection fonctionne bien pour n'importes classes System.out.println("===================================================="); injecteur = new Injecteur(); A a = (A)injecteur.injecter("../config2.txt","fr.cnam.test.A"); a.proc(); } } carnet.txt LAFONT;Pierre;45;Toulouse BALAFFE;Paul;25;Marseille DUPONT;Eric;30;Bordeaux DURAND;Jean;23;Paris LAFORGUE;Julien;43;Toulouse compil.bat mkdir bin del /f /s /q bin\*.class javac -d bin -classpath "jdom-2.0.5.jar;." ExempleCh04_04.java javac -d bin -classpath "jdom-2.0.5.jar;." fr/cnam/test/LecteurFichierPersonne.java javac -d bin -classpath "jdom-2.0.5.jar;." fr/cnam/test/InitPersonne.java javac -d bin -classpath "jdom-2.0.5.jar;." fr/cnam/test/B.java pause config1.txt fr.cnam.test.PersonneLister finder fr.cnam.test.PersonneFinder fr.cnam.test.LecteurFichierPersonne(../carnet.txt) config2.txt fr.cnam.test.PersonneLister finder fr.cnam.test.PersonneFinder fr.cnam.test.InitPersonne() fr.cnam.test.A b fr.cnam.test.I fr.cnam.test.B() fr cnam test A.java package fr.cnam.test; public class A { I b; public void setB(I b) { this.b=b; } public void proc(){ b.traitement(); } } B.java package fr.cnam.test; public class B implements I { public void traitement() { System.out.println("Traitement de b"); } } I.java package fr.cnam.test; public interface I { public void traitement(); } InitPersonne.java package fr.cnam.test; import java.util.*; public class InitPersonne implements PersonneFinder { public InitPersonne() { } public List<Personne> findAll() { ArrayList<Personne> list = new ArrayList<Personne>(); list.add(new Personne("AAAAAAA","BBBBBBBB",1,"ZZZZZZZZ")); list.add(new Personne("AZERTY","BBBBBBBB",1,"ZZZZZZZZ")); list.add(new Personne("GHJQSD","BBBBBBBB",1,"ZZZZZZZZ")); list.add(new Personne("AAAAAAA123","BBBBBBBB123",123,"ZZZZZZZZ123")); list.add(new Personne("AAAAAAA456","BBBBBBBB456",456,"ZZZZZZZZ456")); return list; } } Injecteur.java package fr.cnam.test; import fr.cnam.util.*; import java.lang.reflect.*; public class Injecteur { public Object injecter(String configuration,String nomClassCible) throws Exception { // Récupération de l'injection à réaliser dans le fichier de configuration // ------------------------------------------------------------------ Injection injection = lireInjection(configuration,nomClassCible); // Création dynamique de l'instance de la classe à injecter // ------------------------------------------------------------------ Class<?> classeAInjecter = Class.forName(injection.classeAInjecter,true, ClassLoader.getSystemClassLoader()); Class<?>[] classes = new Class<?>[injection.params.length]; int i=0; for(String a :injection.params ) classes[i++]=String.class; Constructor constrClasseAInjecter = classeAInjecter.getConstructor(classes); Object objetAInjecter = constrClasseAInjecter.newInstance((Object[])injection.params); // Création dynamique de l'instance de la classe cible // ------------------------------------------------------------------ Class<?> classeCible = Class.forName(injection.classeCible,true, ClassLoader.getSystemClassLoader()); Constructor constrClasseCible = classeCible.getConstructor(); Object objetCible = constrClasseCible.newInstance(); // Construction du setteur // ------------------------------------------------------------------ String nomMethodeSetteur = "set"+injection.nomSetteur.substring(0,1).toUpperCase()+ injection.nomSetteur.substring(1,injection.nomSetteur.length()); Class<?> classeInterface = Class.forName(injection.classeInterface,true, ClassLoader.getSystemClassLoader()); Method setteur = classeCible.getMethod(nomMethodeSetteur,classeInterface); // Appel du setteur: réalisation de la dépendance entre les deux instances // ------------------------------------------------------------------ setteur.invoke(objetCible,objetAInjecter); return objetCible; } public Injection lireInjection(String configuration,String nomClasseCible) { Injection injection = new Injection(); injection.classeCible=nomClasseCible; String[] lignes = Terminal.lireFichierTexte(configuration); String suite=""; for(String l:lignes){ int index = l.indexOf(" "); String mot = l.substring(0,index); if(mot.equals(nomClasseCible)){ suite=l.substring(index+1,l.length()); break; } } int index = suite.indexOf(" "); injection.nomSetteur=suite.substring(0,index); suite=suite.substring(index+1,suite.length()); index = suite.indexOf(" "); injection.classeInterface=suite.substring(0,index); suite=suite.substring(index+1,suite.length()); index = suite.indexOf("("); injection.classeAInjecter=suite.substring(0,index); suite=suite.substring(index+1,suite.length()); index = suite.indexOf(")"); if(index==0) injection.params= new String[0]; else{ String params = suite.substring(0,index); injection.params=params.split(","); } return injection; } class Injection{ String classeCible; String nomSetteur; String classeInterface; String classeAInjecter; String [] params; } } LecteurFichierPersonne.java package fr.cnam.test; import java.util.*; import fr.cnam.util.*; public class LecteurFichierPersonne implements PersonneFinder { protected String nomFichier; public LecteurFichierPersonne(String nomFichier) { this.nomFichier = nomFichier; } public List<Personne> findAll() { ArrayList<Personne> list = new ArrayList<Personne>(); String[] lignes = Terminal.lireFichierTexte(nomFichier); for(String ligne:lignes) { String[] champs = ligne.split(";"); Personne p = new Personne(champs[0], champs[1], new Integer(champs[2]).intValue(), champs[3]); list.add(p); } return list; } } Personne.java package fr.cnam.test; // Classe de définition d'une personne // public class Personne { private Integer id; private String nom; private String prenom; private Integer age; private String adresse; public Personne() { id=0; nom=""; prenom=""; adresse=""; age=0; } public Personne(String nom,String prenom,Integer age,String adresse) { this.nom=nom; this.prenom=prenom; this.adresse=adresse; this.age=age; } public Integer getId(){return id;} public String getNom(){return nom;} public String getPrenom(){return prenom;} public String getAdresse(){return adresse;} public Integer getAge(){return age;} public void setId(Integer id){this.id=id;} public void setNom(String nom){this.nom=nom;} public void setPrenom(String prenom){this.prenom=prenom;} public void setAdresse(String adresse){this.adresse=adresse;} public void setAge(Integer age){this.age=age;} public String toString() { String str=String.format("%20s %20s%3d %30s",nom,prenom,age,adresse); return str; } } PersonneFinder.java package fr.cnam.test; import java.util.*; public interface PersonneFinder { public List<Personne> findAll(); } PersonneLister.java package fr.cnam.test; import java.util.*; public class PersonneLister { private PersonneFinder finder; public PersonneLister() { finder=null; } public PersonneLister(String annuaire) { finder = new LecteurFichierPersonne(annuaire); } public List<Personne> chercherParNom(String morceauNom) { ArrayList<Personne> tab=new ArrayList<Personne>(); List<Personne> list = finder.findAll(); for(Personne p:list) if (morceauNom==null) tab.add(p); else if(p.getNom().toLowerCase().indexOf(morceauNom.toLowerCase())!=-1) tab.add(p); return tab; } public void setFinder(PersonneFinder pf) { finder = pf; } } util run.bat cd bin java -classpath "." ExempleCh04_04 pause