# Spring framework

L'Spring framework (abreviant, Spring), és un marc de treball de codi obert per la plataforma Java. La primera versió va ser escrita per Rod Johnson, que inicialment va llençar el producte juntament amb el llibre One-on-One Java EE Design and Development. També hi ha un port disponible per la plataforma .NET, Spring.NET.
El marc de treball va ser inicialment llençat al juny de 2003 sota la llicència Apache 2.0. La primera versió major 1.0 va ser distribuïda el març de 2004, amb llançaments addicionals el setembre de 2004 i març de 2005. Encara que Spring Framework no força cap model de programació, ha esdevingut amplament popular dintre de la comunitat Java primerament com una alternativa que desplaçaria el model Enterprise JavaBean. Per disseny aquest entorn ofereix una gran llibertat als desenvolupadors de Java i a més proveeix solucions fàcils i ben documentades per pràctiques habituals en la indústria.
Mentre les funcionalitats del nucli de l'entorn són usables en una aplicació Java hi ha diferents extensions i millores per construir aplicacions web damunt d'una plataforma Java EE. Gràcies a això, Spring ha aconseguit una gran popularitat i és reconegut pels fabricants com un entorn estratègicament important.

## Història de Spring Framework

Les primeres parts del que ha esdevingut Spring Framework van ser escrites per Rod Johnson el 2000, mentre treballava com a consultor independent per clients de la indústria financera a Londres. Mentre escrivia el seu llibre Expert One-on-one J2EE Design And Development (Programmer to programmer) (2002), va anar més enllà del seu codi per expressar la seva perspectiva de com les aplicacions amb diferents parts de la plataforma J2EE hauria d'esdevenir més simple i més consistent del que els desenvolupadors i les empreses ho estaven fent en aquell moment.
Tornant a 2001 els models dominants per aplicacions basades en web eren oferts per l'API de Java Servlet i Enterprise JavaBeans. Ambdues eren especificacions creades per Sun Microsystems en col·laboració amb altres fabricants i parts interessades i gaudeixen de gran popularitat entre la comunitat Java.
A Rod Johnson se li atribueix la creació d'un marc de treball que estava basada en les acceptades com a millors pràctiques i vàlid per tots els tipus d'aplicacions, no només aplicacions web. Aquestes idees també són estan expressades al seu llibre i posteriorment els lectors de la publicació van demanar millores poder usar el codi encartat amb el llibre sota una llicència de codi obert.
Es va formar un petit equip de desenvolupadors desitjant de treballar a ampliar l'entorn i van crear un lloc web a Sourceforge, el febrer de 2003. Després de treballar en l'entorn durant més d'un any, van llençar la versió 1.0 el març de 2004. Després d'aquest llançament va ser quan va guanyar popularitat, degut en part al Javadoc i la documentació de referència, superiors a la mitjana en un projecte de codi obert.
Tanmateix, Spring Framework va rebre dures crítiques el 2004 i continua sent tema d'agres discussions. Al moment del llançament de la primera versió major, molts desenvolupadors i líders d'opinió van veure Spring Framework com una manera de moure la manera de programar respecte del model tradicional, cosa realment certa, pel que feia als Enterprise JavaBeans. Un dels objectius de disseny és el d'integrar-se fàcilment amb estàndards J2EE existents i eines de fabricants ja fetes. En gran manera, això elimina la necessitat de definir les seves funcionalitats en un document d'especificació i controlat per un comitè oficial, cosa que també ha estat criticada.
Aquest marc de treball ha convertit tècniques antigament poc familiars en populars en un curt període, la més notable és la d'Inversió de Control. El 2004 Spring Framework va gaudir de grans índexs d'acceptació amb l'oferiment del seu propi marc de Programació orientada a aspectes (AOP), cosa que va fer esdevenir aquest paradigma més popular arreu de la comunitat Java.
2005 va veure fins i tot millors índexs d'acceptació que l'any anterior, gràcies als nous llançaments que acomplien noves fites importants i aportaven noves funcionalitats. El Fòrum de Spring que va ser llençat al final del 2004 també va ajudar a augmentar la popularitat del marc de treball i ha crescut fins a esdevenir la més important font d'informació i suport pels seus usuaris.
El mateix any els desenvolupadors de Spring van engegar la seva pròpia empresa per oferir suport comercial i es van associar amb BEA Systems. Al desembre de 2005 la primera conferència sobre Spring va ser feta a Miami atraient 300 desenvolupadors durant els tres dies de durada, seguida d'una altra a Anvers el juny del 2006, seguida per 400 persones.

