SlideShare uma empresa Scribd logo
1 de 30
1
Spring Ioc
L’Injection de Dépendances
• A la base, il s’agit simplement d’injecter un objet dans un Autre
public class TodosServiceImpl {
private UserService userService;
}
2
userService doit être injecté
L’injection par setter
• 1ère méthode, «classique» : l’injection par setter
• ○ Utilise la convention Java Bean
public class TodosServiceImpl {
private UserService userService;
public void setUserService(UserService userService) {
this.userService = userService;
}
}
3
Spring va appeler cette méthode
L’injection par constructeur
• 2Ème méthode, relativement populaire : utiliser le constructeur de l’objet
public class TodosServiceImpl {
private UserService userService;
public TodosServiceImpl(UserService userService) {
this.userService = userService;
}
}
4
Spring va construire l’objet correctement
L’injection dans un champ
• 3ème méthode : Spring injecte directement dans le champ
oMéthode «magique» : en fait les champs «private» en Java peuvent être modifiés (si
vous venez d’avoir un cours sur Java, on vous a menti)
oDe plus en plus populaire car la méthode la plus simple
public class TodosServiceImpl {
private UserService userService;
}
5
Spring injecte directement dans le champ
6
Inversion de contrôle
ou
Injection de dépendances
dans Spring
 Exigences Fonctionnelles
• Satisfaire les besoins fonctionnels (métiers) de l’entreprises
 Exigences Techniques
• Performances : l’application doit être performante
 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
• Maintenance : l’application doit être facile à maintenir
 Une application doit évoluer dans le temps
 L’application doit être fermée à la modification et ouverte à l’extension
• 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 des Transactions
• Créer différents types de clients pour accéder à l’application : Web, Mobile, Desktop,
 Exigences financières : Le coût du logiciel doit respecter les contraites budgétaires
Exigences d’un projet informatique
7
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 :
8
Exemple : sans utiliser d’inversion de contrôle
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();
}
}
Code Technique
Code Technique
Code Métier
9
Exemple : sans utiliser d’inversion de contrôle
Code Métier
@Transactional
public void virement(int c1, int c2, double mt) {
retirer(c1,mt);
verser(c2,mt);
}
Ici, avec l’annotation @Transactional, nous avons
délégué la gestion des transactions au conteneur
Spring IOC
10
 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
Couplage fort
A
b:B
Calcul(): double
B
11
Couplage Faible
IA
Calcul(): double
IB
getValue()
 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() 12
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());
}
}
13
Injection des dépendances
 Injection par instanciation dynamique par réflexion :
