Spring – Injection de dépendance (@Autowired, @Qualifier & @Ressource)

Spring – Injection de dépendance (@Autowired, @Qualifier & @Ressource)

Hello les amis, dans ce tuto nous allons voir comment faire l’injection de dépendance en utilisant l’annotation @Autowired, pour plus de detail sur le DI(Injection de dépendance) je vous invite mes amis d’aller voir ce lien.

1 –  @Autowired :

C’est une annotation qui nous permet de faire l’injection de dépendances entre les beans de l’application (Spring va tout faire), il suffit juste d’annoter un constructeur ou une méthode avec cette dernière. et le conteneur Spring va faire la suite(La creation du bean, le chercher et l’injecter automatiquement…).

  •  Pour bien comprendre le principe je vous propose de faire un petit exemple :

On va utiliser le principe du couplage faible “ne pas avoir beacoup de dépendance entre les classes de votre applicaion ce qui rend la maintenance de ce tte dernière facile”, donc on va créer une classe dao et une interface idao puis une classe metier qui va accéder à la partie dao en utilisant que l’interface :

Donc maintenant, on va créer la classe Metier et utiliser le principe de DI :

Donc, mtn une fois le conteneur Spring se lance, il va crée l’instance de la classe Dao et la classe Metier(Principe Ioc), et il va faire l’injection de dépendance (injecter l’objet créeé de la classe Dao dans la propriété de l’interface IDao qui existe dans la classe Metier)

  • Quelques remarques à retenir :

la valeur par défaut de l’annotation @Autowired est true, ca veut dire qu’il faut obligatoirement initialiser le bean à injecter, si le Conteneur Spring ne trouve pas le bean une exception de type BeanCreationException est levée, on peut bien sur modifier cette annotation en mettant la valeur à false comme suit :

@Autowired(required=false).

Le  conteneur spring va lever des exceptions de type BeanCreationException dans le deux cas suivant :

– Si @Autowired ne trouve aucun bean correspondant au type de l’entité annoté sauf si l’attribut requierd est false.

– Si @Autowired trouve plusieurs beans correspondants au type annoté et que l’élément n’est pas un tableau ou collection.

2 – @Qualifier :

A côté de l’annotation @Autowired, on peut utiliser d’autres annotations pour nous faciliter la vie :D, nous allons voir les annotations @Qualifier & @Ressource

@Qualifier : c’est une annotation utilisée lorsqu’on a plusieurs classes qui implémentent une interface, et on veux faire l’injection des dépendances en utilisant cet interface.

  • Un petit exemple pour bien comprendre :

Dans une seule application , on a une interface IDao qui sera implémentée par 3 classes : DaoJdbc, DaoHibernate, DaoSpringData.

La déclaration des 3 classes :

Dans la partie Métier on a une classe qui va utiliser la partie Dao(pour respecter la principe du couplage faible on va utiliser l’interface IDao) :

Donc puisqu’on 3 classes qui implémentent cette interface, on doit utiliser un truc pour spécifier à la partie métier quelle classe doit utiliser (utilisation de l’annotation Qualifier).

@Qualifier est utilisée donc pour montrer au Conteneur Spring la classe à injecter (dans le cas de plusieurs classes).

2 – @Resource:

L’annotation @Resource : on peut dire qu’elle s’agit d’une fusion entre l’annotation @Autowired et @Qualifier, ci-dessous un petit exemple :

On va utiliser l’exemple précèdent, ci-dessous la déclaration des 3 classes :

Vous avez remarqué qu’il n’ y a aucun changement au niveau de la première partie, par contre dans la partie Métier on a une classe qui va utiliser la partie Dao(pour respecter la principe du couplage faible on va utiliser l’interface IDao) :

Donc comme vous voyez au lieu d’utiliser deux annotation @Autowired et @Qualifier on utilise @Resource

 

 

 

Spring – Injection de dépendance(DI)

Spring – Injection de dépendance(DI) :

