Download - Spring, une introduction

Transcript
Page 1: Spring, une introduction

Khaled BEN DRISS

[email protected]

le samedi 12 avril 2008

Faculté des Sciences de Tunis

Page 2: Spring, une introduction

[email protected]

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

Page 3: Spring, une introduction

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);

Page 4: Spring, une introduction

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

Page 5: Spring, une introduction

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

Page 6: Spring, une introduction

15/04/2008 Présentation Spring 6

Posons le problème !

Page 7: Spring, une introduction

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, …!!!),

Page 8: Spring, une introduction

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 .

Page 9: Spring, une introduction

15/04/2008 Présentation Spring 9

coupler un composant à un autre (3)

le couplage par interface Sans Ioc (Inversion de Contrôle)

Page 10: Spring, une introduction

15/04/2008 Présentation Spring 10

coupler un composant à un autre avec Ioc

le couplage par interface Avec Ioc (Inversion de Contrôle)

Page 11: Spring, une introduction

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);

Page 12: Spring, une introduction

15/04/2008 Présentation Spring 12

sans Ioc (Inversion de control)

Page 13: Spring, une introduction

15/04/2008 Présentation Spring 13

Avec Ioc (Inversion de control)

http://www.martinfowler.com/articles/injection.html

Page 14: Spring, une introduction

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;

Page 15: Spring, une introduction

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.

Page 16: Spring, une introduction

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

Page 17: Spring, une introduction

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 ……

}

Page 18: Spring, une introduction

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>

Page 19: Spring, une introduction

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.

Page 20: Spring, une introduction

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;

} }

Page 21: Spring, une introduction

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.

Page 22: Spring, une introduction

15/04/2008 Présentation Spring 22

Spring galaxy!

Page 23: Spring, une introduction

15/04/2008 Présentation Spring 23

Application web avec Spring!

Page 24: Spring, une introduction

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

Page 25: Spring, une introduction

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.

Page 26: Spring, une introduction

15/04/2008 Présentation Spring 26

Sources

- Spring fwk

- doc de Thierry Templier sur OSSGTP

-