• Fichier texte de configuration : config.txt
ext.DaoImp
metier.MetierImpl
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(); }
}
}
14
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.
15
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.DaomImpl"></bean>
<bean id="metier" class="metier.MetierImpl">
<property name="dao" ref="d"></property>
</bean>
</beans>
D:DaoImpl
getValue()
Metie:MetieImpl
IDao dao
Calcul(): double 16
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=(IMetier) context.getBean("metier");
System.out.println(metier.calcul());
}
}
17
• Annotations compatibles Java 5 et plus
• Objectifs
– Simplifier la configuration (convention over configuration)
– Limiter les fichiers de configuration XML
• Annotations dans Spring
– Annotations spécifiques à des couches d’architecture
• Présentation / Service / DAO (Data Access…)
Configuration par annotations
18
• Gestion des dépendances par annotations
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context.xsd">
<context:annotation-config />
<bean id="..." class="..." />
</beans>
Balise pour « activer » les annotations
Inclusion du namespace context
Configuration XML pour l’injection
19
• Injection automatique des dépendances
• 2 annotations pour la même fonction
– @Autowired : annotation Spring
– @Inject : annotation JSR-330
• Spring supporte les 2 annotations
– @Autowired dispose d’une propriété (required) que n’a pas l’annotation @Inject. Ceci
est utile pour indiquer le caractère facultatif d’une injection.
• Résolution par type
– Se base sur le type de l'objet pour retrouver la dépendance à injecter.
@Autowired ou @Inject
20
import org.springframework.beans.factory.annotation.Autowired;
public class HelloWorldCaller {
@Autowired
private HelloWorld helloWorldService;
public void callHelloWorld(){
helloWorldService.sayHello();
}
}
@Autowired sur un attribut
• Utilisation de @Autowired pour injecter helloWorld
21
@Autowired sur un mutateur
• Utilisation de @Autowired pour injecter helloWorld
import org.springframework.beans.factory.annotation.Autowired;
public class HelloWorldCaller {
private HelloWorld helloWorldService;
@Autowired
public void setHelloWorldService(HelloWorld helloWorldService){
this.helloWorldService=helloWorldService;
}
public void callHelloWorld(){
helloWorldService.sayHello();
}
}
22
• Injection à partir de l’identifiant du bean
• Nécessite Java 6 ou plus
• Se place devant un attribut ou un setter
• Par défaut, le nom est déduit du nom de la méthode (setter) ou de l’attribut
@Resource
package com.spring.formation;
import javax.annotation.Resource;
public class MovieManager {
@Resource(name="myMovieDAO")
private MovieDAO movieDAO;
public MovieManager() {}
public void setMovieDAO(MovieDAO movieDAO) {
this.movieDAO = movieDAO;
}
}
23
@Component : composant générique
@Service : Services métier
@Repository : accès aux données (DAO)
@Controller : contrôleur pour interface graphique (Web)
Stéréotype selon l’usage
24
• A utiliser conjointement à une annotation @Component ou dérivée
• Définit la portée d’un bean
– Par défaut (si non présent) : singleton
package com.spring.formation;
import org.springframework.context.annotation.Scope;
import org.springframework.stereotype.Component;
@Component("monComposant")
@Scope("prototype")
public class MyComponent {
}
@Scope
25
26
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, ContextLoaderListener 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 dossier WEB-INF. ce qui permet
de faire l’injection des dépendances entre MetierImpl et DaoImpl
27
Les composants de Spring
● Un Application Context (une des implémentations de l’interface
org.springframework.context.ApplicationContext) représente le conteneur Spring :
il est chargé de démarrer les beans, de les injecter, de les gérer, de les détruire
● Il en existe plusieurs sortes : WebApplicationContext pour les applications Web
par exemple
● Le rôle de cette classe est de prendre vos objets et votre configuration, et de
faire fonctionner l’ensemble
28
Objets métier
Configuration
Spring Application prête !
Création d’un contexte spécifique aux configurations d’annotations:
public class MainApp {
public static void main(String[] args) {
ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class);
MovieDAO mDAO = (MovieDAO) context.getBean("movieDAO");
}
Chargement du contexte
29
Encore plus facile en Spring Boot
@SpringBootApplication
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
// same as @Configuration @EnableAutoConfiguration @ComponentScan
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
30

Mais conteúdo relacionado

Mais procurados

Application Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateApplication Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateInes Ouaz
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesENSET, Université Hassan II Casablanca
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVCNathaniel Richand
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EEInes Ouaz
 
Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Heithem Abbes
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Ippon
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJosé Paumard
 
Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSyrine Ben aziza
 
WEB SERVICE SOAP, JAVA, XML, JAXWS
WEB SERVICE SOAP, JAVA, XML, JAXWSWEB SERVICE SOAP, JAVA, XML, JAXWS
WEB SERVICE SOAP, JAVA, XML, JAXWSLhouceine OUHAMZA
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les basesAntoine Rey
 
Technologies sur angular.pptx
Technologies sur angular.pptxTechnologies sur angular.pptx
Technologies sur angular.pptxIdrissaDembl
 

Mais procurados (20)

Application Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & HibernateApplication Spring MVC/IOC & Hibernate
Application Spring MVC/IOC & Hibernate
 
Architecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependancesArchitecture jee principe de inversion de controle et injection des dependances
Architecture jee principe de inversion de controle et injection des dependances
 
Presentation Spring, Spring MVC
Presentation Spring, Spring MVCPresentation Spring, Spring MVC
Presentation Spring, Spring MVC
 
Formation JAVA/J2EE
Formation JAVA/J2EEFormation JAVA/J2EE
Formation JAVA/J2EE
 
Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)Entreprise Java Beans (EJB)
Entreprise Java Beans (EJB)
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Spring security
Spring securitySpring security
Spring security
 
