SlideShare une entreprise Scribd logo
1  sur  48
Télécharger pour lire hors ligne
Architecture JEE
Principe de l’inversion de contrôle et
d’injection des dépendances
MohamedYoussfi
Laboratoire Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA)
ENSET, Université Hassan II Casablanca, Maroc
Email : med@youssfi.net
Client HTTP Serveur Web
Requête HTTP
Réponse HTTP
SGBD
HTML, CSS,
Java Script,
Un client web (Browser) communique avec le serveur web (Apache) en utilisant le
protocole HTTP
Une application web se compose de deux parties:
La partie Backend : S’occupe des traitements effectués coté serveur :
Technologies utilisées : PHP, JEE, .Net, Node JS
La partie Frontend : S’occupe de la présentations des IHM coté Client :
Langages utilisés : HTML, CSS, Java Script
La communication entre la partie Frontend et la partie backend se fait en utilisant le
protocole HTTP
2
Html + CSS+
Java Script
PHP
JEE
Dot Net
Node JS
Exigences d’un projet informatiqueExigences d’un projet informatique
Exigences Fonctionnelles
Temps de réponse
Problème de montée en charge :Vers une architecture Distribuée scalable
Equilibrage de charges et Tolérances aux panes
ExigencesTechniques
Performances : l’application doit être performante
Satisfaire les besoins fonctionnels (métiers) de l’entreprise
Une application doit évoluer dans le temps
L’application doit être fermée à la modification et ouverte à l’extension
Maintenance : l’application doit être facile à maintenir
Sécurité : L’application doit prévoir des solutions pour toutes les failles de sécurités
Persistances des données dans des SGBD appropriés, Gestion desTransactions
Exigences financières : Le coût du logiciel doit respecter les contraites budgétaires
Créer différents types de clients pour accéder à l’application :Web, Mobile, Desktop, ..
…………
Constat
Il est très difficile de développer un système logiciel qui respecte ces
exigences sans utiliser l’expérience des autres :
◦ Bâtir l’application sur une architecture d’entreprise:
JEE
◦ Framework pour l’Inversion de contrôle:
Permettre au développeur de s’occuper uniquement du code métier
(Exigences fonctionnelles) et c’est le Framework qui s’occupe du code
technique (Exigences Techniques)
Spring (Conteneur léger)
EJB (Conteneur lourd)
◦ Frameworks :
Mapping objet relationnel (ORM ) : JPA, Hibernate,Toplink, …
Applications Web : Struts, JSF, SpringMVC
◦ Middlewares :
RMI, CORBA :Applications distribuées
Web Services :
JAXWS pour Web services SOAP
JAXRS pour les Web services RESTful
Communication asynchrone entre les application :
JMS :
AMQP :
A B
RMI, CORBA
SOAP, REST
Communication
Synchrone
A B
Broker:
Rabbit MQ
Active MQ
JMS
AMQP
JMS
AMQP
 

