Spring, une introduction
-
Author
teejug -
Category
Technology
-
view
2.776 -
download
0
Embed Size (px)
Transcript of Spring, une introduction

Khaled BEN DRISSExecutive Partner
� Ingénieur de l'Ecole Centrale de Lyon� Docteur de l'Université Paris 6� Ancien Maître Assistant à l'EPT�Fondateur Net-progress

15/04/2008 Présentation Spring 3
Objectifs de la présentation
•Offrir une vision globale du frameworkSpring et de ses objectifs;
•Positionnement du framework dans une architecture J2EE
•Présentation des bases du framework(Spring Core);

15/04/2008 Présentation Spring 4
Design pattern
Un design pattern est un motif de Conception dont le rôle est d’implémenter un mécanisme
générique répondant à une problématique récurrente sur un projet
Un Design Pattern est indépendant des technologies d’implémentation sous-jacentes
Idée de réutilisation d’une solution éprouvée concernant une problématique maintes fois rencontrées

15/04/2008 Présentation Spring 5
Pourquoi utiliser les Patterns
Une ré-utilisabilité généralisée
Eviter la duplication :
� factoriser les fonctions
� partager des objets
� rendre compatible :
Ré-utilisabilité
� couplage faible
� programmation evénementielle
� cadre d'extension:
� séparer la création de l'usage
� séparer abstraction et implantation
� extension "externe"
cacher la complexité
� séparer structure et opération:
� simplifier l' interface

15/04/2008 Présentation Spring 6
Posons le problème !