L’injection de dépendance(DI) est un design pattern qui nous permet de supprimer les dépendances entre les objets et de faire l’injection automatiquement lors du démarage du conteneur Spring, ce dernier facilite la gestion de l’appli, test et maintenance de l’application, le couplage du code est faible, donc on peut changer dans l’application sans faire bcp de modifications dans le code.

Les informations seront fournies depuis un fichier xml.

Nous avons deux façons pour faire l’injection de dépendance :

 

Le design pattern Singleton

Le design pattern Singleton

Le design pattern Singleton est un patron de conception qui est utilisé pour s’assurer qu’une classe ne sera instanciée qu’une seule fois. l’utilisation de ce dernier rend l’application plus rapide car il libére la mémoire puisque l’objet ne se crée qu’une seule fois.

Le singleton contenant une méthode qui crée une instance uniquement s’il n’en existe pas encore. Sinon elle renvoie une référence vers l’objet qui existe déjà. Le constructeur de la classe doit être privé, afin de s’assurer que la classe ne puisse être instanciée autrement que par la méthode de création contrôlée.

Dans les applications multi-thread la méthode doit être déclarée avec lemot clé synchronized. Si deux processus légers exécutent en même temps la méthode de création alors que l’objet unique n’existe pas encore, il faut absolument s’assurer qu’un seul créera l’objet, et que l’autre obtiendra une référence vers ce nouvel objet.

Pour appeler la méthode sans instancier la classe, il faudrait la déclarer static.

Ci-dessous une vidéo pour vous montrer un exemple d’utilisation du dusign pattern Singleton.

le design pattern adapter (Adaptateur)

L’Adaptateur est un Patron de conception (design pattern). Il permet de convertir l’interface d’une classe en une autre interface attendue par le client attend.

L’adaptateur fait fonctionner ensemble des classes qui n’auraient pas pu fonctionner sans lui.

 

Statement & PreparedStatement

Statement & PreparedStatement

Statement : c’une interface qui nous fournit des méthodes pour exécuter des requêtes avec une bd. Cette dernière est une usine de Resultset.

Les méthodes qu’on peut utiliser sont les suivantes :

– public ResultSet executeQuery(String sql) : on l’utilise pour executer une requete de type select, elle nous retourne un objet de type ReseltSet.

public int executeUpdate(String sql) : utiliser pour executer une requete de type create, drop, insert, update ou delete.

public boolean execute(String sql) : pour executer des requetes qui vont retourner plusieurs résultats.

public int[] executeBatch() : pour executer des commandes batch.

PreparedStatement : c’une sous interface de Statement, on l’utilise pour exécuter des requêtes paramètres. L’utilisation de PreparedStatement rend l’application rapide car les requêtes paramètres sont compilées une seule fois.

L’interface Connection

Connection : L’interface Connection est une interface qui joue en fait le rôle de session entre une application et une bd, et c’est via cette interface qu’on peut fabriquer des Statement, PreparedStatement, and DatabaseMetaData.

Les classes qui implémentent cette interface doivent obligatoirement redéfinir les méthodes suivantes :

public Statement createStatement() : créer un objet de type statement pour executer des requetes SQL.

public Statement createStatement(int resultSetType,int resultSetConcurrency) : Crée un objet Statement qui va générer des objets ResultSet avec le type et la simultanéité donnée

public void setAutoCommit(boolean status) : on l’utilise pour modifier l’etat du commit, il est true par défaut.

public void commit() : souvegarder toutes les modifications faites après le dernier commit.

public void rollback() : supprimer toutes les modifications faites après le dernier commit.

public void close() : fermer la connexion et libérer les ressources JDBC.

La classe DriverManager

La classe DriverManager : cette classe joue le rôle d’intermediare entre l’utilisateur et le pilote(driver) utilisé(le chargement des pilotes). C’est via cette derniere qu’on peut établir une connexion entre une bd et le pilote approprié. Cette dernière maintient une liste des pilotes(drivers) qui sont enregistrés en appelant la méthode registerDriver.

4 méthodes sont appelées lors de l’utilisation de cette classe :

public static void registerDriver(Driver driver) : on l’utilise lorsqu’on veut enregistrer un driver.