Communication
Asynchrone
Exemple : sans utiliser d’inversion de contrôle
public void virement(int c1, int c2, double mt) {
/* Création d’une transaction */
EntityTransaction transaction=entityManager.getTransaction();
/* Démarrer la transaction */
transaction.begin();
try {
/* Code métier */
retirer(c1,mt);
verser(c2,mt);
/* Valider la transaction */
transaction.commit();
} catch (Exception e) {
/* Annuler la transaction en cas d’exception */
transaction.rollback();
e.printStackTrace();
}
}
med@youssfi.net | ENSET Université
Hassan II
Code Métier
CodeTechnique
CodeTechnique
Exemple : en utilisant l’inversion de contrôle
@Transactional
public void virement(int c1, int c2, double mt) {
retirer(c1,mt);
verser(c2,mt);
}
med@youssfi.net | ENSET Université
Hassan II
Code Métier
Ici, avec l’annotation @Transactional, nous avons
délégué la gestion des transactions au conteneur
Spring IOC
La séparation des aspects métiers et des apsects
techniques d’une application est rendu possible
grâce à la Programmation Orientée Aspect (AOP)
En utilisant des tisseurs d’aspects comme :
- AspectJ
- Spring AOP
- JBOSS AOP
Architecture d’une application
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
SGBD :
• Permet de stocker les données de l’application
• Dans la majorité des cas il s’agit d’un SGBD relationnel (SqlServer, MySQL, Oracle, …)
• Si la quantité de données sont très importante, on utilise des SGBD NoSQL (Not Only
SQL) comme MangoDB, …
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Serveur d’application :
• Un serveur d’application qui permet de déployer les applications
• Il permet de gérer le cycle de vie des applications
• Fournie l’infrastructure nécessaire pour faire fonctionner les applications de bonnes qualités
• Offre un Framework d’Invertion de Contrôle (IOC) : Spring IOC ou EJB
• Exemple : JBoss, Glashfish,Web Sphere, ou encore (Tomcat+Spring,) etc..
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Couche Métier :
• Permet d’implémenter la logique métier de l’application
• Utilise généralement une approche orientée objet
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Couche DAO:
• Couche technique qui représente la couche d’accès aux données de l’application
• Si les données sont stockées dans une base de données relationnelle, cette
couche utilise un Framework de Mapping Objet relationnel implémentant la
spécification JPA comme Hibernate,TopLink, etc..
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Couche Web:
• Permet d’implémenter la logique présentation Web de l’application ( Servlet et JSP )
• Dans cette partie on utilise des Framework MVC comme Spring MVC, Struts, JSF, ..
• Cette couche reçoit le requêtes HTTP du client web
• Faire appel à la couche métier pour effectuer les traitement
• Envoie un résultat HTML au client, en utilisant un moteur de Template comme Tymeleaf dans
une réponse HTTP
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Couche Web Services (SOAP):
• Permet de définir un web service qui permet à d’autres applications développées avec
d’autres langages de faire appel, à distance, aux fonctionnalités de l’application
• Le web service reçoit des requête HTTP contenant des messages XML (Requête SOAP)
• Exécute des traitement et renvoie le résultat au format XML (Réponse SOAP)
• Pour implémenter lesWeb service on utilise la spécification JAXWS
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Couche Web Services REST full:
• Permet de définir un web service qui permet à d’autres applications développées avec
d’autres langages de faire appel, à distance, aux fonctionnalités de l’application
• Le service REST reçoit des requête HTTP
• Exécute des traitement et renvoie le résultat au client avec différents formats (JSON, XML)
• Pour implémenter lesWeb service REST on utilise la spécification JAXRS
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Middlewares RMI, CORBA, JMS:
• RMI est utilisé pour créer des application distribuées Java
• CORBA est utilisé pour créer des applications distribuées hétérogènes
• JMS et AMQP sont utilisés pour les applications distribuées asynchrones
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
IOC Contaniner:
• Représente le Framework qui permet de faire l’inversion de contrôle
• Permet à l’application de se concentrer uniquement sur le code métier (Exigences
fonctionnelles)
• Le Container IOC offre à l’applications les services techniques (Sécurité, Gestion de
transaction, ORM, etc..)
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Client HTTP:
• Envoie les requête HTTP à la couche Web de l’application
• Reçois les réponse HTTP contenant du HTML, CSS et Java Script
• Affiche la Page Web (HTML, CSS, Java Script)
• Dans ce scénario, tout est généré coté serveur
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
ClientWeb (Riche):
• Envoie les requête HTTP Ajax au service REST en utilisant Java Script
• Ce dernier retourne une réponse HTTP qui contient des données au format JSON
• Affiche ces données JSON dans une page HTML.
• Dans ce cas c’est le client HTTP qui s’occupe de la présentation
• Souvent on utilise un Framework Java Script comme AngularJS ou JQuery
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Client Mobile:
• Envoie les requête HTTP au service REST
• Ce dernier retourne une réponse HTTP qui contient des données au format JSON
• Affiche ces données JSON dans l’inteface de l’application mobile
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Client Lourd Java, C++, …:
• Un client Java peut communiquer avec un autre objet Java du en utilisant le middleware
RMI
• Un Client écrit avec un autre langage de programmation peut communiquer avec
l’application via le middleware CORBA
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
Architecture d’une application
Client SOAP:
• Au lieu de CORBA, une application quelconque peut également communiquer à
distance avec le web service en utilisant le protocole SOAP (HTTP+XML)
Serveur d’application JEE
Web
MVC
Couche Métier
Couche DAO
JPA, Hibernate, Spring Data
Couche DAO
JPA, Hibernate, Spring Data
IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB)
ApplicationClient Web
HTML
Client
Java, C++
Client
SOAP
HTTP, HTML
RMI, IIOP
SOAP
SGBDR
Ou
NoSQL
Services de l’infra structure technique
JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS,
JaxRS, RMI, CORBA, MQP…
WS
SOAP
WS
REST
RMI
CORBA
JMS,AMQ
ClientWeb
AngularJS
JQuery
HTTP, JSON
Client
Mobile
HTTP, JSON
med@youssfi.net | ENSET Université
Hassan II
Inversion de contrôle
ou
Injection de dépendances
med@youssfi.net | ENSET Université
Hassan II
Rappels de quelque principes de
conception
Une application qui n’évolue pas meurt.
Une application doit être fermée à la modification
et ouverte à l’extension.
Une application doit s’adapter aux changements
…
Comment Créer une application fermée à la
modification et ouverte à l’extension ?
Comment faire l’injection des dépendances ?
C’est quoi le principe de l’inversion de contrôle ?
med@youssfi.net | ENSET Université
Hassan II
Couplage Fort
et
Couplage faible
med@youssfi.net | ENSET Université
Hassan II
Couplage fort
Quand une classe A est lié à une classe B, on dit que la classe A est
fortement couplée à la classe B.
La classe A ne peut fonctionner qu’en présence de la classe B.
Si une nouvelle version de la classe B (soit B2), est crée, on est obligé de
modifier dans la classe A.
Modifier une classe implique:
◦ Il faut disposer du code source.
◦ Il faut recompiler, déployer et distribuer la nouvelle application aux clients.
◦ Ce qui engendre un cauchemar au niveau de la maintenance de l’application
A
b: B
calcul() : double
B
getValue() : double
1
B2
getValue() : double
1
med@youssfi.net | ENSET Université
Hassan II
Couplage fort
Quand une classe A est lié à une classe B, on dit que la classe A est
fortement couplée à la classe B.
La classe A ne peut fonctionner qu’en présence de la classe B.
Si une nouvelle version de la classe B (soit B2), est crée, on est obligé de
modifier dans la classe A.
Modifier une classe implique:
◦ Il faut disposer du code source.
◦ Il faut recompiler, déployer et distribuer la nouvelle application aux clients.
◦ Ce qui engendre un cauchemar au niveau de la maintenance de l’application
A
b: B2
calcul() : double
B
getValue() : double
1
B2
getValue() : double
1
med@youssfi.net | ENSET Université
Hassan II
Exemple de couplage fort
package dao;
public class DaoImpl {
public double getValue(){
return(5);
}
}
MetierImpl
dao: DaoImpl
calcul() : double
DaoImpl
getValue() : double
1
package metier;
import dao.DaoImpl;
public class MetierImpl {
private DaoImpl dao;
public MetierImpl() {
dao=new DaoImpl();
}
public double calcul(){
double nb=dao.getValue();
return 2*nb;
}
}
package pres;
import metier.MetierImpl;
public class Presentation {
private static MetierImpl metier;
public static void main(String[]
args) {
metier=new MetierImpl();
System.out.println(metier.calcul());
}
}
Presentation
metier:MetierImpl
main(String[] a):void
1
med@youssfi.net | ENSET Université
Hassan II
Problèmes du couplage fort
Dans l’exemple précédent, les classes MetierImpl et DaoImpl sont liées
par un couplage fort. De même pour les classe Presentation et
MetierImpl
Ce couplage fort n’a pas empêché de résoudre le problème au niveau
fonctionnel.
Mais cette conception nous ne a pas permis de créer une application
fermée à la modification et ouverte à l’extension.
En effet, la création d’une nouvelle version de la méthode getValue()
de la classe DaoImpl, va nous obliger d’éditer le code source de
l’application aussi bien au niveau de DaoImpl et aussi MetierImpl.
De ce fait nous avons violé le principe « une application doit être
fermée à la modification et ouverte à l’exetension»
Nous allons voir que nous pourrons faire mieux en utilisant le
couplage faible.
med@youssfi.net | ENSET Université
Hassan II
Couplage Faible.
Pour utiliser le couplage faible, nous devons utiliser les interfaces.
Considérons une classe A qui implémente une interface IA, et une classe B qui
implémente une interface IB.
Si la classe A est liée à l’interface IB par une association, on dit que le classe A et la
classe B sont liées par un couplage faible.
Cela signifie que la classe B peut fonctionner avec n’importe quelle classe qui
implémente l’interface IA.
En effet la classe B ne connait que l’interface IA. De ce fait n’importe quelle classe
implémentant cette interface peut être associée à la classe B, sans qu’il soit
nécéssaire de modifier quoi que se soit dans la classe B.
Avec le couplage faible, nous pourrons créer des application fermée à la
modification et ouvertes à l’extension.
AImpl
b: IB
calcul() : double
BImpl
getValue() : double
1 IB
getValue() : double
IA
calcul() : double
med@youssfi.net | ENSET Université
Hassan II
Couplage Faible.
Pour utiliser le couplage faible, nous devons utiliser les interfaces.
Considérons une classe A qui implémente une interface IA, et une classe B qui
implémente une interface IB.
Si la classe A est liée à l’interface IB par une association, on dit que le classe A et la
classe B sont liées par un couplage faible.
Cela signifie que la classe B peut fonctionner avec n’importe quelle classe qui
implémente l’interface IA.
En effet la classe B ne connait que l’interface IA. De ce fait n’importe quelle classe
implémentant cette interface peut être associée à la classe B, sans qu’il soit
nécéssaire de modifier quoi que se soit dans la classe B.
Avec le couplage faible, nous pourrons créer des application fermée à la
modification et ouvertes à l’extension.
AImpl
b: IB
calcul() : double
BImpl
getValue() : double
1 IB
getValue() : double
IA
calcul() : double
BImpl2
getValue() : double
<<Extension>>
med@youssfi.net | ENSET Université
Hassan II
Exemple de coupage faible
package dao;
public class DaoImpl implements IDao {
public double getValue() {
return 5;
}
}
MetierImpl
dao: IDao
calcul() : double
DaoImpl
getValue() : double
1 IDao
getValue() : double
package dao;
public interface IDao {
public double getValue();
}
package metier;
import dao.IDao;
public class MetierImpl
implements IMetier {
private IDao dao;
public double calcul() {
double nb=dao.getValue();
return 2*nb;
}
// Getters et Setters
}
IMetier
calcul() : double
Presentation
metier:IMetier
main(String[] a):void
1
package metier;
public interface IMetier {
public double calcul();
}
med@youssfi.net | ENSET Université
Hassan II
Injection des dépendances
 Injection par instanciation statique :