15/04/2008 Présentation Spring 7
coupler un composant à un autre (1)
Il existe plusieurs manières de coupler un composant d'un autre. La première appelée couplage par implémentation consiste à
créer une dépendance forte avec l'implémentation du composant tiers.
Prenons un exemple :
public class MyBusinessObject {
LoginAuthentification l = new LoginAuthentification(ConnString) ;
l.authenticate(« AliBaba","1RE54");
}
Cette manière est conseillée uniquement lorsque vous maîtrisez les évolutions de la classe LoginAuthentication dont la pérennité
est assurée.
En effet, non seulement l'assemblage du composant LoginAuthenticationdevra être connue et déployée en même
temps que votre application (si on change vers LDAP, …!!!),

15/04/2008 Présentation Spring 8
coupler un composant à un autre (2)
Il existe plusieurs manières de coupler un composant d'un autre. la seconde forme de couplage sur laquelle s'appuie le pattern IoC : le couplage par interface.
Exemple :
public class MyBusinessObject {
IAuthentification l = new MyLoginAuthentification(ConnString) ;
l.authenticate("Mister Dupont","1RE54");
}
public interface IAuthentification {
public boolean authenticate(String login, String passwd);
}
les clients sont liés à des interfaces pérennes dans le temps.
Mais MyBusinessObject est lié MyLoginAuthentification, et le changement ne peut se faire que sur le code source java .

15/04/2008 Présentation Spring 9
coupler un composant à un autre (3)
le couplage par interface Sans Ioc (Inversion de Contrôle)

15/04/2008 Présentation Spring 10
coupler un composant à un autre avec Ioc
le couplage par interface Avec Ioc (Inversion de Contrôle)

15/04/2008 Présentation Spring 11
coupler un composant à un autre (3)
Avec IocLe principe consiste à inverser
le contrôle avec une classe
supplémentaire chargée d'initialiser
les dépendances entre les différents
composants.
On ajoute une indirection
et on sort ainsi des composants la
responsabilité de créer les
classes dépendantes.
La classe Initializer réalise l'inversion :
myobj = new MyBusinessObject() ;
IAuthentification auth = new AuthentificationImpl();
myobj.setAuth(auth);

15/04/2008 Présentation Spring 12
sans Ioc (Inversion de control)

15/04/2008 Présentation Spring 13
Avec Ioc (Inversion de control)
http://www.martinfowler.com/articles/injection.html

15/04/2008 Présentation Spring 14
Quelques définitions
Quelques définitions
� POJO (Plain Old Java Object): Il s’agit d’un objet Java simple et classique;
� IoC (Inversion of Control): Pattern permettant de fournir aux POJOsles objets qu’ils vont utiliser;
�

15/04/2008 Présentation Spring 15
Conteneurs légers
�Framework permettant de gérer différents types de POJOs ainsi que leur cycle de vie (léger par opposition aux EJBs).
�un Framework bien implémenté doit évoluer de manière interne sans imposer de modification structurelle aux composants applicatifs!
�Exemple
�Spring, Pico, Avalon ou HiveMind.

15/04/2008 Présentation Spring 16
Injection de dépendance par accesseurs (Setter Injection)
Un exemple
public class Composant1Impl
implements Composant1 {
private Composant2 c2;
public void monTraitement() {
c2.unAutreTraitement();
}
public void setC2(Composant2 c2) { this.c2=c2; }
public Composant2 getC2() { return c2; }
}
public class Composant2Impl
implements Composant2 {
public void unAutreTraitement() {
…
}
}
� On récupère une instance de Composant1Impl via le conteneur léger:
� Il se charge d’instancier le composant;
� Il instancie les dépendances (Composant2Impl) et les injecte dans le composant.
� On peut utiliser les méthodes du composant directement.
� Setter Injection : méthode préférée pour Spring

15/04/2008 Présentation Spring 17
Injection de dépendance par accesseurs (Setter Injection)
<bean id=”exampleBean1” class=”examples.ExampleBean”>
<property name=”beanOne”><ref bean=”anotherBean”/></property>
<propetry name=”beanTwo”><ref bean=”someBean” /></propery>
<property name="integerProperty">1</property>
</bean>
<bean id=”anotherBean” class=”examples.AnotherBean” />
<bean id=”someBean” class=”examples.SomeBean” />
public class ExampleBean {
private IAnotherBean beanOne;
private ISomeBean beanTwo;
private int integerProperty;
public void setBeanOne(IAnotherBean beanOne) { this.beanOne = beanOne; }
public void setBeanTwo(ISomeBean beanTwo ) { this.beanTwo = beanTwo; }
public void setIntegerProperty(int i ) { this.i = i; }
// utilisation des beans ……
}

15/04/2008 Présentation Spring 18
Injection de dépendance par accesseurs (Setter Injection)
<bean id=”exampleBean1” class=”examples.ExampleBean”>
<property name=”beanOne”><ref bean=”anotherBean”/></property>
<propetry name=”beanTwo”><ref bean=”someBean” /></propery>
<property name="integerProperty">1</property>
</bean>
<bean id=”anotherBean” class=”examples.AnotherBean” />
<bean id=”someBean” class=”examples.someBean” />
<bean id=”anotherBean2” class=”examples.AnotherBean2” />
<bean id=”someBean2” class=”examples.someBean2” />
<bean id=”exampleBean2” class=”examples.ExampleBean”>
<property name=”beanOne”><ref bean=”anotherBean2”/></property>
<propetry name=”beanTwo”><ref bean=”someBean2” /></propery>
<property name="integerProperty">123</property>
</bean>

15/04/2008 Présentation Spring 19
Injection de dépendance par constructeur
Un exemple
public class BusinessObject {
IAuthentication _auth ;
public BusinessObject(IAuthentication auth) { this._auth=auth; }
}
� cette méthode d'injection impose au client de résoudre tous les liens vers d'autres composants à l'initialisation dans son constructeur. Cela peut nuire à la lisibilité du code si les paramètres sont nombreux, et en présence d'un arbre d'héritage complexe, cette écriture peut vite s'avérer très lourde.

15/04/2008 Présentation Spring 20
Injection de dépendance par constructeur
<bean id=”exampleBean” class=”examples.ExampleBean”><constructor-arg><ref bean=”anotherBean”/></constructor-arg>
<constructor-arg><ref bean=”someBean”/></constructor-arg>
<constructor-arg>1</constructor-arg>
</bean>
<bean id=”anotherBean” class=”examples.AnotherBean” />
<bean id=”someBean” class =”examples.SomeBean”/>
Public class ExampleBean {private AnotherBean beanOne;
private SomeBean beanTwo;
private int i;
public ExampleBean ( AnotherBean anotherBean, SomeBean someBean, int i ) {
this.beanOne = anotherBean;
this.beanTwo = someBean;
this.i = i;
} }

15/04/2008 Présentation Spring 21
Spring
Spring est un conteneur léger implémentant l’IoC.
En quoi Spring est-il différent des autres frameworks:
� Spring va plus loin que l’IoC;
� Spring est très complet et modulaire (il est possible de n’utiliser qu’une partie du framework);
� Spring s’intègre facilement avec d’autres frameworks (le but n’est pas de « réinventer la roue » - si un framework adresse bien une problématique, il s’intègre avec);
� Spring facilite la programmation en couche et par composant (en offrant des facilités pour chaque couche), permet de structurer plus facilement les applications et de découpler les composants;
� Spring fournit des exceptions génériques pour les DAO;
� Spring fournit un niveau d’abstraction avec les APIs J2EE;
� Spring adresse les problématiques techniques transverses (transactions, sécurité, exceptions);
� Spring inclut un framework AOP basé sur l’IoC.

15/04/2008 Présentation Spring 22
Spring galaxy!

15/04/2008 Présentation Spring 23
Application web avec Spring!

15/04/2008 Présentation Spring 24
Architecture en couches
� Gestion des composants des couches;
� Gestion des dépendances entre les composants (assemblage);
� Intégration avec les APIs et frameworks d’accès aux données;
� Gestion transactionnelle générique et flexible (transactions locales ou globales);
� Exceptions génériques non checkées pour la couche DAO;
� Implémentation MVC (web, portlet, web flow) et intégration;
� Gestion de la sécurité (framework Acegi).
Présentation Application Services
(métier)
Accès aux données
(DAO)
Persistence
Pattern MVC Mismatch Paradigm
Transactions
Authentification / autorisations
Exceptions
Rupture de protocole
Interceptions
Interceptions

15/04/2008 Présentation Spring 25
Frameworks annexes
Acegi
� Framework de sécurité basé sur Spring
Spring Modules
� Framework fournissant des intégrations avec divers frameworks (workflow, moteur de règles, cache, hivemind, jakarta-common, lucene…)
Spring .Net
� Portage de Spring en technologie .Net
Spring RCP (Rich Client Project)
� Framework basé sur Spring pour le développement d’applications Swing
Spring IDE for Eclipse
� Plugin pour Eclipse
Les intégrations Struts/Spring et JSF/Spring sont incluses dans Spring.

15/04/2008 Présentation Spring 26
Sources
- Spring fwk
- doc de Thierry Templier sur OSSGTP
-