Java 11 to 17 : What's new !?
Java 11 to 17 : What's new !?Java 11 to 17 : What's new !?
Java 11 to 17 : What's new !?
 
spring-api-rest.pdf
spring-api-rest.pdfspring-api-rest.pdf
spring-api-rest.pdf
 
Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014Formation Spring Avancé gratuite par Ippon 2014
Formation Spring Avancé gratuite par Ippon 2014
 
Spring annotation
Spring annotationSpring annotation
Spring annotation
 
spring-boot-fr.pdf
spring-boot-fr.pdfspring-boot-fr.pdf
spring-boot-fr.pdf
 
Java 8-streams-collectors-patterns
Java 8-streams-collectors-patternsJava 8-streams-collectors-patterns
Java 8-streams-collectors-patterns
 
Spring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrineSpring boot anane maryem ben aziza syrine
Spring boot anane maryem ben aziza syrine
 
WEB SERVICE SOAP, JAVA, XML, JAXWS
WEB SERVICE SOAP, JAVA, XML, JAXWSWEB SERVICE SOAP, JAVA, XML, JAXWS
WEB SERVICE SOAP, JAVA, XML, JAXWS
 
Presentation Spring
Presentation SpringPresentation Spring
Presentation Spring
 
Workshop Spring - Session 1 - L'offre Spring et les bases
Workshop Spring  - Session 1 - L'offre Spring et les basesWorkshop Spring  - Session 1 - L'offre Spring et les bases
Workshop Spring - Session 1 - L'offre Spring et les bases
 
Spring User Guide
Spring User GuideSpring User Guide
Spring User Guide
 
Angular.pdf
Angular.pdfAngular.pdf
Angular.pdf
 
Technologies sur angular.pptx
Technologies sur angular.pptxTechnologies sur angular.pptx
Technologies sur angular.pptx
 

Semelhante a Spring ioc

Android - TPBonus - web services
Android - TPBonus - web servicesAndroid - TPBonus - web services
Android - TPBonus - web servicesLilia Sfaxi
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniterAtsé François-Xavier KOBON
 
Android-Tp5 : web services
Android-Tp5 : web servicesAndroid-Tp5 : web services
Android-Tp5 : web servicesLilia Sfaxi
 
Marzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvcMarzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvcabderrahim marzouk
 
Java ME by Amdane Samb at BarCamp Goree, December 2010
Java ME by Amdane Samb at BarCamp Goree, December 2010Java ME by Amdane Samb at BarCamp Goree, December 2010
Java ME by Amdane Samb at BarCamp Goree, December 2010Christelle Scharff
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logiciellecyrilgandon
 
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple Watch
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple WatchMobiliteatime #2 - WatchKit, le framework de développement pour l’Apple Watch
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple WatchUSERADGENTS
 
Code flow - Cocoaheads paris
Code flow - Cocoaheads parisCode flow - Cocoaheads paris
Code flow - Cocoaheads parisCocoaHeads France
 
Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Farouk Mezghich
 
SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)Rui Carvalho
 
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...Cyber Security Alliance
 
NodeJS for Mobile App
NodeJS for Mobile AppNodeJS for Mobile App
NodeJS for Mobile AppHabib MAALEM
 
5 android web_service
5 android web_service5 android web_service
5 android web_serviceSaber LAJILI
 
Ateliers : Developpement mobile vs open source
Ateliers : Developpement mobile vs open sourceAteliers : Developpement mobile vs open source
Ateliers : Developpement mobile vs open sourceKorteby Farouk
 
1-supportpoojavapremirepartie-140408132307-phpapp01.pptx
1-supportpoojavapremirepartie-140408132307-phpapp01.pptx1-supportpoojavapremirepartie-140408132307-phpapp01.pptx
1-supportpoojavapremirepartie-140408132307-phpapp01.pptxRihabBENLAMINE
 

Semelhante a Spring ioc (20)

Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Support de cours Spring M.youssfi
Support de cours Spring  M.youssfiSupport de cours Spring  M.youssfi
Support de cours Spring M.youssfi
 