import metier.MetierImpl;
import dao.DaoImpl;
public class Presentation {
public static void main(String[] args) {
DaoImpl dao=new DaoImpl();
MetierImpl metier=new MetierImpl();
metier.setDao(dao);
System.out.println(metier.calcul());
}
}
med@youssfi.net | ENSET Université
Hassan II
Injection des dépendances
 Injection par instanciation dynamique par réflexion :
import java.io.*;import java.lang.reflect.*;
import java.util.Scanner; import metier.IMetier;
import dao.IDao;
public class Presentation {
public static void main(String[] args) {
try {
Scanner scanner=new Scanner(new File("config.txt"));
String daoClassname=scanner.next();
String metierClassName=scanner.next();
Class cdao=Class.forName(daoClassname);
IDao dao= (IDao) cdao.newInstance();
Class cmetier=Class.forName(metierClassName);
IMetier metier=(IMetier) cmetier.newInstance();
Method meth=cmetier.getMethod("setDao",new Class[]{IDao.class});
meth.invoke(metier, new Object[]{dao});
System.out.println(metier.calcul());
} catch (Exception e) { e.printStackTrace(); }
}
}
Fichier texte de configuration : config.txt
ext.DaoImp
metier.MetierImpl
med@youssfi.net | ENSET Université
Hassan II
Injection des dépendances avec Spring.
L'injection de dépendances est souvent la base de tout programme
moderne.
L'idée en résumé est de déporter la responsabilité de la liaison des
composants du programme dans un framework afin de pouvoir
facilement changer ces composants ou leur comportement.
Parmi les leaders du marché Java, il y a Spring IoC, Guice, Dagger
ou encore le standard « Java EE » CDI qui existe depuis Java EE 6.
Spring IOC commence par lire un fichier XML qui déclare quelles
sont différentes classes à instancier et d’assurer les dépendances
entre les différentes instances.
Quand on a besoin d’intégrer une nouvelle implémentation à une
application, il suffirait de la déclarer dans le fichier xml de beans
spring.
med@youssfi.net | ENSET Université
Hassan II
Injection des dépendances dans une application java standard
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN"
"http://www.springframework.org/dtd/spring-beans-
2.0.dtd" >
<beans>
<bean id="d" class="dao.DaomImpl2"></bean>
<bean id="metier" class="metier.MetierImpl">
<property name="dao" ref="d"></property>
</bean>
</beans>
metier:MetierImpl
dao:
calcul() : double
d:DaoImpl
getValue() : double
med@youssfi.net | ENSET Université
Hassan II
Injection des dépendances dans une application java standard
package pres;
import metier.IMetier;
import org.springframework.context.support.*;
public class Presentation {
public static void main(String[] args) {
ApplicationContext context=new
ClassPathXmlApplicationContext("spring-ioc.xml");
IMetier metier=context.getBean(IMetier.class);
System.out.println(metier.calcul());
}
}
med@youssfi.net | ENSET Université
Hassan II
Injection par annotations Spring au lieu de XML
package dao;
@Component("dao")
public class DaoImpl implements IDao {
public double getValue() {
return 5;
}
}
MetierImpl
dao: IDao
calcul() : double
DaoImpl
getValue() : double
1 IDao
getValue() : double
package dao;
public interface IDao {
public double getValue();
}
package metier;
import dao.IDao;
@Component("metier")
public class MetierImpl
implements IMetier {
@Autowired
@Resourse("dao")
private IDao dao;
public double calcul() {
double nb=dao.getValue();
return 2*nb;
}}
IMetier
calcul() : double
Presentation
metier:IMetier
main(String[] a):void
1
package metier;
public interface IMetier {
public double calcul();
}
med@youssfi.net | ENSET Université
Hassan II
Injection des dépendances dans une application java standard
package pres;
import org.springframework.context.ApplicationContext;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import metier.IMetier;
public class Presentation {
public static void main(String[] args) throws Exception {
ApplicationContext ctx=new AnnotationConfigApplicationContext("dao","metier");
//ApplicationContext ctx=new ClassPathXmlApplicationContext("config.xml");
IMetier metier=ctx.getBean(IMetier.class);
System.out.println(metier.calcul());
}
}
Maven
Maven, géré par l'organisation Apache Software Foundation. (
Jakarta Project), est un outil pour la gestion et l'automatisation de
production des projets logiciels Java en général et Java EE en
particulier.
L'objectif recherché est de
◦ produire un logiciel à partir de ses sources,
◦ en optimisant les tâches réalisées à cette fin
◦ et en garantissant le bon ordre de fabrication.
Compiler,Tester, Contrôler, produire les packages livrables
Publier la documentation et les rapports sur la qualité
Apports :
◦ Simplification du processus de construction d’une application
◦ Fournit les bonnes pratique de développement
◦ Tend à uniformiser le processus de construction logiciel
◦ Vérifier la qualité du code
◦ Faciliter la maintenance d’un projet
med@youssfi.net | ENSET Université
Hassan II
Maven : POM
Maven utilise un paradigme connu sous le nom de Project Object
Model (POM) afin de :
◦ Décrire un projet logiciel,
◦ Ses dépendances avec des modules externes
◦ et l'ordre à suivre pour sa production.
Il est livré avec un grand nombre de tâches (GOLS) prédéfinies,
comme la compilation du code Java ou encore sa modularisation.
med@youssfi.net | ENSET Université
Hassan II
Maven dependencies
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>3.2.2.RELEASE</version>
</dependency>
</dependencies>
med@youssfi.net | ENSET Université
Hassan II
med@youssfi.net | ENSET Université
Hassan II
Structure du projet
med@youssfi.net | ENSET Université
Hassan II
Injection des dépendances dans une
application web
Dans une application web, SpringIOC est appelé au démarrage du
serveur en déclarant le listener ContextLoaderListener dans le fichier
web.xml
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/spring-beans.xml</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
Dans cette déclaration, CotextLoaderListener est appelé par Tomcat au
moment du démarrage de l’application. Ce listener cherchera le fichier
de beans spring « spring-beans.xml » stocké dans le dossierWEB-INF. ce
qui permet de faire l’injection des dépendances entre MetierImpl et
DaoImpl
CDI : Context Dependency Injection
CDI (Context and Dependency Injection) est une spécification
destinée à standardiser l'injection de dépendances et de contextes,
au sein de la plateforme Java et plus particulièrement Java EE.
Intégrée à la spécification Java EE 6, sa version 1.0 est sortie en
décembre 2009 et a été suivie des versions 1.1 (mai 2013) et 1.2
(avril 2014). Son élaboration a été le fruit des JSR 299 et 346.
Le but de cette spécification est de définir les API et les
comportements associés en ce qui concerne ce qu'on appelle
communément l'injection de dépendances (inversion de contrôle).
Très rapidement, le but de cette dernière est d'avoir un couplage
lâche entre nos classes. En d'autres termes, définir un contrat entre
les beans, mais faciliter le remplacement d'un maillon de la chaîne
très facilement sans avoir à faire les liens et l'initialisation soi-
même.
Principales implémentations de CDI
CDI a trois implémentations principales :
◦ Weld : implémentation de référence de CDI. Utilisé dans
GlassFish, JBoss (AS et WildFly) ;
◦ OpenWebBeans : implémentation Apache. Utilisé dansTomEE,
OpenEJB, Geronimo,WebSphere ;
◦ CanDi : implémentation Caucho. Utilisé dans Resin.
CDI Maven dependencies
<dependencies>
<dependency>
<groupId>org.jboss.weld.se</groupId>
<artifactId>weld-se-core</artifactId>
<version>2.4.1.Final</version>
</dependency>
</dependencies>
med@youssfi.net | ENSET Université
Hassan II
med@youssfi.net | ENSET Université
Hassan II
Injection par annotations Spring au lieu de XML
package dao;
@Named
public class DaoImpl implements IDao {
public double getValue() {
return 5;
}
}
MetierImpl
dao: IDao
calcul() : double
DaoImpl
getValue() : double
1 IDao
getValue() : double
package dao;
public interface IDao {
public double getValue();
}
package metier;
import dao.IDao;
@Singleton
@Named
public class MetierImpl
implements IMetier {
@Inject
private IDao dao;
public double calcul() {
double nb=dao.getValue();
return 2*nb;
}}
IMetier
calcul() : double
Presentation
metier:IMetier
main(String[] a):void
1
package metier;
public interface IMetier {
public double calcul();
}
med@youssfi.net | ENSET Université
Hassan II
Injection des dépendances dans une application java standard
package cdi;
import org.jboss.weld.environment.se.Weld;
import org.jboss.weld.environment.se.WeldContainer;
import cdi.metier.IMetier;
public class App {
public static void main(String[] args) {
Weld weld = new Weld();
WeldContainer container = weld.initialize();
IMetier metier=container.select(IMetier.class).get();
System.out.println(metier.calcul());
}
}
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd">
</beans>
META-INF/beans.xml