## Funcionalitats clau

* Gestió de la configuració basada en JavaBeans, aplicant-hi principis d'Inversió de Control, més específicament usant la tècnica d'Injecció de Dependència. Això ajuda a reduir les dependències de components, en implementacions específiques, sobre altres components.
* Una factoria de Beans central, que és usada globalment.
* Capa genèrica d'abstracció per la gestió de transaccions de la base de dades.
* Estratègies preincorporades per la JTA i un sol DataSource de JDBC. Això elimina la dependència en un entorn Java EE pel suport a les transaccions
* Integració amb entorns de persistència com Hibernate, JDO, iBatis i db4o.
* Entorn d'aplicació web MVC, construït al nucli de la funcionalitat de Spring. suportant moltes tecnologies per generar vistes, incloent-hi JSP, FreeMaker, Velocity, Tiles, iText i POI.
* Entorn extensiu de programació orientada a aspectes per proveir serveis, com ara gestió de les transaccions. Amb això es millora la modularitat dels sistemes.

## Introducció a Spring Framework

Aquest entorn proveeix solucions per diversos reptes tècnics encarats per desenvolupadors Java i organitzacions que volen crear aplicacions basades en la Plataforma Java. Donada la clara amplitud de la funcionalitat que s'hi ofereix, pot fer-se complicat distingir entre els blocs principals que componen el marc de treball. Spring Framework no està lligat exclusivament a Java EE, encara que la seva prou aconseguida integració en aquesta àrea és una raó important per la seva popularitat.
Spring Framework és probablement més conegut per oferir funcionalitats requerides per crear efectivament aplicacions de negoci complexes a part dels models de programació que històricament han estat dominant a la indústria. A més té la fama d'introduir funcionalitats que eren poc familiars en pràctiques de programació que avui en dia són bàsiques, fins i tot més enllà de la Plataforma Java.
Això revaloritza un entorn que ofereix un model consistent i el fa aplicable a la majoria de tipus d'aplicacions que es creen avui dia sobre la plataforma Java. Hom considera que Spring Framework implementa una manera de treballar basada en les millors pràctiques i estàndards de la indústria, fent-lo vàlid per molt dominis Java.

### Mòduls de l'Spring Framework

Spring Framework pot ser considerat com una col·lecció d'entorns més petits, o entorns dintre d'entorns. La majoria d'aquests estan dissenyats per treballar independentment uns dels altres, tot i que se suposa que junts, milloren les funcionalitats. Aquests mòduls estan dividits en blocs de construcció típics d'aplicacions complexes:
* Contenidor d'Inversió de Control : configuració de components d'aplicació i gestió del cicle de vida d'objectes Java
* Entorn de Programació orientada a aspectes (AOP):
* Entorn d'accés a les dades: treballant amb sistemes de gestió de bases de dades relacionals, sobre la plataforma Java utilitzant JDBC i eines de mapeig objecte - relacional (JPA, Hibernate...) aportant solucions a reptes tècnics que són reusables en una multitud d'entorns basats en Java.
* Entorn de gestió de transaccions: harmonització de diferents APIs de gestió de transaccions i orquestració de transaccions configuratives per objectes Java.
* Entorn model-vista-controlador: basat en HTTP i Servlet proveint moltes eines per la millora i la personalització.
* Entorn d'accés remot: importació i exportació d'objectes java a la manera de l'RPC (informàtica) configurable, sobre xarxes informàtiques que suporten protocols basats en HTTP, com ara RMI, CORBA, i serveis web (REST).
* Entorn d'autenticació i personalització: orquestració configurativa d'autenticació i processos d'autorització que suporten molts estàndards de la indústria, protocols, eines i pràctiques via el subprojecte Acegi security framework.
* Entorn de missatgeria: registre configurable d'objectes que reben missatges per la consumpció transparent de missatges des de cues de missatges via JMS, millora d'enviament de missatges sobre APIs JMS estàndards. Suport pel protocol AMQP (RabbitMQ, Kafka Broker…).
* Entorn de testeig: suporta classes per la creació d'unitats de testeig i proves d'integració.