Android - TPBonus - web services
Android - TPBonus - web servicesAndroid - TPBonus - web services
Android - TPBonus - web services
 
Support POO Java Deuxième Partie
Support POO Java Deuxième PartieSupport POO Java Deuxième Partie
Support POO Java Deuxième Partie
 
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
#J2Code2018 - Mettez du feu à vos applications avec CodeIgniter
 
Android-Tp5 : web services
Android-Tp5 : web servicesAndroid-Tp5 : web services
Android-Tp5 : web services
 
Marzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvcMarzouk architecture encouches-jee-mvc
Marzouk architecture encouches-jee-mvc
 
Java ME by Amdane Samb at BarCamp Goree, December 2010
Java ME by Amdane Samb at BarCamp Goree, December 2010Java ME by Amdane Samb at BarCamp Goree, December 2010
Java ME by Amdane Samb at BarCamp Goree, December 2010
 
Qualité logicielle
Qualité logicielleQualité logicielle
Qualité logicielle
 
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple Watch
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple WatchMobiliteatime #2 - WatchKit, le framework de développement pour l’Apple Watch
Mobiliteatime #2 - WatchKit, le framework de développement pour l’Apple Watch
 
Code flow - Cocoaheads paris
Code flow - Cocoaheads parisCode flow - Cocoaheads paris
Code flow - Cocoaheads paris
 
Tuto bada
Tuto badaTuto bada
Tuto bada
 
Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)Formation iPhone ENSI by (Orange Tunisie)
Formation iPhone ENSI by (Orange Tunisie)
 
SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)SPA avec Angular et SignalR (FR)
SPA avec Angular et SignalR (FR)
 
Formation gwt
Formation gwtFormation gwt
Formation gwt
 
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
ASFWS 2012 - Le développement d’applications sécurisées avec Android par Joha...
 
NodeJS for Mobile App
NodeJS for Mobile AppNodeJS for Mobile App
NodeJS for Mobile App
 
5 android web_service
5 android web_service5 android web_service
5 android web_service
 
Ateliers : Developpement mobile vs open source
Ateliers : Developpement mobile vs open sourceAteliers : Developpement mobile vs open source
Ateliers : Developpement mobile vs open source
 
1-supportpoojavapremirepartie-140408132307-phpapp01.pptx
1-supportpoojavapremirepartie-140408132307-phpapp01.pptx1-supportpoojavapremirepartie-140408132307-phpapp01.pptx
1-supportpoojavapremirepartie-140408132307-phpapp01.pptx
 

Mais de Lhouceine OUHAMZA (9)

Présentation sur internet.pptx
Présentation sur internet.pptxPrésentation sur internet.pptx
Présentation sur internet.pptx
 
Prometheus and Grafana
Prometheus and GrafanaPrometheus and Grafana
Prometheus and Grafana
 
Kubernetes
KubernetesKubernetes
Kubernetes
 
Scrum course
Scrum courseScrum course
Scrum course
 
Jenkins
JenkinsJenkins
Jenkins
 
Functional programming
Functional programmingFunctional programming
Functional programming
 
Spring AOP
Spring AOPSpring AOP
Spring AOP
 
Extreme Programming (XP)
Extreme Programming (XP)Extreme Programming (XP)
Extreme Programming (XP)
 
Systemes authentification
Systemes authentificationSystemes authentification
Systemes authentification
 

Último

Algo II: les files cours + exercices corrigés
Algo II: les files cours + exercices corrigésAlgo II: les files cours + exercices corrigés
Algo II: les files cours + exercices corrigésSana REFAI
 
firefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdffirefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdffirstjob4
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestionyakinekaidouchi1
 
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Ville de Châteauguay
 
optimisation logistique MLT_231102_155827.pdf
optimisation logistique  MLT_231102_155827.pdfoptimisation logistique  MLT_231102_155827.pdf
optimisation logistique MLT_231102_155827.pdfSoukainaMounawir
 
conception d'un batiment r+4 comparative de defferente ariante de plancher
conception d'un  batiment  r+4 comparative de defferente ariante de plancherconception d'un  batiment  r+4 comparative de defferente ariante de plancher
conception d'un batiment r+4 comparative de defferente ariante de planchermansouriahlam
 

