Vous êtes sur la page 1sur 25

SPRING – Injection de Dépendances

UP JavaEE / .NET : Bureau E204

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 1


Plan du Cours

– Inversion de Control IoC


– Injection de Dépendances ID

– Bean : Configuration, Stéréotypes, Portées

– Configuration de l’ID avec XML + TP1


– Configuration de l’ID avec Java + TP2
– Configuration de l’ID avec les Annotations + TP3

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 2


Inversion de Control

• L’IOC (Inversion de Control) est un design pattern. Il fonctionne selon le


principe que l'exécution de l’application n'est plus sous le contrôle direct
de l'application elle-même mais du Framework sous-jacent.

• Dans notre cas, nos applications web seront contrôlées par le Framework
Spring. Comment? :

• L’Injection de Dépendance est la forme principale de l’IoC. Elle


implémente le principe de l’IoC.

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 3


Injection de Dépendances

• L’Injection de Dépendance (ID) est une méthode pour instancier des


objets et créer les dépendances nécessaires entre elles, sans avoir besoin
de coder cela nous même.

• Ceci permet de réduire le code relatif aux dépendances. Ce qui permet


une lisibilité du code, et permet de gagner en temps de développement.

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 4


Bean – Définition et Portée

• C’est un composant Java spécifique avec un identifiant unique.

• Plusieurs types de Bean (scope):


– singleton : Une seule instance du Bean crée pour chaque Conteneur
IoC Spring, et référencée à chaque invocation), scope par défaut.
– prototype : Nouvelle instance créée à chaque appel du Bean
– request : (Contexte Web uniquement) Nouvelle instance créée pour
chaque requête HTTP.
– session : une instance du bean par session HTTP.
– global-session : une instance du bean par session globale (valable pour
les portlets : ensemble d’applications déployées sur un même
conteneur web).

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 5


Bean – Déclaration et Attributs

• On définit un Bean dans un fichier XML, avec une configuration Java ou par
annotation, pour que Spring puisse le gérer :

• Les attributs :

– class : fully qualified java class name


– id : the unique identifier for this bean
– configuration : (scope, init-method, etc.)
– property : arguments to pass to the bean setters at creation time

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 6


Configuration Spring : XML, Java, Annotation

• Spring peut se baser sur trois façons différentes pour configurer l’injection de
dépendances et la création des beans (instances) :

• XML (obsolète)

• Java (obsolète)

• Annotations (le plus utilisé)

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 7


Bean – Exemple 1 – XML

• Dans un fichier XML de configuration des beans :

<bean id="userControl" class="tn.esprit.esponline.control.UserControlImpl">


<property name="userService" ref="userService" />
</bean>

• Et dans le code java :

public class UserControlImpl {

IUserService userService;

public IUserService getUserService() {


return userService;
}
public void setUserService(IUserService userService) {
this.userService = userService;
}

}
© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 8
Bean – Exemple 2 – Java

• Tout est centralisé dans une seule classe Java (classe de configuration des beans) :