### Contenidor d'Inversió de Control

El punt central de Spring Framework és el seu contenidor d'Inversió de Control que aporta recursos consistents de configuració i gestió d'objectes Java. Aquest contenidor té diferents implementacions: la més bàsica és BeanFactory, i una altra que aporta mes funcionalitat es ApplicationContext. El contenidor té moltes funcionalitats i punts de millora que poden ser tots considerats com formes d'Inversió de Control. Per exemple, crear objectes, configurar objectes, cridar mètodes d'inicialització o passar objectes per crides registrades a altres objectes. Mitjançant el contenidor, gestionem el cicle de vida dels objectes, que és una de les aportacions més importants que proveeix. Els objectes que són creats pel contenidor també són anomenats Managed Objects o Beans. En versions anteriors d'Spring el contenidor era configurat carregant fitxers XML que contenien Bean Definitions. Actualment, la pràctica habitual es la configuració programàtica mitjançant classes Java. Aquestes permeten obtenir tota la informació que cal per crear objectes. Un cop els objectes són creats i configurats sense generar condicions d'error, esdevenen aptes per l'ús. D'altres poden ser obtinguts per recursos de Dependency lookup o Injecció de Dependència. Dependency lookup és un patró on un objecte que fa una crida demana al contenidor de l'objecte, un objecte amb un nom específic o un tipus específic. Injecció de Dependència és un patró on el contenidor passa objectes per nom a altres objectes, usant constructors, propietats o Factory Method (patró de disseny). En molts casos no cal usar el contenidor quan usem altres parts de Spring Framework encara que usant-lo probablement farem que l'aplicació sigui més fàcil de configurar i personalitzar. El contenidor de Spring proveeix un mecanisme consistent de configurar aplicacions i s'integra amb quasi tots els entorns Java, des d'aplicacions de petita escala a grans aplicacions empresarials. El contenidor pot ser usat com un contenidor que compleix parcialment amb EJB3, a través dels recursos del projecte Pitchfork. Tanmateix aquest projecte per si mateix no el fa complir plenament amb l'especificació EJB3. L'Spring Framewok és criticat per alguns com a no complir els estàndards.

### Entorn de programació orientada a aspectes

Spring Framework té el seu propi entorn de programació orientada a l'aspecte que modularitza problemàtiques multicapa en aspectes. La motivació de crear un entorn AOP ve de la consideració que hauria de ser possible proveir funcionalitats bàsiques AOP sense massa complexitat ni al disseny ni la implementació ni la configuració. L'entorn AOP està basat en la intercepció i es configura en temps d'execució. Això elimina la necessitat de certs passos de compilació o de temps de càrrega de l'aplicació. Per altra banda la intercepció només permet als mètodes públics i privats, execucions d'objectes existents com els dels Punt de trobada. El compromís de disseny entre simplicitat i funcionalitats disponibles és important i Spring AOP aposta per la facilitat d'aprenentatge. Per exemple, comparant amb AspectJ, Spring és menys potent i també més senzill. Spring també dona suport a la integració d'AspectJ al contenidor, des de la versió 1.2. En la 2.0, hi ha més integració, per exemple, es reutilitza el llenguatge d'especificació dels punts de trobada.

### Entorn d'accés a les dades