Contenu connexe

Tendances

Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)ENSET, Université Hassan II Casablanca
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...ENSET, Université Hassan II Casablanca
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...ENSET, Université Hassan II Casablanca
 
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...ENSET, Université Hassan II Casablanca
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPYouness Boukouchi
 

Tendances (20)

Support POO Java première partie
Support POO Java première partieSupport POO Java première partie
Support POO Java première partie
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4Support developpement applications mobiles avec ionic v3 et v4
Support developpement applications mobiles avec ionic v3 et v4
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
 
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
 
Support de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfiSupport de cours technologie et application m.youssfi
Support de cours technologie et application m.youssfi
 
Maven et industrialisation du logiciel
Maven et industrialisation du logicielMaven et industrialisation du logiciel
Maven et industrialisation du logiciel
 
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce  Basé sur Spring IOC MVC Security JPA HibernateSite JEE de ECommerce  Basé sur Spring IOC MVC Security JPA Hibernate
Site JEE de ECommerce Basé sur Spring IOC MVC Security JPA Hibernate
 
Support Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFISupport Web Services SOAP et RESTful Mr YOUSSFI
Support Web Services SOAP et RESTful Mr YOUSSFI
 
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFITheses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
Theses Soutenues sous Direction et Co-Direction du Pr YOUSSFI
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...Support de cours EJB 3 version complète Par Mr  Youssfi, ENSET, Université Ha...
Support de cours EJB 3 version complète Par Mr Youssfi, ENSET, Université Ha...
 
Développement d'un site web de E-Commerce avec PHP (Première Partie)
Développement d'un site web de E-Commerce avec PHP (Première Partie)Développement d'un site web de E-Commerce avec PHP (Première Partie)
Développement d'un site web de E-Commerce avec PHP (Première Partie)
 
Cours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxyCours design pattern m youssfi partie 6 proxy
Cours design pattern m youssfi partie 6 proxy
 
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...softCours design pattern m youssfi partie 9 creation des objets abstract fact...
softCours design pattern m youssfi partie 9 creation des objets abstract fact...
 
Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)
 
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
Conférence: Catalyseurs de l'Intelligence Artificielle et Écosystème des Fram...
 
Servlets et JSP
Servlets et JSPServlets et JSP
Servlets et JSP
 
Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP
 

Similaire à Architecture jee principe de inversion de controle et injection des dependances

cours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfcours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfRachida19
 
Développement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EEDéveloppement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EESabri Bouchlema
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Eric Bourdet
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Eric Bourdet
 
Ajax en Java - GTI780 & MTI780 - ETS - A09
Ajax en Java - GTI780 & MTI780 - ETS - A09Ajax en Java - GTI780 & MTI780 - ETS - A09
Ajax en Java - GTI780 & MTI780 - ETS - A09Claude Coulombe
 
Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?GreenIvory
 
Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Tugdual Grall
 
Architecture java j2 ee a partager
Architecture java j2 ee a partagerArchitecture java j2 ee a partager
Architecture java j2 ee a partageraliagadir
 
S51 vos projets web services ibm i a l aide de php
S51   vos projets web services ibm i a l aide de phpS51   vos projets web services ibm i a l aide de php
S51 vos projets web services ibm i a l aide de phpGautier DUMAS
 
Presentation JEE et son écossystéme
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystémeAlgeria JUG
 
Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Quentin Adam
 
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...CERTyou Formation
 