@Configuration
public class BeansConfiguration {

@Bean(name="userControl")
public UserControlImpl createUserControl()
{
UserControlImpl uc = new UserControlImpl();
uc.setUserService(createUserService()); return uc;
}

@Bean(name="userService")
public UserServiceImpl createUserService()
{
UserServiceImpl us = new UserServiceImpl();
us.setUserDAO(createUserDAO()); return us;
}
…………………
© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 9
Bean – Exemple 3 – Annotations

• Dans la classe Java de configuration des beans. Chaque bean est annoté (Annotation
décentralisée)

@Controller
public class UserControlImpl implements IUserControl {
@Autowired
IUserService userService;

@Service
public class UserServiceImpl implements IUserService {
@Autowired
IUserDAO userDAO;

@Configuration // Cherche les beans Spring dans le package : tn.esprit.esponline


@ComponentScan("tn.esprit.esponline")
public class Config {}

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 10


TP1 Configuration Spring se basant sur du XML

Nous allons coder ce TP


en pas à pas ensemble :

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 11


TP1 Configuration Spring se basant sur du XML

• Créer un projet Maven Simple de type Jar (tp1-spring-injection-xml)

• Mettre à jour le pom.xml :

– <version>1.0</version>
– Java 1.8

– Dépendance Log4j : version 1.2.17, groupid log4j, artefactid log4j


– Dépendance Junit : version 4.12, groupid junit, artefactid junit
– Dépendance spring-context : version 5.0.2.RELEASE, groupid
org.springframework, artefactid spring-context

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 12


TP1 Configuration Spring se basant sur du XML

• Créer les packages tn.esprit.esponline.control / tn.esprit.esponline.service /


tn.esprit.esponline.dao

• Créer les beans :


– UserControllerImpl (pas besoin d’interface ici)
– UserServiceImpl et son interface UserService
– UserDAOImpl et son interface UserDAO

• Créer la classe qui joue le rôle du conteneur IOC Spring


• Créer la classe de test de cet IOC.
• Voir des Indications dans les pages suivantes :

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 13


TP1 Configuration Spring se basant sur du XML

• Créer le bean UserServiceImpl (créer de même les beans UserControlImpl et UserDAO) :

package tn.esprit.esponline.service;

import tn.esprit.esponline.dao.IUserDAO;

public class UserServiceImpl implements IUserService {

IUserDAO userDAO;

public IUserDAO getUserDAO() {


return userDAO;
}

public void setUserDAO(IUserDAO userDAO) {


this.userDAO = userDAO;
}

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 14


TP1 Configuration Spring se basant sur du XML

• Fichier de configuration XML tp1-beans.xml :

<?xml version="1.0" encoding="UTF-8"?>


<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="userControl" class="tn.esprit.esponline.control.UserControlImpl">
<property name="userService" ref="userService" />
</bean>
<bean id="userService" class="tn.esprit.esponline.service.UserServiceImpl">
<property name="userDAO" ref="......." />
</bean>
<bean id="userDAO" class="......." />
</beans>

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 15


TP1 Configuration Spring se basant sur du XML
public class Demo {

private static final Logger logger = …………;


private ApplicationContext context;

public void verifyBeans () {

logger.info("In verifyBeans() : ");

// Chargement du Conteneur Spring IoC :


context = new ClassPathXmlApplicationContext(".......");

logger.debug("Contains userControlImpl " + context.containsBeanDefinition("userControl"));


logger.debug("Contains userServiceImpl " + context.containsBeanDefinition("userService"));
logger.debug("Contains userDAOImpl " + context.containsBeanDefinition("......."));

logger.info("Out of verifyBeans().");
}
}

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 16


TP2 Configuration Spring se basant sur Java

• Ce TP2 (tp2-spring-injection-java) est presque le même le le TP1 (tp1-


spring-injection-xml).

• A la place d fichier XML, nous allons coder une classe Java de


configuration qui indiquera à Spring quels beans il doit gérer (voir page
9).

• Dans la classe Demo.java :


// Chargement du Conteneur Spring IoC :
//context = new ClassPathXmlApplicationContext("tp1-beans.xml");
context = new AnnotationConfigApplicationContext(BeansConfiguration.class);

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 17


TP2 Configuration Spring se basant sur Java

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 18


TP3 Configuration Spring avec les Annotations

• Ce TP3 (tp3-spring-injection-annotations) est presque le même le le TP2 (tp2-


spring-injection-java).

• Nous allons utiliser les annotations (@Controller, @Service, @Repository)

• Injecter l’interface Service dans le Controller (@Autowired)


• Injecter l’interface DAO dans le Service (@Autowired)

• Modifier la classe de configuration :


@ComponentScan("tn.esprit.esponline")
public class BeansConfiguration
{}

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 19


TP3 Configuration Spring avec les Annotations

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 20


TP3 Révision Configuration avec les Annotations
package tn.esprit.esponline.service;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import tn.esprit.esponline.dao.IUserDAO;

@Service
public class UserServiceImpl implements IUserService {

@Autowired
IUserDAO userDAO;

public IUserDAO getUserDAO() { return userDAO; }

public void setUserDAO(IUserDAO userDAO) { this.userDAO = userDAO; }

}
© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 21
Les Stéréotypes des Beans

• Un classe annotée @Component est un bean. C’est une annotation


générique.

• Les beans de la couche @Controller


• Les beans de la couche Service : @Service
• Les beans de la couche DAO/Persistence : @Repository

• @Controller, @Service et @Repository héritent de la classe @Component

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 22


Les Trois Configurations

Java Annotation XML

- Conf centralisée dans un seul - Bien pour un développement


endroit. rapide.
Avantages - Typage fort. - La classe contient déjà sa
configuration

Obsolète
- Par rapport au annotation, un - Configuration éparpillée.
code de configuration - Conf et code dans un même
Inconvéniants supplémentaire à écrire. endroit.

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 23


SPRING – Injection de Dépendances

Si vous avez des questions, n’hésitez pas à nous


contacter :

Département Informatique
UP JavaEE / .NET
Bureau E204

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 24


SPRING – Injection de Dépendances

© 2019-2020 – ESPRIT – Module SPRING – SPRING Injection de Dépendances 25

Vous aimerez peut-être aussi