L'entorn d'accés a les dades, que és part de Spring, s'adreça a problemàtiques comunes a les que els desenvolupadors s'enfronten quan treballen amb les bases de dades. Dona suport a JDBC, Hibernate, iBatis, JDO, JPA, Toplink, Apache OJB i Cayenne (Java) entre d'altres.
Per tots aquests entorns, Spring aporta les funcionalitats següents:
* Gestió de recursos (adquisició i llançament automàtics de recursos de les bases de dades)
* Gestió d'excepcions (tradueix excepcions relacionades amb la base de dades a una jerarquia personalitzada de Spring)
* Participació de la transacció (participació transparent en transaccions en progrés)
* Unwrapping de recursos (recuperació d'objectes de la base de dades usant el wrapper del pool de la base de dades)
* Abstracció per la gestió de BLOB i CLOB
Totes aquestes funcionalitats esdevenen disponibles quan usem classes Template proveïdes per Spring per cada entorn suportat. Els crítics diuen que aquestes classes són intrusives i no ofereixen cap millora respecte a usar, per exemple, l'API d'Hibernate directament Arxivat 2007-07-24 a Wayback Machine.. Per rebatre aquest argument, els desenvolupadors de Spring han fet que es pogués usar directament les APIs d'Hibernate i JPA. Això tanmateix, requereix gestió de transaccions transparent i el codi de l'aplicació ja no assumeix la responsabilitat d'obrir i tancar recursos de la base de dades i no suporta traducció de les excepcions. Juntament amb la gestió de transaccions de Spring el seu entorn d'accés a les dades ofereix una abstracció flexible per treballar amb entorn d'accés a les dades. Spring no ofereix una API comuna d'accés a les dades, en lloc d'això es manté intacta la potència de les APIs suportades. Spring ofereix entorns de gestió de l'accés a les dades fora d'un contenidor o servidor d'aplicacions.

### Entorn de gestió de transaccions

L'entorn de gestió de transaccions de Spring aporta un mecanisme de transacció de la plataforma Java. La seva abstracció és capaç de:
* treballar amb transaccions locals i globals (local implica que no necessita servidor d'aplicacions)
* treballar amb transaccions niuades
* treballar amb punts segurs de transaccions
El PlatformTransactionManager es fa servir per les estratègies següents:
* Transaccions amb connexió JDBC
* Transaccions sobre Unitats de Treball de Mapeig d'Objecte Relacional
* Transaccions sobre JTA
* Transaccions sobre altres recursos, com ara, bases de dades orientades a objectes
A més d'aquest mecanisme d'abstracció hi ha dues maneres d'afegir gestió de transaccions a aplicacions:
* Programàticament, usant el TransactionTemplate
* Configurativament, usant metadades com XML o anotacions de Java5.
Juntament amb aquest entorn, també es pot configurar un sistema transaccional sense pensar en JTA ni EJB. L'entorn transaccional també s'integra amb motors de missatgeria i cache.

### Entorn model-vista-controlador

Les funcionalitats de Spring al seu propi entorn MVC no entraven als plans inicials. Els desenvolupadors van decidir afegir-lo per competir amb Jakarta Struts Arxivat 2007-08-26 a Wayback Machine..
Spring és un entorn basat en peticions comparable a Struts. L'entorn defineix interfície de Strategy per totes les responsabilitats que han de ser gestionades per un entorn modern basat en peticions. Totes les interfícies estan estretament aparellades a l'API de Servlet per oferir totes les seves capacitats. La classe DispacherServlet és el controlador frontal de l'entorn i és responsable de la delegació de control a les diferents interfícies durant les fases d'execució d'una petició HTTP. Les interfícies més importants definides per Spring MVC i les seves responsabilitats són:
* HandlerMapping : seleccionant objectes que maneguen peticions entrants (handlers) basats en qualsevol atribut o condició interna o externa a les peticions
* HandlerAdapter : execució d'objectes que maneguen peticions entrants
* Controller' : entre elModel i la Vista per gestionar les invocacions entrants i redirigir-les a la resposta correcta
* View : responsable de tornar una resposta al client
* ViewResolver : selecciona la vista basada en un nom lògic per la vista (l'ús no és estrictament requerit)
* HandlerInterceptor : intercepció de peticions entrants comparable però no igual als filtres de Servlet (l'ús és opcional però no control-lat per DispatcherServlet)
* LocaleResolver : resolent i gravant opcionalment amb els Paràmetres regionals (Locale) d'un usuari individual
* MultipartResolver : facilita la feina de la pujada de fitxers amb el wrapping de peticions entrants
Cada interfície de Strategy esmentada té una responsabilitat important arreu de l'entorn. Les abstraccions oferides per aquestes interfícies són prou potents com per permetre un ampli conjunt de variacions a les seves implementacions. Spring MVC incorpora implementacions de totes aquestes interfícies, que juntes, ofereixen ofereixen un potent conjunt de funcionalitats damunt de l'API de Servlet. Tanmateix, el desenvolupadors i fabricants són lliures d'escriure d'altres implementacions. Spring MVC usa la interfície java.util.Map com una abstracció orientada a les dades pel Model on les claus s'espera que siguin Strings.
La facilitat de testejar les implementacions d'aquestes interfícies és un avantatge important de l'alt nivell d'abstracció ofert. DispatcherServlet està estretament aparellat amb el contenidor d'Inversió de Control per configurar les capes de l'aplicació web.

### Entorn d'accés remot

L'entorn d'accés remot és una abstracció per treballar amb diferents tecnologies basades en RPC disponibles a la Plataforma Java tant per la connectivitat del client com per l'exportació d'objectes a servidors. La funcionalitat més important oferta per aquest entorn és la configuració i ús d'aquestes tecnologies en combinació amb la Inversió de Control i l'AOP.
Aquest entorn també aporta recuperació a fallades (reconnexió automàtica després d'una caiguda en la connexió) i algunes optimitzacions per ús a la part de client de sessions Beans sense estat remots EJB.
Spring incorpora suport per aquests protocols i productes de forma addicional:
* Protocols basats en HTTP
** Hessian: protocol de serialització binària de codi obert i mantingut per protocols basats en Corba
** RMI (1) : mètode d'invocacions usant infraestructura RMI
** RMI (2) : mètode d'invocacions usant interfícies que acomplien amb l'ús regular d'RMI
** RMI-IIOP (Corba) : mètode d'invocacions usant RMI-IIOP/Corba
* Integració amb client Enterprise javaBean
** Connectivitat amb bean local sense estat EJB: connectant amb beans de sessió locals sense estat
** Connectivitat amb bean remot sense estat EJB: connectant amb beans de sessió remots sense estat
* SOAP
** Integració amb l'entorn de serveis web Apache Axis
L'entorn XFire Arxivat 2008-09-02 a Wayback Machine. SOAP proveeix integració amb Spring per exportació amb RPC d'objectes de la part servidora. Tant el client com la configuració del servidor, per tots els protocols sobre RPC i productes suportats per l'entorn d'accés a Spring Remote (excepte pel suport a Apache Axis) és configurat pel contenidor Spring Core.
Existeix una implementació alternativa Cluster4Spring Arxivat 2008-12-02 a Wayback Machine. d'un susbsistema remot inclòs a Spring que procura donar suport a diferents combinacions d'implementació remota (1-1, 1-molts, troballa de sistemes remots).

## Referències

* ↑ . Wrox Press, octubre 2002. Arxivat 2012-05-07 a Wayback Machine.
* Johnson, Rod; Jürgen Höller, Alef Arendsen, Thomas Risberg, and Colin Sampaleanu. Professional Java Development with the Spring Framework. Wiley, 2005. ISBN 0-7645-7483-3.
* Harrop, Rob; Jan Machahek. Pro Spring. APress, 2005. ISBN 1-59059-461-4.
* Johnson, Rod; Jürgen Höller. J2EE Development without EJB. Wiley, 2004. ISBN 0-7645-5831-5.
* Johnson, Rod. Expert One-on-on J2EE Design and Development. Wiley, 2002. ISBN 0-7645-4385-7.
* Walls, Craig; Ryan Breidenbach. Spring in Action. Manning, 2005. ISBN 1-932394-35-4.
* Wolff, Eberhard. Spring - Framework für die Java Entwicklung. dpunkt, 2006. ISBN 3-89864-365-4.

## Enllaços externs

* Spring Framework
* Spring.Net