Download - Spring Parte I
-
7/24/2019 Spring Parte I
1/20
Captulo I
Introduccin al Spring Framework
1.1.Introduccin.
Spring es un marco de trabajo (framework) open source creado por Rod Johnson basado en
el patrn MVC (Modelo Vista Controlador).
Creado con la finalidad de facilitar la construccin de aplicaciones empresariales, y para ello
Spring hace posible esto con la utilizacin de simples y sencillos Java Beans, lo cual hace
algunos aos atrs era solo posible utilizando EJBs (Enterprise Java Beans).
A continuacin daremos un breve detalle de las caractersticas ms resaltantes de Spring.
Ligero. Spring, es un marco de trabajo ligero en trminos de tamao y memoria. Ladistribucin de Spring puede darse en un simple archivo jar de t amao aproximado
de 2.5 mb.
No intrusivo. Las aplicaciones desarrolladas en Spring no contienen dependencias
hacia clases del marco de trabajo, lo que permite mantener la independencia de las
mismas.
Inyeccin de dependencias. Spring promueve el desacoplamiento entre clases
conocido como Inyeccin de dependencias.
Contenedor. Spring es un contenedor dado que se encarga del ciclo de vida y
configuracin de los objetos utilizados por las aplicaciones.
1.2.Mdulos Spring.
El marco de trabajo Spring est compuesto por una variedad de mdulos que otorgan a los
desarrolladores los medios para desarrollar aplicaciones empresariales de acuerdo a sus
necesidades. Es importante dejar en claro que no todos los mdulos pueden ser utilizados, el
desarrollador es libre de elegir que mdulos utilizar para su aplicacin.
En la siguiente figura podemos observar los mdulos que componen el marco de trabajo
Spring.
-
7/24/2019 Spring Parte I
2/20
Figura. 1. Mdulos Spring
A continuacin detallamos los mdulos que conforman el marco de trabajo:
Core Container. Provee la funcionalidad fundamental del marco de trabajo. Contiene
la factora de Beans (BeanFactory), que representa al contenedor Spring y la base de la
inyeccin de dependencias.
Spring AOP. Provee el soporte para la programacin orientada a aspectos. De manera
similar a la inyeccin de dependencias, el mdulo permite el desacoplamiento de los
objetos java.
DAO (Data Access Objects Module). Este mdulo abstrae al programador de la
interaccin con los gestores de bases de datos.
ORM (Object Relational Module). Provee el soporte a diversos marcos ORM como JPA,
Hibernate, Ibatis, etc.
JEE. Provee el soporte a componentes empresariales como EJBs, Mensajera JMS, etc.
Web. Ofrece el soporte para la construccin de aplicaciones basadas en el patrn
MVC.
1.3.Arquitectura de una aplicacin Spring.
A continuacin observaremos cmo una tpica aplicacin Spring es organizada.
Spring est diseado para facilitar la flexibilida de la arquitectura de una aplicacin. Por
ejemplo, si desea pasar de Hibernate a Ibatis viceversa usando Spring debera ser una tarea
-
7/24/2019 Spring Parte I
3/20
simple; de la misma manera si deseamos intercambiar algn otro componente de nuestra
aplicacin.
Capa de Presentacin
JSPs u otras vistasHTML
Generado.
Acciones de la capa web
(Web Tier). Se procesan
acciones de los usuarios, se
realizadan llamadas a la
capa de servicios, se
selecciona la vista a
desplegar.
Capa de negocios / servicios. Expone la
funcionalidad clave de la aplicacin. Gestiona
transacciones. Lgica de negocios. No conoce de
implementaciones de persistencia.
Interface DAO. Define las operaciones de
persistencia independientemente de la tecnologa
a implementar.
Implementacin DAO. Recupera, almacena
entidades utilizando herramientas ORM JDBC.
RDBMS
Capa de mapeo O/R
Objetos del
dominio
(Entity).
Persistentes.
J
D
B
C
Servicios remotos: web services u
otros protocolos
-
7/24/2019 Spring Parte I
4/20
Lo resumimos de la siguiente manera:
Capa de presentacin. Lo ms delgada posible, dado que debe ser posible alternar
distintas capas de presentacin, cmo las capa web capa de servicios remotos.
Capa de Negocios / Servicios. Responsable de las transacciones del sistema.Esta capa
no debera tener conocimiento sobre la capa de presentacin y debera ser lo ms
reutilizable posible.
Interface DAO. No contiene lgica de negocios. Representa las interfaces
(independientes de cualquier tecnologa de acceso a datos). La implementacin de
estas interfaces normalmente usan cualquier tecnologa O/R JDBC.
Objetos del dominio. Objetos persistentes que forman parte del modelo de datos.
Bases de datos. Repositorios de informacin.
1.4.Inversin de Control / Inyeccin de Dependencias.
El objetivo la idea bsica del diseo es seccionar el sistema en un grupo de objetos
reutilizables. Sin un mdulo central para la gestin de objetos, los mismos tendrn que crear y
gestionar sus propias dependencias. Como resultado: objetos altamente acoplados.
La solucin para este caso pasa por la necesidad de poseer un contener encargado de
gestionar los objetos utilizados por el sistema e inyectarlos a quien los necesite.
Antes de proceder a analizar como contenedores como Spring utilizan esta caracterstica tan
importante, analicemos como separar las interfaces de la implementacin.
Supongamos que hemos desarrollado un nuevo sistema en el cual una de sus funcionalidades
es la generacin de diversos tipos de reportes tales como HTML PDF. Lo ideal es crear una
una interface que contenga lo siguiente:
public interface ReportGenerator {
public void generate(String [][] table);
}
Fig. 2. Interface ReportGenerator
A continuacin observaremos las clases que implementaran la interface en mencin para la
generacin de los reportes en los formatos ya mencionados.
-
7/24/2019 Spring Parte I
5/20
public class HtmlReportGenerator implements ReportGenerator{
public void generate (String[][] table) {
System.out.println(Generating HTML report .);
}}
Figura 3. Clase HtmlReportGenerator.
public class PdfReportGenerator implements ReportGenerator{
public void generate (String[][] table) {
System.out.println(Generating PDF report .);
}
}
Figura 4. Clase PdfReportGenerator.
Ahora observemos la siguiente clase:
public class ReportService {
prvate ReportGenerator reportGenerator = new PdfReportGenerator();
public void generateAnnualReport (int year) {
String[][] statistics = null;
// Obteniendo las estadsticas del ao.
reportGenerator.generate(statistics);
}
public void generateMonthlyReport (int year, int month) {
String[][] statistics = null;
.. // obteniendo las estadsticas
reportGenerator.generate(statistics);
}
}
Fig. 4. Clase ReportService.
Analizando la clase ReportService, La lgica de negocio est claramente representada por esta
clase, por lo tanto, el formato de salida de los reportes depender cual clase ReportGenerator
sea implementada.
-
7/24/2019 Spring Parte I
6/20
Como complemento podemos observar el siguiente diagrama de clases que muestra la
relacin entre las clases ya mencionadas.
+ generateAnnualReport()+ generateMonthlyReport()
ReportService
+ generate()
ReportGenerator
(Interface)
+ generate()
HtmlReportGenerator
+ generate()
PdfReportGenerator
Fig. 5. Diagrama de clases.
Analizando el diagrama de clases anterior, observamos que ReportService es el responsable de
crear la instancia de tipo ReportGenerator, la cual puede ser HtmlReportGenerator
PdfReportGenerator, causando una dependencia directa an entre ReportService y las clases
mencionadas.
Ahora por un momento imaginemos que tenemos un contenedor como Spring encargado de
gestionar el ciclo de vida de nuestros objetos, y que la clase ReportService no tiene porque ser
la reponsable de instanciar a las otras clases, sino que las mismas son inyectadas por el
contenedor hacia la clase ReportService, por lo tanto observaremos una grfica como la que
sigue:
+ generateAnnualReport()
+ generateMonthlyReport()
ReportService
+ generate()
ReportGenerator
(Interface)Inyectada
Puede ser tanto una
implementacin de
HtmlReportGenerator
PdfReportGenerator
Fig. 6. Inyeccin de dependencias.
La figura anterior se puede observar que la clase ReportService no debe realizar ms la
instancia de alguna clase, sino que las mismas son inyectadas por el Contenedor que en
nuestro caso estar representado por Spring.
El principal beneficio de la inyeccin de dependencias, es el bajo acoplamiento entre clases. Si
un objeto slo conoce a sus dependencias a travs de sus interfaces entonces las
dependencias pueden ser cambiadas en cualquier momento sin traer como consecuencia
cambios drsticos en la aplicacin.
-
7/24/2019 Spring Parte I
7/20
Captulo II
Core Spring
El corazn de Spring est representado por un contenedor ligero responsable de gestionarque implementa las funcionalidades ligadas a Inversin de Control e Inyeccin de
Dependencias.
En la actualidad Spring trae consiguo diversas implementaciones del contenedor de Beans que
pueden ser categorizadas en dos tipos: La ms bsica conocida como BeanFactory y la
segunda conocida como ApplicationContext construda sobre la base de la anterior y con un
conjunto mayor de funcionalidades.
Trabajar con la implementacin BeanFactory resulta ideal para aplicaciones simples, pero si
deseamos aprovechar todo el poder del marco de trabajo Spring, tendramos que evaluar elsegundo tipo de contenedor.
2.1. Ciclo de vida de los Beans.
En una aplicacin java tradicional, el ciclo de vida de un bean es bastante simple; slo basta
usar la instruccin new y est listo para ser usado. Una vez que el Bean no se encuentre
siendo usado, el mismo es elegible por el recolector de basura para su respectiva destruccin.
El ciclo de vida de los Beans gestionados por un Contenedor como Spring es mucho ms
elaborado, observemos la siguiente figura:
Fig. 7. Ciclo de vida de los BeansSpring.
-
7/24/2019 Spring Parte I
8/20
Detallamos a continuacin la imagen anterior:
Instantiate. Los beans son instanciados utilizando su(s) constructor(es).
Populate Properties. Spring inyecta valores a las propiedades de los beans.
Set bean name. Si el Bean implementa la interface BeanNameAware, Spring enva el ID
del Bean al mtodo setBeanName().
Set bean factory. Si el Bean implementa la interface BeanFactoryAware, Spring enva la
factora de beans al mtodo setBeanFactory().
Postprocess. Si existe algn BeanPostProcessor, Spring ejecuta el mtodo
postProcessBeforeInitialization().
Initialize beans. Si el Bean implementa la interface InitializingBean, Spring ejecuta el
mtodo afterPropertiesSet().
PostProcess. Si existe algn BeanPostProcessor, Spring ejecuta el mtodo
postProcessAfterInitialization().
Bean is ready to use. En este punto, el bean est listo para ser usado por la aplicacin,
y permanecer en la factora hasta que no sea ms necesitado.
Destroy bean. Si el Bean implementa la interface DisposableBean, el mtodo destroy()
es ejecutado
2.2.Creando Beans.
Empecemos creando un simple bean basndonos en el ejemplo del captulo anterior. Para ello
creamos una nueva versin de la interface ReportGenerator y las dos clases que la
implementan HtmlReportGenerator y PdfReportGenerator.
Por lo tanto nuestro cdigo quedar de la siguiente manera.
-
7/24/2019 Spring Parte I
9/20
Fig. 8. Interface ReportGenerator.
A continuacin las clases que implementan la interface.
Fig. 9. Clase HtmlReportGenerator
-
7/24/2019 Spring Parte I
10/20
Fig. 10. Clase PdfReportGenerator
Una vez creadas nuestras clases, podemos proceder a registrarlas dentro del contenedor
Spring, para ello utilizamos el fichero applicationContext.xml (es opcional utilizar otro
nombre).
Fig. 11. applicationContext.xml
En la figura anterior podemos observar que el contenedor Spring crear una instancia de laclase HtmlReportGenerator. Ahora observemos nuestra aplicacin:
-
7/24/2019 Spring Parte I
11/20
Fig. 12. Clase Main
De la grfica anterior observamos que la aplicacin no conoce que tipo de ReportGenerator
ser utilizado ya que es responsabilidad del contenedor Spring.
La salida de la aplicacin se puede observar en la siguiente figura:
Fig. 13. Salida de la aplicacin.
-
7/24/2019 Spring Parte I
12/20
-
7/24/2019 Spring Parte I
13/20
Fig. 16. applicationContext.xml
Fig. 17. Clase Main.
2.3.2. Inyectando referencias de objetos a travs de constructores.
Tal como hemos visto en los ejemplos anteriores, en Spring tambin es posible pasar
argumentos a los constructores que representan referencias a otros objetos.
Observemos la clase Report, la cual define los siguientes atributos con sus respectivosmtodos set / get.
-
7/24/2019 Spring Parte I
14/20
Fig. 18. Clase Report
A continuacin observamos la clase HtmlReportGenerator que procede a imprimir el cuerpo
de la clase Report, pero previamente la misma es enviada como referencia.
Fig. 19. Clase HtmlReportGenerator
Ahora observemos la inicializacin de ambas en el fichero de configuracin
applicationContext.xml.
-
7/24/2019 Spring Parte I
15/20
Fig. 20. applicationContext
2.3.3. Inyectando en los atributos del bean.
Un bean java normalmente define mtodos set / get para cada atributo definido. Spring puede
tomar ventaja de esto utilizando los mtodos set, con la finalidad de insertar valores en los
atributos de los beans. Modifiquemos la clase Report de la siguiente manera:
Fig. 21. Clase Report.
-
7/24/2019 Spring Parte I
16/20
Fig. 22. applicationContext
2.3.4. Inicializando colecciones.
Los elementos y son los elementos ms utilizados en Spring que permiten
almacenar un conjunto de valores determinado. El uso de estos elementos se puede observar
en la siguiente figura:
Fig. 23. Clase HtmlReportGenerator
-
7/24/2019 Spring Parte I
17/20
Fig. 24. applicationContext.
2.3.5. Autowiring.
Anteriormente hemos visto como Spring puede instanciar e inyectar las dependencias a travs
de elementos como . Asimismo, es factible indicarle a Spring
que defina automticamente el objeto a instanciar y enviar.
En la actualidad existen 4 tipos de autowiring.
byName. Spring ubica el bean cuyo nombre ID sea exactamente el mismo que el de
la propiedad a la cual se le pasar la dependencia.
byType. Spring ubica el bean cuyo tipo coincida con el tipo de propiedad a la cual se le
pasar la dependencia. En caso que existan ms de una coincidencia, se lanzar una
excepcin (UnsatisfiedDependencyException).
Constructor. Spring intenta ubicar uno ms beans en el contenedor con los
parmetros de uno de los constructores del bean que est siendo declarado.
Autodetect. Elige entre autowiring byType constructor.
-
7/24/2019 Spring Parte I
18/20
A continuacin observamos la siguiente figura:
Fig. 25. applicationContext
En la figura anterior observamos la declaracin de un cuyos elementos hacen referencia
a las dos instancias de reports (report1 y report2). Posteriormente al declarar
HtmlReportGenerator con un autowire byName, nos damos cuenta que al existir una
propiedad denominada reports en esta clase y coincidir este nombre con la lista declarada
anteriormente, la misma es inyectada a dicha propiedad.
A continuacin observemos la siguiente imagen, en ella visualizaremos un ejemplo donde el
autowiring es del tipo byType, similar al ejemplo anterior slo que en este caso Spring busca
las coincidencias por tipo de datos.
-
7/24/2019 Spring Parte I
19/20
Fig. 26. applicactionContext.
A continuacin observaremos un ejemplo con el tercer tipo de autowiring.
Fig. 27. applicationContext
En la figura anterior, observamos que la clase report_generator tiene un autowire de tipo
constructor, lo que significa que al tener esta clase un constructor con un parmetro de
-
7/24/2019 Spring Parte I
20/20
entrada de tipo String, Spring busca y encuentra que el bean annio declarado es del
mismo tipo por lo tanto lo transfiere hacia el constructor del bean.
2.4.Alcance de los Beans.
Por defecto todos los beans declarados en Spring son singletons, esto quiere decir quesiempre el contenedor Spring devuelve la misma instancia del bean. En ocasiones, existen
momentos en que esta forma de gestionar instancias no es la ms apropiada, sino que es
necesario que el contenedor devuelva una instancia por cada llamada, por lo que deberamos
decirle utilizar el atributo al momento de declarar el bean y establecerlo en
prototype.
En la siguiente tabla encontraremos los tipos de permitidos en Spring.
Scope Descripcin
Singleton Una sola instancia del bean por contenedor. (Por defecto).
Prototype El bean puede ser instanciado varias veces; una por cada usoque se le d.
Request La instancia existe como parte de un request. Vlido solo
para Spring MVC.
Session La instancia forma parte de una sesin HTTP. Vlido solo
para Spring MVC.
Global-session La instancia forma parte de una sesin global HTTP. Vlido
slo para Portlets.