Niveau : | Supérieur |
Spring est un socle pour le développement d'applications, principalement d'entreprises mais pas obligatoirement. Il fournit de nombreuses fonctionnalités parfois redondantes ou qui peuvent être configurées ou utilisées de plusieurs manières : ceci laisse le choix au développeur d'utiliser la solution qui lui convient le mieux et/ou qui répond aux besoins.
Spring est ainsi un des frameworks les plus répandus dans le monde Java : sa popularité a grandie au profit de la complexité de Java EE notamment pour ses versions antérieures à la version 5 mais aussi grâce à la qualité et la richesse des fonctionnalités qu'il propose :
- son coeur reposant sur un conteneur de type IoC assure la gestion du
cycle de vies des beans et l'injection des dépendances
- l'utilisation de l'AOP
- des projets pour faciliter l'intégration avec de nombreux projets open source ou API de Java EE
Spring était un framework applicatif à ses débuts mais maintenant c'est une véritable plate-forme composée du framework Spring, de projets qui couvrent de nombreux besoins et de middlewares.
Spring permet une grande flexibilité dans les fonctionnalités et les projets utilisés dans une application. Il est par exemple possible d'utiliser le conteneur Spring pour gérer de façon basique les beans sans utiliser l'AOP. Par contre, certains projets et certaines fonctionnalités ont des dépendances avec d'autres projets.
Spring est associé à la notion de conteneur léger (lightweight container) par opposition aux conteneurs lourds que sont les serveurs d'applications Java EE.
Le site officiel du framework Spring est à l'url https://spring.io
Ce chapitre contient plusieurs sections :
Le but de Spring est de faciliter et de rendre productif le développement d'applications, particulièrement les applications d'entreprises.
Spring propose de nombreuses fonctionnalités de base pour le développement d'applications :
- un conteneur léger implémentant le design pattern IoC pour la gestion des
objets et de leurs dépendances en offrant des fonctionnalités avancées
concernant la configuration et l'injection automatique. Un de ses points forts
est d'être non intrusif dans le code de l'application tout en permettant
l'assemblage d'objets faiblement couplés.
- une gestion des transactions par déclaration offrant une abstraction du
gestionnaire de transactions sous-jacent
- faciliter le développement des DAO de la couche de persistance en
utilisant JDBC, JPA, JDO ou une solution open source comme Hibernate, iBatis,
... et une hiérarchie d'exceptions
- un support pour un usage interne à Spring (notamment dans les
transactions) ou personnalisé de l'AOP qui peut être mis en oeuvre avec Spring
AOP pour les objets gérés par le conteneur et/ou avec AspectJ
- faciliter la testabilité de l'application
- ...
Spring favorise l'intégration avec de nombreux autres frameworks notamment ceux de type ORM ou web.
Une application typique utilisant Spring est généralement structurée en trois couches :
- la couche présentation : interface homme machine
- la couche service : interface métier avec mise en oeuvre de certaines
fonctionnalités (transactions, sécurité, ...)
- la couche accès aux données : recherche et persistance des objets du
domaine
Spring est utilisé pour créer et injecter les objets requis de la couche précédente.
Les objets du domaine sont utilisés dans les échanges entre ces couches. Les objets du domaine ne sont pas créés ni gérés par Spring : ils sont instanciés directement en utilisant l'opérateur new. Il peut donc exister de nombreuses instances uniques des objets du domaine.
Le framework Spring a été initialement développé par Rod Johnson et Juergen Holler.
Spring a connu plusieurs versions :
- Spring 1.0 : mars 2004
- Spring 1.1 : septembre 2004
- Spring 1.2 : mai 2005
- Spring 2.0 : octobre 2006
- Spring 2.5 : novembre 2007
- Spring 3.0 : décembre 2009
- Spring 3.1 : courant 2011
Spring 1.0 implémente les fonctionnalités de base du framework :
- le conteneur qui implémente le motif de conception IoC
- le développement orienté POJO
- l'AOP par déclaration
- le support de JDBC, ORM et frameworks Web
- la configuration XML basée sur une DTD
Spring 1.2
- support de JMX
- support JDO 2, Hibernate 3, TopLink
- support de JCA CCI, JDBC Rowset
- déclaration des transactions avec @Transactional
Spring 2.0 apporte de nombreuses nouveautés :
- le support et l'utilisation d'AspectJ
- la configuration XML basée sur un schéma XML
- des simplifications de la configuration notamment avec des namespaces dédiés (beans, tx, aop, lang, util, jee, p)
- les Message Driven POJO
- les annotations @Repository, @Configurable
Spring 2.5 apporte de nombreuses nouveautés pour faciliter sa configuration :
- l'ajout de nouveaux namespaces (context, jms) avec de nouveaux tags
- l'enrichissement des namespaces existants (jee, aop)
- l'ajout d'annotations concernant le cycle de vie des beans (@Service, @Component,
@Controller), autowiring (@Autowired, @Qualifier, @Required), la gestion des
transactions (@Transactional) et support des annotations standards de Java 5
(@PostConstruct, @PreDestroy, @Resource)
- les tests d'intégration reposant sur Junit 4 et des annotations
(@ContextConfiguration, @TestExecutionListeners, @BeforeTransaction,
@AfterTransaction)
Spring 3.0 apporte de nombreuses nouveautés pour sa configuration et les fonctionnalités proposées :
- des possibilités enrichies de configurer le
context en utilisant des annotations : annotations issues du projet Spring
JavaConfig qui sont ajoutées dans Spring Core (@Configuration, @Bean, @DependsOn,
@Primary, @Lazy, @Import, @ImportResource et @Value)
- Spring Expression Langage (SpEL) : un
langage d'expressions utilisable pour la définition des beans dans Spring Core
et pour certaines fonctionnalités dans des projets du portfolio
- le support de REST
- Object to XML Mapping (OXM) : abstraction
pour utiliser des solutions de mapping objet/XML initialement proposée par le
projet Spring Web services et intégrée dans Spring Core
- requiert un Java SE 5.0 ou supérieur (refactoring des API pour une utilisation
des generics, des varargs, de java.util.concurrent, ...)
- une nouvelle modularisation : la distribution de Spring en jar a été revue pour que chaque module ait son propre jar. L'archive spring.jar n'est plus proposée
- le support de moteurs de bases de données embarquées (Derby, HSQL, H2)
- le support de la validation (JSR 303), du data binding et de la conversion de type
- le support JSR 330
- le scheduling par configuration, annotations (@Async, @Scheduled) ou API
- l'ajout de nouveaux namespaces (task, jdbc, mvc)
- la compatibilité forte avec Spring 2.5
- le support de l'API Porlet 2.0 par Spring MVC
Spring 3.1 :
- support des conversations
- support des caches
- ajout de la notion de profile qui permet d'avoir des configurations du context différentes pour chaque environnement
- ajout de nouvelles annotations pour définir certaines fonctionnalités de namespaces dans la configuration
- support des servlets 3.0
Spring Framework contient toutes les fonctionnalités de base pour développer des applications.
Le coeur de Spring Framework 3.0 est composé d'un ensemble d'une vingtaine de modules qui sont regroupés en plusieurs parties :
- Spring Core Container : regroupe les modules de base pour mettre en oeuvre le conteneur
- AOP and Instrumentation : permet de mettre en oeuvre l'AOP
- Data Acces/Integration : regroupe les modules d'accès aux données
- Web : regroupe les modules pour le développement d'applications web
- Test : propose des fonctionnalités pour les tests automatisés avec Spring
La partie Spring Core Container contient plusieurs modules :
- Spring Core et Spring Beans : contiennent les fonctionnalités de base notamment le conteneur et des utilitaires
- Spring Context : propose un support de la définition du context Spring (sa configuration) mais aussi des fonctionnalités de base comme le mail, l'internationalisation, JNDI, ...
- Spring Expression Langage (SpEL) : propose un langage d'expressions pour interroger et manipuler les objets gérés par le conteneur
La partie AOP and Instrumentation contient plusieurs parties :
- Spring AOP : propose un support de l'AOP
- AspectJ : propose une intégration d'AspectJ
- Instrumentation : propose une instrumentation des classes et
plusieurs implémentations de classloaders utilisés par certains serveurs
d'applications
La partie Data Acces/Integration contient plusieurs modules
- Spring JDBC : propose une abstraction de l'utilisation de JDBC avec
notamment une hiérarchie d'exceptions dédiées
- Spring ORM : propose un support pour des outils de type ORM (JPA, JDO,
Hibernate, iBatis)
- Spring Transaction : propose un support déclaratif et par programmation
de la gestion des transactions
- Spring OXM : propose une abstraction pour le mapping objet/XML avec un support
de JAXB, Castor, XMLBeans, JiBX et XStream
- Spring JMS : propose des fonctionnalités pour faciliter la mise en
oeuvre de JMS avec Spring
La partie Web contient plusieurs modules :
- Spring Web : propose des fonctionnalités de base pour les développements
web (initialisation du conteneur, gestion des contextes, support multipart,
extraction des paramètres d'une requête http, ...)
- Spring Web-Servlet : framework pour le développement d'applications
qui met en oeuvre le motif de conception MVC. Ceci permet entre autres de choisir
la technologie utilisée pour la vue (JSP, Velocity, Tiles, iText, ...)
- Spring Web-Struts : propose un support de Struts
- Spring Web-Portlet : propose un support pour les portlets
La partie Test contient un seul module :
- Spring Test : propose un support pour les tests automatisés avec un
support de JUnit et TestNG
Ces modules sont utilisés comme base pour le développement d'applications.
Spring propose aussi un ensemble très complet de modules additionnels qui ne cesse de s'enrichir pour faciliter la mise en oeuvre de certaines fonctionnalités dans les applications.
Ainsi, Spring est un portfolio de nombreux projets qui couvrent un grand nombre de besoins. Tous ces projets reposent sur le coeur de Spring : Spring Core.
Voici une liste non exhaustive de ces projets :
- Spring Framework : contient les fonctionnalités de base de
Spring
- Spring Web Flow : permet de gérer l'enchaînement des pages d'une
application web
- Spring BlazeDS Integration : a pour but de simplifier le
développement d'applications qui utilisent Spring, Adobe BlazeDS et Adobe Flex
pour la partie IHM
- Spring Web Services : permet de développer des services web de
type SOAP orientés document en utilisant la manière contract first
- Spring Roo : permet le développement rapide d'applications
reposant sur Spring. Roo repose sur une grande partie de configuration et fait
un usage intensif de l'AOP.
- Spring Security (Acegi Security) : permet de gérer
l'authentification et les habilitations d'une application web (ressources web,
invocation de méthodes de services grâce à l'AOP, d'instances du modèle).
- Spring Batch : permet le développement des applications de type
batch qui peuvent utiliser des transactions et gérer de gros volumes de données
- Spring Integration : a pour but de fournir une implémentation
des Enterprise Integration Patterns (EIP) utilisable comme une extension du
modèle de programmation Spring
- Spring AMQP : permet de faciliter l'utilisation du protocole de messaging AMQP
- Spring Gemfire : facilite l'utilisation de la solution de cache
distribué Gemfire dans les applications Spring
- SpringSource dm Server (Eclipse Virgo) : est un serveur
d'applications Java modulaires. Ce projet a été confié à la fondation Eclipse
et possède maintenant le nom de projet Virgo.
- Spring Dynamic Modules For OSGi(tm) Service Platforms (Eclipse Gemini) :
- Spring LDAP : a pour but de simplifier l'utilisation d'annuaires
de type LDAP
- Spring IDE : IDE reposant sur Eclipse et un ensemble de plugins dédiés
pour faciliter le développement d'applications avec Spring
- Spring Extensions : regroupe un ensemble de sous-projets
incubateurs qui concernent des extensions à Spring
- Spring Rich Client : a pour but de simplifier le développement
d'applications utilisant Swing
- Spring .NET : est un portage de Spring sur la plate-forme .Net
- Spring BeanDoc :
- Spring Social : a pour but de faciliter la connexion à
certaines applications sociales comme Twitter ou FaceBook
- Spring Data : a pour but de faciliter l'utilisation de
solutions de type No SQL. Il est composé de plusieurs sous-projets, un pour les
différentes solutions supportées
- Spring Mobile : est une extension de Spring MVC pour le
développement d'applications web pour appareils mobiles
- Spring Android : a pour but de faciliter le développement de
certaines fonctionnalités d'applications Android natives (REST et Auth)
Plusieurs projets ne sont plus maintenus :
- Spring JavaConfig : est intégré dans Spring Core depuis la
version 3.0
- Spring Modules : est remplacé par Spring Extensions
Tous les projets de Spring sont open source et sont, pour la plupart, diffusés sous licence Apache Version 2.0.
Spring est un framework open source majoritairement développé par SpringSource mais il n'est pas standardisé par le JCP.
Il est très largement utilisé dans le monde Java, ce qui en fait un standard de facto et constitue une certaine garantie sur la pérennité du framework.
Spring propose une très bonne intégration avec des frameworks open source (Struts, Hibernate, ...) ou des standards de Java (Servlets, JMS, JDO, ...)
Toutes les fonctionnalités de Spring peuvent s'utiliser dans un serveur Java EE et pour la plupart dans un simple conteneur web ou une application standalone.
Les fonctionnalités offertes par Spring sont très nombreuses et les sujets couverts ne cessent d'augmenter au fur et mesure des nouvelles versions et des nouveaux projets ajoutés au portfolio.
La documentation de Spring est complète et régulièrement mise à jour lors de la diffusion de chaque nouvelle version.
La mise en oeuvre de Spring n'est pas toujours aisée car il existe généralement plusieurs solutions pour mettre en oeuvre une fonctionnalité : par exemple, généralement avec Spring 3.0, une fonctionnalité est utilisable par configuration XML, par annotations ou par API. Bien sûr cela permet de choisir mais cela impose un arbitrage selon ses besoins.
Il n'est pas rare que les livrables aient une taille importante du fait des nombreuses librairies requises par Spring et ses dépendances.
Spring est né de l'idée de fournir une solution plus simple et plus légère que celle proposée par Java 2 EE. C'est pour cette raison que Spring a été initialement désigné comme un conteneur léger (lightweight container).
L'idée principale de Spring est de proposer un framework qui utilise de simples POJO pour développer des applications plutôt que d'utiliser des EJB complexes dans un conteneur.
Spring ne respecte pas les spécifications de Java EE mais il intègre et utilise de nombreuses API de Java EE (Servlet, JMS, ...). Spring propose aussi une intégration avec certains composants de Java EE notamment les EJB.
Java EE utilise une approche convention over configuration : par exemple, les EJB sont par défaut transactionnels. Spring utilise une approche ou la configuration doit être explicite.
Spring est de plus en plus controversé notamment à cause de son empattement et de sa complexité croissante. De plus, face à la simplification engagée par Java EE à partir de sa version 5 et à l'ajout de l'injection de dépendances dans Java EE 6, le choix entre Java EE et Spring n'est plus aussi facile.