System Center Operations Manager et la supervision des applications (.Net et ...
System Center Operations Manager et la supervision des applications (.Net et ...System Center Operations Manager et la supervision des applications (.Net et ...
System Center Operations Manager et la supervision des applications (.Net et ...Microsoft Technet France
 
Javav formation-java-avance-hibernate-webservices
Javav formation-java-avance-hibernate-webservicesJavav formation-java-avance-hibernate-webservices
Javav formation-java-avance-hibernate-webservicesCERTyou Formation
 

Similaire à Architecture jee principe de inversion de controle et injection des dependances (20)

La plateforme JEE
La plateforme JEELa plateforme JEE
La plateforme JEE
 
cours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdfcours-gratuit.com--id-1964.pdf
cours-gratuit.com--id-1964.pdf
 
Développement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EEDéveloppement d'applications pour la plateforme Java EE
Développement d'applications pour la plateforme Java EE
 
Java Entreprise Edition
Java Entreprise EditionJava Entreprise Edition
Java Entreprise Edition
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01
 
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
Supportdecoursejb3versioncompletemryoussfi 140317162653-phpapp01 (1)
 
Ajax en Java - GTI780 & MTI780 - ETS - A09
Ajax en Java - GTI780 & MTI780 - ETS - A09Ajax en Java - GTI780 & MTI780 - ETS - A09
Ajax en Java - GTI780 & MTI780 - ETS - A09
 
#2 Architecture OSGi
#2 Architecture OSGi#2 Architecture OSGi
#2 Architecture OSGi
 
Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?Flex, une techno RIA incontournable pour les futures app web ?
Flex, une techno RIA incontournable pour les futures app web ?
 
Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)Introduction aux RIA (Rich Internet Applications)
Introduction aux RIA (Rich Internet Applications)
 
Architecture java j2 ee a partager
Architecture java j2 ee a partagerArchitecture java j2 ee a partager
Architecture java j2 ee a partager
 
S51 vos projets web services ibm i a l aide de php
S51   vos projets web services ibm i a l aide de phpS51   vos projets web services ibm i a l aide de php
S51 vos projets web services ibm i a l aide de php
 
Presentation JEE et son écossystéme
Presentation JEE et son écossystémePresentation JEE et son écossystéme
Presentation JEE et son écossystéme
 
Ter Web Service Intro
Ter Web Service IntroTer Web Service Intro
Ter Web Service Intro
 
Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?Parisweb - javascript server side - par où commencer ?
Parisweb - javascript server side - par où commencer ?
 
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...
Wpl53 g formation-developper-des-applications-pour-ibm-websphere-portal-8-0-a...
 
J2 ee
J2 eeJ2 ee
J2 ee
 
System Center Operations Manager et la supervision des applications (.Net et ...
System Center Operations Manager et la supervision des applications (.Net et ...System Center Operations Manager et la supervision des applications (.Net et ...
System Center Operations Manager et la supervision des applications (.Net et ...
 
Google App Engine
Google App EngineGoogle App Engine
Google App Engine
 
Javav formation-java-avance-hibernate-webservices
Javav formation-java-avance-hibernate-webservicesJavav formation-java-avance-hibernate-webservices
Javav formation-java-avance-hibernate-webservices
 

Plus de ENSET, Université Hassan II Casablanca

Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...ENSET, Université Hassan II Casablanca
 
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...ENSET, Université Hassan II Casablanca
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyENSET, Université Hassan II Casablanca
 
Systèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jadeSystèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jadeENSET, Université Hassan II Casablanca
 

Plus de ENSET, Université Hassan II Casablanca (13)

Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka StreamsTraitement distribue en BIg Data - KAFKA Broker and Kafka Streams
Traitement distribue en BIg Data - KAFKA Broker and Kafka Streams
 
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
Mise en oeuvre des Frameworks de Machines et Deep Learning pour les Applicati...
 
Support distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcastSupport distributed computing and caching avec hazelcast
Support distributed computing and caching avec hazelcast
 
Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1 Mise en oeuvre des framework de machines et deep learning v1
Mise en oeuvre des framework de machines et deep learning v1
 
Support programmation orientée objet c# .net version f8
Support programmation orientée objet c#  .net version f8Support programmation orientée objet c#  .net version f8
Support programmation orientée objet c# .net version f8
 
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...Cours design pattern m youssfi partie 8 stat, template method, command , medi...
Cours design pattern m youssfi partie 8 stat, template method, command , medi...
 
Cours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweightCours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweight
 
Cours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapterCours design pattern m youssfi partie 5 adapter
Cours design pattern m youssfi partie 5 adapter
 
Cours design pattern m youssfi partie 4 composite
Cours design pattern m youssfi partie 4 compositeCours design pattern m youssfi partie 4 composite
Cours design pattern m youssfi partie 4 composite
 
Cours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateurCours design pattern m youssfi partie 3 decorateur
Cours design pattern m youssfi partie 3 decorateur
 
Cours design pattern m youssfi partie 2 observer
Cours design pattern m youssfi partie 2 observerCours design pattern m youssfi partie 2 observer
Cours design pattern m youssfi partie 2 observer
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Systèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jadeSystèmes multi agents concepts et mise en oeuvre avec le middleware jade
Systèmes multi agents concepts et mise en oeuvre avec le middleware jade
 

Architecture jee principe de inversion de controle et injection des dependances

  • 1. Architecture JEE Principe de l’inversion de contrôle et d’injection des dépendances MohamedYoussfi Laboratoire Signaux Systèmes Distribués et Intelligence Artificielle (SSDIA) ENSET, Université Hassan II Casablanca, Maroc Email : med@youssfi.net
  • 2. Client HTTP Serveur Web Requête HTTP Réponse HTTP SGBD HTML, CSS, Java Script, Un client web (Browser) communique avec le serveur web (Apache) en utilisant le protocole HTTP Une application web se compose de deux parties: La partie Backend : S’occupe des traitements effectués coté serveur : Technologies utilisées : PHP, JEE, .Net, Node JS La partie Frontend : S’occupe de la présentations des IHM coté Client : Langages utilisés : HTML, CSS, Java Script La communication entre la partie Frontend et la partie backend se fait en utilisant le protocole HTTP 2 Html + CSS+ Java Script PHP JEE Dot Net Node JS
  • 3. Exigences d’un projet informatiqueExigences d’un projet informatique Exigences Fonctionnelles Temps de réponse Problème de montée en charge :Vers une architecture Distribuée scalable Equilibrage de charges et Tolérances aux panes ExigencesTechniques Performances : l’application doit être performante Satisfaire les besoins fonctionnels (métiers) de l’entreprise Une application doit évoluer dans le temps L’application doit être fermée à la modification et ouverte à l’extension Maintenance : l’application doit être facile à maintenir Sécurité : L’application doit prévoir des solutions pour toutes les failles de sécurités Persistances des données dans des SGBD appropriés, Gestion desTransactions Exigences financières : Le coût du logiciel doit respecter les contraites budgétaires Créer différents types de clients pour accéder à l’application :Web, Mobile, Desktop, .. …………
  • 4. Constat Il est très difficile de développer un système logiciel qui respecte ces exigences sans utiliser l’expérience des autres : ◦ Bâtir l’application sur une architecture d’entreprise: JEE ◦ Framework pour l’Inversion de contrôle: Permettre au développeur de s’occuper uniquement du code métier (Exigences fonctionnelles) et c’est le Framework qui s’occupe du code technique (Exigences Techniques) Spring (Conteneur léger) EJB (Conteneur lourd) ◦ Frameworks : Mapping objet relationnel (ORM ) : JPA, Hibernate,Toplink, … Applications Web : Struts, JSF, SpringMVC ◦ Middlewares : RMI, CORBA :Applications distribuées Web Services : JAXWS pour Web services SOAP JAXRS pour les Web services RESTful Communication asynchrone entre les application : JMS : AMQP : A B RMI, CORBA SOAP, REST Communication Synchrone A B Broker: Rabbit MQ Active MQ JMS AMQP JMS AMQP    Communication Asynchrone
  • 5. Exemple : sans utiliser d’inversion de contrôle public void virement(int c1, int c2, double mt) { /* Création d’une transaction */ EntityTransaction transaction=entityManager.getTransaction(); /* Démarrer la transaction */ transaction.begin(); try { /* Code métier */ retirer(c1,mt); verser(c2,mt); /* Valider la transaction */ transaction.commit(); } catch (Exception e) { /* Annuler la transaction en cas d’exception */ transaction.rollback(); e.printStackTrace(); } } med@youssfi.net | ENSET Université Hassan II Code Métier CodeTechnique CodeTechnique
  • 6. Exemple : en utilisant l’inversion de contrôle @Transactional public void virement(int c1, int c2, double mt) { retirer(c1,mt); verser(c2,mt); } med@youssfi.net | ENSET Université Hassan II Code Métier Ici, avec l’annotation @Transactional, nous avons délégué la gestion des transactions au conteneur Spring IOC La séparation des aspects métiers et des apsects techniques d’une application est rendu possible grâce à la Programmation Orientée Aspect (AOP) En utilisant des tisseurs d’aspects comme : - AspectJ - Spring AOP - JBOSS AOP
  • 7. Architecture d’une application Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 8. Architecture d’une application SGBD : • Permet de stocker les données de l’application • Dans la majorité des cas il s’agit d’un SGBD relationnel (SqlServer, MySQL, Oracle, …) • Si la quantité de données sont très importante, on utilise des SGBD NoSQL (Not Only SQL) comme MangoDB, … Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 9. Architecture d’une application Serveur d’application : • Un serveur d’application qui permet de déployer les applications • Il permet de gérer le cycle de vie des applications • Fournie l’infrastructure nécessaire pour faire fonctionner les applications de bonnes qualités • Offre un Framework d’Invertion de Contrôle (IOC) : Spring IOC ou EJB • Exemple : JBoss, Glashfish,Web Sphere, ou encore (Tomcat+Spring,) etc.. Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 10. Architecture d’une application Couche Métier : • Permet d’implémenter la logique métier de l’application • Utilise généralement une approche orientée objet Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 11. Architecture d’une application Couche DAO: • Couche technique qui représente la couche d’accès aux données de l’application • Si les données sont stockées dans une base de données relationnelle, cette couche utilise un Framework de Mapping Objet relationnel implémentant la spécification JPA comme Hibernate,TopLink, etc.. Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 12. Architecture d’une application Couche Web: • Permet d’implémenter la logique présentation Web de l’application ( Servlet et JSP ) • Dans cette partie on utilise des Framework MVC comme Spring MVC, Struts, JSF, .. • Cette couche reçoit le requêtes HTTP du client web • Faire appel à la couche métier pour effectuer les traitement • Envoie un résultat HTML au client, en utilisant un moteur de Template comme Tymeleaf dans une réponse HTTP Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 13. Architecture d’une application Couche Web Services (SOAP): • Permet de définir un web service qui permet à d’autres applications développées avec d’autres langages de faire appel, à distance, aux fonctionnalités de l’application • Le web service reçoit des requête HTTP contenant des messages XML (Requête SOAP) • Exécute des traitement et renvoie le résultat au format XML (Réponse SOAP) • Pour implémenter lesWeb service on utilise la spécification JAXWS Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 14. Architecture d’une application Couche Web Services REST full: • Permet de définir un web service qui permet à d’autres applications développées avec d’autres langages de faire appel, à distance, aux fonctionnalités de l’application • Le service REST reçoit des requête HTTP • Exécute des traitement et renvoie le résultat au client avec différents formats (JSON, XML) • Pour implémenter lesWeb service REST on utilise la spécification JAXRS Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 15. Architecture d’une application Middlewares RMI, CORBA, JMS: • RMI est utilisé pour créer des application distribuées Java • CORBA est utilisé pour créer des applications distribuées hétérogènes • JMS et AMQP sont utilisés pour les applications distribuées asynchrones Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 16. Architecture d’une application IOC Contaniner: • Représente le Framework qui permet de faire l’inversion de contrôle • Permet à l’application de se concentrer uniquement sur le code métier (Exigences fonctionnelles) • Le Container IOC offre à l’applications les services techniques (Sécurité, Gestion de transaction, ORM, etc..) Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 17. Architecture d’une application Client HTTP: • Envoie les requête HTTP à la couche Web de l’application • Reçois les réponse HTTP contenant du HTML, CSS et Java Script • Affiche la Page Web (HTML, CSS, Java Script) • Dans ce scénario, tout est généré coté serveur Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 18. Architecture d’une application ClientWeb (Riche): • Envoie les requête HTTP Ajax au service REST en utilisant Java Script • Ce dernier retourne une réponse HTTP qui contient des données au format JSON • Affiche ces données JSON dans une page HTML. • Dans ce cas c’est le client HTTP qui s’occupe de la présentation • Souvent on utilise un Framework Java Script comme AngularJS ou JQuery Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 19. Architecture d’une application Client Mobile: • Envoie les requête HTTP au service REST • Ce dernier retourne une réponse HTTP qui contient des données au format JSON • Affiche ces données JSON dans l’inteface de l’application mobile Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 20. Architecture d’une application Client Lourd Java, C++, …: • Un client Java peut communiquer avec un autre objet Java du en utilisant le middleware RMI • Un Client écrit avec un autre langage de programmation peut communiquer avec l’application via le middleware CORBA Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 21. Architecture d’une application Client SOAP: • Au lieu de CORBA, une application quelconque peut également communiquer à distance avec le web service en utilisant le protocole SOAP (HTTP+XML) Serveur d’application JEE Web MVC Couche Métier Couche DAO JPA, Hibernate, Spring Data Couche DAO JPA, Hibernate, Spring Data IOC Containner Spring ou EJB)IOC Containner (Spring ou EJB) ApplicationClient Web HTML Client Java, C++ Client SOAP HTTP, HTML RMI, IIOP SOAP SGBDR Ou NoSQL Services de l’infra structure technique JPA, Hibernate, JMS, JNDI, JMX, JCA, JaxWS, JaxRS, RMI, CORBA, MQP… WS SOAP WS REST RMI CORBA JMS,AMQ ClientWeb AngularJS JQuery HTTP, JSON Client Mobile HTTP, JSON
  • 22. med@youssfi.net | ENSET Université Hassan II Inversion de contrôle ou Injection de dépendances
  • 23. med@youssfi.net | ENSET Université Hassan II Rappels de quelque principes de conception Une application qui n’évolue pas meurt. Une application doit être fermée à la modification et ouverte à l’extension. Une application doit s’adapter aux changements … Comment Créer une application fermée à la modification et ouverte à l’extension ? Comment faire l’injection des dépendances ? C’est quoi le principe de l’inversion de contrôle ?
  • 24. med@youssfi.net | ENSET Université Hassan II Couplage Fort et Couplage faible
  • 25. med@youssfi.net | ENSET Université Hassan II Couplage fort Quand une classe A est lié à une classe B, on dit que la classe A est fortement couplée à la classe B. La classe A ne peut fonctionner qu’en présence de la classe B. Si une nouvelle version de la classe B (soit B2), est crée, on est obligé de modifier dans la classe A. Modifier une classe implique: ◦ Il faut disposer du code source. ◦ Il faut recompiler, déployer et distribuer la nouvelle application aux clients. ◦ Ce qui engendre un cauchemar au niveau de la maintenance de l’application A b: B calcul() : double B getValue() : double 1 B2 getValue() : double 1
  • 26. med@youssfi.net | ENSET Université Hassan II Couplage fort Quand une classe A est lié à une classe B, on dit que la classe A est fortement couplée à la classe B. La classe A ne peut fonctionner qu’en présence de la classe B. Si une nouvelle version de la classe B (soit B2), est crée, on est obligé de modifier dans la classe A. Modifier une classe implique: ◦ Il faut disposer du code source. ◦ Il faut recompiler, déployer et distribuer la nouvelle application aux clients. ◦ Ce qui engendre un cauchemar au niveau de la maintenance de l’application A b: B2 calcul() : double B getValue() : double 1 B2 getValue() : double 1
  • 27. med@youssfi.net | ENSET Université Hassan II Exemple de couplage fort package dao; public class DaoImpl { public double getValue(){ return(5); } } MetierImpl dao: DaoImpl calcul() : double DaoImpl getValue() : double 1 package metier; import dao.DaoImpl; public class MetierImpl { private DaoImpl dao; public MetierImpl() { dao=new DaoImpl(); } public double calcul(){ double nb=dao.getValue(); return 2*nb; } } package pres; import metier.MetierImpl; public class Presentation { private static MetierImpl metier; public static void main(String[] args) { metier=new MetierImpl(); System.out.println(metier.calcul()); } } Presentation metier:MetierImpl main(String[] a):void 1
  • 28. med@youssfi.net | ENSET Université Hassan II Problèmes du couplage fort Dans l’exemple précédent, les classes MetierImpl et DaoImpl sont liées par un couplage fort. De même pour les classe Presentation et MetierImpl Ce couplage fort n’a pas empêché de résoudre le problème au niveau fonctionnel. Mais cette conception nous ne a pas permis de créer une application fermée à la modification et ouverte à l’extension. En effet, la création d’une nouvelle version de la méthode getValue() de la classe DaoImpl, va nous obliger d’éditer le code source de l’application aussi bien au niveau de DaoImpl et aussi MetierImpl. De ce fait nous avons violé le principe « une application doit être fermée à la modification et ouverte à l’exetension» Nous allons voir que nous pourrons faire mieux en utilisant le couplage faible.
  • 29. med@youssfi.net | ENSET Université Hassan II Couplage Faible. Pour utiliser le couplage faible, nous devons utiliser les interfaces. Considérons une classe A qui implémente une interface IA, et une classe B qui implémente une interface IB. Si la classe A est liée à l’interface IB par une association, on dit que le classe A et la classe B sont liées par un couplage faible. Cela signifie que la classe B peut fonctionner avec n’importe quelle classe qui implémente l’interface IA. En effet la classe B ne connait que l’interface IA. De ce fait n’importe quelle classe implémentant cette interface peut être associée à la classe B, sans qu’il soit nécéssaire de modifier quoi que se soit dans la classe B. Avec le couplage faible, nous pourrons créer des application fermée à la modification et ouvertes à l’extension. AImpl b: IB calcul() : double BImpl getValue() : double 1 IB getValue() : double IA calcul() : double
  • 30. med@youssfi.net | ENSET Université Hassan II Couplage Faible. Pour utiliser le couplage faible, nous devons utiliser les interfaces. Considérons une classe A qui implémente une interface IA, et une classe B qui implémente une interface IB. Si la classe A est liée à l’interface IB par une association, on dit que le classe A et la classe B sont liées par un couplage faible. Cela signifie que la classe B peut fonctionner avec n’importe quelle classe qui implémente l’interface IA. En effet la classe B ne connait que l’interface IA. De ce fait n’importe quelle classe implémentant cette interface peut être associée à la classe B, sans qu’il soit nécéssaire de modifier quoi que se soit dans la classe B. Avec le couplage faible, nous pourrons créer des application fermée à la modification et ouvertes à l’extension. AImpl b: IB calcul() : double BImpl getValue() : double 1 IB getValue() : double IA calcul() : double BImpl2 getValue() : double <<Extension>>
  • 31. med@youssfi.net | ENSET Université Hassan II Exemple de coupage faible package dao; public class DaoImpl implements IDao { public double getValue() { return 5; } } MetierImpl dao: IDao calcul() : double DaoImpl getValue() : double 1 IDao getValue() : double package dao; public interface IDao { public double getValue(); } package metier; import dao.IDao; public class MetierImpl implements IMetier { private IDao dao; public double calcul() { double nb=dao.getValue(); return 2*nb; } // Getters et Setters } IMetier calcul() : double Presentation metier:IMetier main(String[] a):void 1 package metier; public interface IMetier { public double calcul(); }
  • 32. med@youssfi.net | ENSET Université Hassan II Injection des dépendances  Injection par instanciation statique : import metier.MetierImpl; import dao.DaoImpl; public class Presentation { public static void main(String[] args) { DaoImpl dao=new DaoImpl(); MetierImpl metier=new MetierImpl(); metier.setDao(dao); System.out.println(metier.calcul()); } }
  • 33. med@youssfi.net | ENSET Université Hassan II Injection des dépendances  Injection par instanciation dynamique par réflexion : import java.io.*;import java.lang.reflect.*; import java.util.Scanner; import metier.IMetier; import dao.IDao; public class Presentation { public static void main(String[] args) { try { Scanner scanner=new Scanner(new File("config.txt")); String daoClassname=scanner.next(); String metierClassName=scanner.next(); Class cdao=Class.forName(daoClassname); IDao dao= (IDao) cdao.newInstance(); Class cmetier=Class.forName(metierClassName); IMetier metier=(IMetier) cmetier.newInstance(); Method meth=cmetier.getMethod("setDao",new Class[]{IDao.class}); meth.invoke(metier, new Object[]{dao}); System.out.println(metier.calcul()); } catch (Exception e) { e.printStackTrace(); } } } Fichier texte de configuration : config.txt ext.DaoImp metier.MetierImpl
  • 34. med@youssfi.net | ENSET Université Hassan II Injection des dépendances avec Spring. L'injection de dépendances est souvent la base de tout programme moderne. L'idée en résumé est de déporter la responsabilité de la liaison des composants du programme dans un framework afin de pouvoir facilement changer ces composants ou leur comportement. Parmi les leaders du marché Java, il y a Spring IoC, Guice, Dagger ou encore le standard « Java EE » CDI qui existe depuis Java EE 6. Spring IOC commence par lire un fichier XML qui déclare quelles sont différentes classes à instancier et d’assurer les dépendances entre les différentes instances. Quand on a besoin d’intégrer une nouvelle implémentation à une application, il suffirait de la déclarer dans le fichier xml de beans spring.
  • 35. med@youssfi.net | ENSET Université Hassan II Injection des dépendances dans une application java standard <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN 2.0//EN" "http://www.springframework.org/dtd/spring-beans- 2.0.dtd" > <beans> <bean id="d" class="dao.DaomImpl2"></bean> <bean id="metier" class="metier.MetierImpl"> <property name="dao" ref="d"></property> </bean> </beans> metier:MetierImpl dao: calcul() : double d:DaoImpl getValue() : double
  • 36. med@youssfi.net | ENSET Université Hassan II Injection des dépendances dans une application java standard package pres; import metier.IMetier; import org.springframework.context.support.*; public class Presentation { public static void main(String[] args) { ApplicationContext context=new ClassPathXmlApplicationContext("spring-ioc.xml"); IMetier metier=context.getBean(IMetier.class); System.out.println(metier.calcul()); } }
  • 37. med@youssfi.net | ENSET Université Hassan II Injection par annotations Spring au lieu de XML package dao; @Component("dao") public class DaoImpl implements IDao { public double getValue() { return 5; } } MetierImpl dao: IDao calcul() : double DaoImpl getValue() : double 1 IDao getValue() : double package dao; public interface IDao { public double getValue(); } package metier; import dao.IDao; @Component("metier") public class MetierImpl implements IMetier { @Autowired @Resourse("dao") private IDao dao; public double calcul() { double nb=dao.getValue(); return 2*nb; }} IMetier calcul() : double Presentation metier:IMetier main(String[] a):void 1 package metier; public interface IMetier { public double calcul(); }
  • 38. med@youssfi.net | ENSET Université Hassan II Injection des dépendances dans une application java standard package pres; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.AnnotationConfigApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; import metier.IMetier; public class Presentation { public static void main(String[] args) throws Exception { ApplicationContext ctx=new AnnotationConfigApplicationContext("dao","metier"); //ApplicationContext ctx=new ClassPathXmlApplicationContext("config.xml"); IMetier metier=ctx.getBean(IMetier.class); System.out.println(metier.calcul()); } }
  • 39. Maven Maven, géré par l'organisation Apache Software Foundation. ( Jakarta Project), est un outil pour la gestion et l'automatisation de production des projets logiciels Java en général et Java EE en particulier. L'objectif recherché est de ◦ produire un logiciel à partir de ses sources, ◦ en optimisant les tâches réalisées à cette fin ◦ et en garantissant le bon ordre de fabrication. Compiler,Tester, Contrôler, produire les packages livrables Publier la documentation et les rapports sur la qualité Apports : ◦ Simplification du processus de construction d’une application ◦ Fournit les bonnes pratique de développement ◦ Tend à uniformiser le processus de construction logiciel ◦ Vérifier la qualité du code ◦ Faciliter la maintenance d’un projet med@youssfi.net | ENSET Université Hassan II
  • 40. Maven : POM Maven utilise un paradigme connu sous le nom de Project Object Model (POM) afin de : ◦ Décrire un projet logiciel, ◦ Ses dépendances avec des modules externes ◦ et l'ordre à suivre pour sa production. Il est livré avec un grand nombre de tâches (GOLS) prédéfinies, comme la compilation du code Java ou encore sa modularisation. med@youssfi.net | ENSET Université Hassan II
  • 42. med@youssfi.net | ENSET Université Hassan II Structure du projet
  • 43. med@youssfi.net | ENSET Université Hassan II Injection des dépendances dans une application web Dans une application web, SpringIOC est appelé au démarrage du serveur en déclarant le listener ContextLoaderListener dans le fichier web.xml <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/spring-beans.xml</param-value> </context-param> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> Dans cette déclaration, CotextLoaderListener est appelé par Tomcat au moment du démarrage de l’application. Ce listener cherchera le fichier de beans spring « spring-beans.xml » stocké dans le dossierWEB-INF. ce qui permet de faire l’injection des dépendances entre MetierImpl et DaoImpl
  • 44. CDI : Context Dependency Injection CDI (Context and Dependency Injection) est une spécification destinée à standardiser l'injection de dépendances et de contextes, au sein de la plateforme Java et plus particulièrement Java EE. Intégrée à la spécification Java EE 6, sa version 1.0 est sortie en décembre 2009 et a été suivie des versions 1.1 (mai 2013) et 1.2 (avril 2014). Son élaboration a été le fruit des JSR 299 et 346. Le but de cette spécification est de définir les API et les comportements associés en ce qui concerne ce qu'on appelle communément l'injection de dépendances (inversion de contrôle). Très rapidement, le but de cette dernière est d'avoir un couplage lâche entre nos classes. En d'autres termes, définir un contrat entre les beans, mais faciliter le remplacement d'un maillon de la chaîne très facilement sans avoir à faire les liens et l'initialisation soi- même.
  • 45. Principales implémentations de CDI CDI a trois implémentations principales : ◦ Weld : implémentation de référence de CDI. Utilisé dans GlassFish, JBoss (AS et WildFly) ; ◦ OpenWebBeans : implémentation Apache. Utilisé dansTomEE, OpenEJB, Geronimo,WebSphere ; ◦ CanDi : implémentation Caucho. Utilisé dans Resin.
  • 47. med@youssfi.net | ENSET Université Hassan II Injection par annotations Spring au lieu de XML package dao; @Named public class DaoImpl implements IDao { public double getValue() { return 5; } } MetierImpl dao: IDao calcul() : double DaoImpl getValue() : double 1 IDao getValue() : double package dao; public interface IDao { public double getValue(); } package metier; import dao.IDao; @Singleton @Named public class MetierImpl implements IMetier { @Inject private IDao dao; public double calcul() { double nb=dao.getValue(); return 2*nb; }} IMetier calcul() : double Presentation metier:IMetier main(String[] a):void 1 package metier; public interface IMetier { public double calcul(); }
  • 48. med@youssfi.net | ENSET Université Hassan II Injection des dépendances dans une application java standard package cdi; import org.jboss.weld.environment.se.Weld; import org.jboss.weld.environment.se.WeldContainer; import cdi.metier.IMetier; public class App { public static void main(String[] args) { Weld weld = new Weld(); WeldContainer container = weld.initialize(); IMetier metier=container.select(IMetier.class).get(); System.out.println(metier.calcul()); } } <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> </beans> META-INF/beans.xml