public static void deregisterDriver(Driver driver) : pour désenregistrer un driver.

public static Connection getConnection(String url) : pour établir une connexion avec l’url spécifié.

public static Connection getConnection(String url,String userName,String password) : pour établir une connexion avec l’url spécifié, nom d’utilisateur et mot de passe.

Les conventions de codage en Java

Des conventions de codage sont utilisées tout au long de ce cours Java JEE. Par défaut, les conventions de codage pour la plupart des projets OpenSource suivent ces instructions. Par exemple, si la parenthèse { est après la condition if, le code n’est pas correct.

Tous les blocs de code doivent commencer par une nouvelle ligne.

Chaque conditionnelle contient les parenthèses ouvrantes et fermantes.

Une indentation se trouve après chaque instruction. Les noms des fonctions et des paramètres, ne doivent pas avoir de préfixe, commencent par une minuscule et chaque partie de mot est en majuscule.

La version de l’application (du code) est précisée dans chaque fichier d’extension .java.

@version 1.0

Le nom de l’auteur est précisé.

@author opentuto

Chaque importation de paquetage (paquet) Java est pleinement qualifiée.

 

Créer une première classe Java sur Eclipse

Dans ce tutoriel nous allons créer ensemble notre première classe Java sur Eclipse. Pour cela, sélectionnez le package que vous avez créé, clic droit puis New – Class.

Nommez la classe Personne en commençant le nom par une majuscule et cochez l’option public static void main(String[] args). Cette instruction correspond à une méthode permettant d’exécuter la classe. Elle sera détaillée plus loin.

Par convention, seules les classes commencent par une lettre majuscule. . Les caractères spéciaux (@, %, ?, etc.) ne peuvent être utilisés en tant que premier caractère.
Première classe Java

Première classe Java

Cliquez sur le bouton Finish.

La classe a été ajoutée au package et le code généré automatiquement par Eclipse est visible dans la fenêtre de l’éditeur de code:

Ajoutez une propriété à la classe :

Pour ajouter des accesseurs à la classe, choisissez dans le menu l’option Source puis Generate Getters and Setters.

Cochez ensuite les cases nom et prenom puis validez.

Ajout des accesseurs à la classe (Getters et Setters)

Ajout des accesseurs à la classe (Getters et Setters)

Les accesseurs sont générés.

 

Ajoutez un constructeur en utilisant à nouveau dans le menu l’option Source puis Generate Constructor using Fields.

Ajoutez un constructeur Java à l'aide d'Eclipse

Ajoutez un constructeur Java à l’aide d’Eclipse

Validez. Le constructeur est généré.

Pour ajouter des commentaires au code, ajoutez deux // au début de chaque ligne ou encadrez plusieurs lignes par /* et */.

Complétez la méthode main().

Pour tester la classe, effectuez un clic droit sur la classe puis choisissez Run As – 1. Java Application.

Exécuter une classe Java sur Eclipse

Exécuter une classe Java sur Eclipse

La sortie pour notre classe exemple se réalise en mode console.

La sortie de la classe Personne en mode console

La sortie de la classe Personne en mode console

Nous avons donc crée notre premiere classe Java ! Dans la prochain leçon, nous verrons comment créer une premiere fenêtre avec le plugin WindowBuilder. Mais avant, il faut savoir comment ajouter un plugin à Eclipse.

Créer un premier package Java sur Eclipse

Sélectionnez votre projet dans l’explorateur de packages, puis choisissez Package dans le menu File – New. Nommez-le javaBasics en commençant le nom par une minuscule pour respecter les conventions d’écriture du langage Java puis cliquez sur le bouton Finish.

Nouveau package Java

Nouveau package Java

Votre package est ajouté au projet.

package-java-opentuto

Avant de poursuivre, allons voir les dossiers créés sur le disque dur. Vous devriez avoir une structure semblable à celle-ci :

dossiers-projet-java

Le dossier bin est généré automatiquement. Il a une structure identique au dossier src et comportera lors de l’exportation du projet les classes compilées (extension class) et les ressources nécessaires à son fonctionnement.