Último (7)

JTC 2024 Bâtiment et Photovoltaïque.pdf
JTC 2024  Bâtiment et Photovoltaïque.pdfJTC 2024  Bâtiment et Photovoltaïque.pdf
JTC 2024 Bâtiment et Photovoltaïque.pdf
 
Algo II: les files cours + exercices corrigés
Algo II: les files cours + exercices corrigésAlgo II: les files cours + exercices corrigés
Algo II: les files cours + exercices corrigés
 
firefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdffirefly algoriyhm sac a dos step by step .pdf
firefly algoriyhm sac a dos step by step .pdf
 
comprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestioncomprehension de DDMRP dans le domaine de gestion
comprehension de DDMRP dans le domaine de gestion
 
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
Présentation_Soirée-Information_ Surverse_Thibert _30 avril 2024
 
optimisation logistique MLT_231102_155827.pdf
optimisation logistique  MLT_231102_155827.pdfoptimisation logistique  MLT_231102_155827.pdf
optimisation logistique MLT_231102_155827.pdf
 
conception d'un batiment r+4 comparative de defferente ariante de plancher
conception d'un  batiment  r+4 comparative de defferente ariante de plancherconception d'un  batiment  r+4 comparative de defferente ariante de plancher
conception d'un batiment r+4 comparative de defferente ariante de plancher
 

Spring ioc

  • 2. L’Injection de Dépendances • A la base, il s’agit simplement d’injecter un objet dans un Autre public class TodosServiceImpl { private UserService userService; } 2 userService doit être injecté
  • 3. L’injection par setter • 1ère méthode, «classique» : l’injection par setter • ○ Utilise la convention Java Bean public class TodosServiceImpl { private UserService userService; public void setUserService(UserService userService) { this.userService = userService; } } 3 Spring va appeler cette méthode
  • 4. L’injection par constructeur • 2Ème méthode, relativement populaire : utiliser le constructeur de l’objet public class TodosServiceImpl { private UserService userService; public TodosServiceImpl(UserService userService) { this.userService = userService; } } 4 Spring va construire l’objet correctement
  • 5. L’injection dans un champ • 3ème méthode : Spring injecte directement dans le champ oMéthode «magique» : en fait les champs «private» en Java peuvent être modifiés (si vous venez d’avoir un cours sur Java, on vous a menti) oDe plus en plus populaire car la méthode la plus simple public class TodosServiceImpl { private UserService userService; } 5 Spring injecte directement dans le champ
  • 6. 6 Inversion de contrôle ou Injection de dépendances dans Spring
  • 7.  Exigences Fonctionnelles • Satisfaire les besoins fonctionnels (métiers) de l’entreprises  Exigences Techniques • Performances : l’application doit être performante  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 • Maintenance : l’application doit être facile à maintenir  Une application doit évoluer dans le temps  L’application doit être fermée à la modification et ouverte à l’extension • 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 des Transactions • Créer différents types de clients pour accéder à l’application : Web, Mobile, Desktop,  Exigences financières : Le coût du logiciel doit respecter les contraites budgétaires Exigences d’un projet informatique 7
  • 8. 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 : 8
  • 9. Exemple : sans utiliser d’inversion de contrôle 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(); } } Code Technique Code Technique Code Métier 9
  • 10. Exemple : sans utiliser d’inversion de contrôle Code Métier @Transactional public void virement(int c1, int c2, double mt) { retirer(c1,mt); verser(c2,mt); } Ici, avec l’annotation @Transactional, nous avons délégué la gestion des transactions au conteneur Spring IOC 10
  • 11.  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 Couplage fort A b:B Calcul(): double B 11
  • 12. Couplage Faible IA Calcul(): double IB getValue()  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() 12
  • 13. 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()); } } 13
  • 14. Injection des dépendances  Injection par instanciation dynamique par réflexion : • Fichier texte de configuration : config.txt ext.DaoImp metier.MetierImpl 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(); } } } 14
  • 15. 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. 15
  • 16. 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.DaomImpl"></bean> <bean id="metier" class="metier.MetierImpl"> <property name="dao" ref="d"></property> </bean> </beans> D:DaoImpl getValue() Metie:MetieImpl IDao dao Calcul(): double 16
  • 17. 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=(IMetier) context.getBean("metier"); System.out.println(metier.calcul()); } } 17
  • 18. • Annotations compatibles Java 5 et plus • Objectifs – Simplifier la configuration (convention over configuration) – Limiter les fichiers de configuration XML • Annotations dans Spring – Annotations spécifiques à des couches d’architecture • Présentation / Service / DAO (Data Access…) Configuration par annotations 18
  • 19. • Gestion des dépendances par annotations <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd"> <context:annotation-config /> <bean id="..." class="..." /> </beans> Balise pour « activer » les annotations Inclusion du namespace context Configuration XML pour l’injection 19
  • 20. • Injection automatique des dépendances • 2 annotations pour la même fonction – @Autowired : annotation Spring – @Inject : annotation JSR-330 • Spring supporte les 2 annotations – @Autowired dispose d’une propriété (required) que n’a pas l’annotation @Inject. Ceci est utile pour indiquer le caractère facultatif d’une injection. • Résolution par type – Se base sur le type de l'objet pour retrouver la dépendance à injecter. @Autowired ou @Inject 20
  • 21. import org.springframework.beans.factory.annotation.Autowired; public class HelloWorldCaller { @Autowired private HelloWorld helloWorldService; public void callHelloWorld(){ helloWorldService.sayHello(); } } @Autowired sur un attribut • Utilisation de @Autowired pour injecter helloWorld 21
  • 22. @Autowired sur un mutateur • Utilisation de @Autowired pour injecter helloWorld import org.springframework.beans.factory.annotation.Autowired; public class HelloWorldCaller { private HelloWorld helloWorldService; @Autowired public void setHelloWorldService(HelloWorld helloWorldService){ this.helloWorldService=helloWorldService; } public void callHelloWorld(){ helloWorldService.sayHello(); } } 22
  • 23. • Injection à partir de l’identifiant du bean • Nécessite Java 6 ou plus • Se place devant un attribut ou un setter • Par défaut, le nom est déduit du nom de la méthode (setter) ou de l’attribut @Resource package com.spring.formation; import javax.annotation.Resource; public class MovieManager { @Resource(name="myMovieDAO") private MovieDAO movieDAO; public MovieManager() {} public void setMovieDAO(MovieDAO movieDAO) { this.movieDAO = movieDAO; } } 23
  • 24. @Component : composant générique @Service : Services métier @Repository : accès aux données (DAO) @Controller : contrôleur pour interface graphique (Web) Stéréotype selon l’usage 24
  • 25. • A utiliser conjointement à une annotation @Component ou dérivée • Définit la portée d’un bean – Par défaut (si non présent) : singleton package com.spring.formation; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Component; @Component("monComposant") @Scope("prototype") public class MyComponent { } @Scope 25
  • 26. 26
  • 27. 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, ContextLoaderListener 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 dossier WEB-INF. ce qui permet de faire l’injection des dépendances entre MetierImpl et DaoImpl 27
  • 28. Les composants de Spring ● Un Application Context (une des implémentations de l’interface org.springframework.context.ApplicationContext) représente le conteneur Spring : il est chargé de démarrer les beans, de les injecter, de les gérer, de les détruire ● Il en existe plusieurs sortes : WebApplicationContext pour les applications Web par exemple ● Le rôle de cette classe est de prendre vos objets et votre configuration, et de faire fonctionner l’ensemble 28 Objets métier Configuration Spring Application prête !
  • 29. Création d’un contexte spécifique aux configurations d’annotations: public class MainApp { public static void main(String[] args) { ApplicationContext context = new AnnotationConfigApplicationContext(AppConfig.class); MovieDAO mDAO = (MovieDAO) context.getBean("movieDAO"); } Chargement du contexte 29
  • 30. Encore plus facile en Spring Boot @SpringBootApplication import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; @SpringBootApplication // same as @Configuration @EnableAutoConfiguration @ComponentScan public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } } 30