Download Framework Spring

Document related concepts
no text concepts found
Transcript
UNIVERSIDAD NACIONAL DE SAN
AGUSTÍN
FACULTAD DE PRODUCCIÓN Y SERVICIOS
Escuela Profesional de Ingenierı́a de Sistemas
Curso :
Tecnologı́a de Objetos
Framework Spring
Alumno:
Christian Edilberto
Portugal Zambrano
Arequipa - Perú
2009
Índice general
1. Introducción
1.1. ¿Qué es Spring? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Módulos de Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.1. Módulo Core Container . . . . . . . . . . . . . . . . . . . . . .
1.2.2. Módulo Application Context . . . . . . . . . . . . . . . . . . .
1.2.3. Módulo AOP: Programación Orientada a Aspectos . . . . . . .
1.2.4. Módulos JDBC y DAO . . . . . . . . . . . . . . . . . . . . . .
1.2.5. Módulo de Integración ORM(Mapeamento Objeto-Relacional)
1.2.6. Módulo JMX (Java Management Extension) . . . . . . . . . .
1.2.7. Módulo JCA (Java EE Conector API) . . . . . . . . . . . . . .
1.2.8. Módulo MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.9. Módulo Spring Portlet MVC . . . . . . . . . . . . . . . . . . .
1.2.10. Módulo Web Spring . . . . . . . . . . . . . . . . . . . . . . . .
1.2.11. Remoting . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2.12. Módulo JMS (Java Message Service) . . . . . . . . . . . . . . .
1.3. Spring Web Flow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3
3
5
5
5
5
5
5
6
6
6
6
6
7
7
7
2. Spring en la práctica
2.1. Entendiendo la Inyección de dependencias . . . . . . . .
2.1.1. Inyectando Dependencias . . . . . . . . . . . . .
2.2. Ventajas y desventajas de la inyección de dependencias .
2.3. Acoplamiento . . . . . . . . . . . . . . . . . . . . . . . .
2.3.1. Acoplamiento estrecho . . . . . . . . . . . . . . .
2.3.2. Libertad de acoplamiento . . . . . . . . . . . . .
2.4. Configuración XML . . . . . . . . . . . . . . . . . . . .
2.5. Spring como framework . . . . . . . . . . . . . . . . . .
2.5.1. Eclipse IDE . . . . . . . . . . . . . . . . . . . . .
2.5.2. Instalación de Spring con Eclipse . . . . . . . . .
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
9
9
9
10
10
10
11
11
12
12
12
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
.
3. Spring en código
15
3.1. Aplicación sencilla . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
1
Índice de figuras
1.1. Módulos del framework Spring construidos en la cima del contenedor principal.
Figura tomada de [2] . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
1.2. Ejemplo de flujo de páginas web de una aplicación sencilla. . . . . . . . . . . . .
2.1. Inyeccion de dependencias comprende el dar a un objeto las dependencias en
oposición a que el objeto las adquiera las mismas. Figura tomada de [2]. . . . . .
2.2. Archivo de configuración de dependencias XML, en la cual se observa la creación
de dos tipos de objetos, asi tambien el uso y asignación de propiedades. . . . . .
2.3. Menu de actualizaciones de software para Eclipse . . . . . . . . . . . . . . . . . .
2.4. Opciones de instalación de plugins para Spring en Eclipse, escogiendo las necesarias de acuerdo al proyecto seleccionado . . . . . . . . . . . . . . . . . . . . . .
2.5. Menu de opciones de proyecto obtenido al hacer click derecho sobre un proyecto
Java , el cual nos indica si a nuestro proyecto deseamos agregarle las caracterı́sticas de Spring . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
2.6. Opción para crear un proyecto tomando como base Spring y asi garantizar las
caracterı́sticas que SpringIDE da como beneficios para el desarrollo de proyectos
4
7
9
11
12
13
14
14
3.1. Archivo de configuración Xml para nuestro primer ejemplo en la que usamos la
DI para señalar objetos con los cuales deseamos trabajar . . . . . . . . . . . . . . 16
3.2. Código del método main en la cual primero llamamos a nuestro archivo de configuración y luego cargamos las dependencias . . . . . . . . . . . . . . . . . . . . 17
2
Capı́tulo 1
Introducción
En 1996 el lenguaje de programación JAVA
era aún muy joven y la plataforma que vendrı́a a ser el futuro de los desarrolladores, muchos programadores migraron a este lenguaje
por que ellos se dieron cuenta de como se creaban aplicaciones ricas de cliente usando applets, pero pronto aprendieron que habia más
que simple applets en este lenguaje, a diferencia de los lenguajes anteriores a Java, este hizo
posible escribir aplicaciones complejas hechas
de partes discretas[1].
Las aplicaciones sofisticadas a menudo requieren de servicios que soporten transacciones
,seguridad, y computación distribuida, servicios que no son exclusivamente provistos por
la especificación JAVA BEANS. A pesar del
hecho de que muchas aplicaciones satisfactorias han sido construidas basadas en EJB ,
EJB nunca alcanzó el propósito para el cual fue
creado : ”simplificar el desarrollo de aplicaciones empresariales.” Hoy en dia los componentes de desarrollo han regresado a sus raices
, nuevas técnicas de programación , incluyendo
la Programación orientada a Aspectos e
injeccion dependiente 1 , son dotadas por JAVA BEANS en su EJB, actualmente ha sido
liberada la especificación EJB 3 el cual es otro
framework de desarrollo basado en POJO 2 y
ha sido establecido como el estandar de facto
en la comunidad de Java.
1.1.
¿Qué es Spring?
El Spring Framework (también conocido
simplemente como Spring) es un framework
de código abierto de desarrollo de aplicaciones para la plataforma Java. La primera
versión fue escrita por Rod Jonhson, quien
lo lanzó primero con la publicación de su
libro Expert One-on-One Java EE Design and Development (Wrox Press, octubre 2002). También hay una versión para
la plataforma .NET, Spring.net.
Spring fue creado para resolver el problema de
la complejidad del desarrollo de aplicaciones
empresariales., y ha hecho posible hacer uso de
cosas que sólo eran posibles con EJB. Sin embargo la utilidad de Spring no sólo está limitada al desarrollo del lado del servidor, cualquier
aplicación Java puede beneficiarse de Spring
en términos de simplicidad, testeabilidad y bajo acoplamiento. Bueno a estas alturas sabemos que Spring hace muchas cosas, pero cuando damos un escaón hacia abajo es decir a sus
partes más básicas, notamos que Spring es una
1
DI en sus siglas en inglés significa dependency independencia de uso de peso ligero y un containjection
2
POJO significa por sus siglas en inglés Plain-Old er orientado a aspectos, y además un framework. Para entender un poco mejor el corazón
Java Objects
3
de spring daremos una descripción de ella 3 .
Lightweight
Como su traducción en español dirı́a Spring
es de peso ligero en términos de tamaño y dificultad. El contenido del Framework Spring
puede ser distribuido en un simple archivo JAR
que pesa alrededor de 2.7MB y además muy a
menudo aplicaciones que usan Spring no dependen de sus clases especı́ficas.
Figura 1.1: Módulos del framework Spring construidos en la cima del contenedor principal.
Spring promueve el bajo acoplamiento a Figura tomada de [2]
través de técnicas conocidas como inyección de
dependencias (DI). Cuando DI es aplicado,
a los objetos pasivamente les es asignado sus
ración de los objetos de aplicación, es decir que
dependencias en lugar de crearlas o buscar denosotros podemos declarar como es que un obpendencias de objetos para ellos mismos, es dejeto de mi aplicación debe de ser creado, como
cir que en lugar de buscar dependencias en un
deben de ser confiurados, y como es que deben
container, el container dá la dependencia a la
de estar asociados con otros.
instanciación del objeto sin esperar a ser solicitado.
Dependency Injection
Framework
Aspect Oriented
Spring hace posible configurar y formar
aplicaciones complejas desde los mas simples
componentes. En Spring, los objetos de las
aplicaciones son tipicamente armados en
un archivo XML.4 , lo cual permite que el
desarrollo de la lógica de la aplicación sea
dejado para el programador.
Spring viene con una abundancia en soporte
para la programación orientada a aspectos que
permite el desarrollo cohesivo separando la
lógica del negócio de la aplicación de los servicios del sistema, es decir que los objetos de
las aplicaciones hacen lo que deben de hacer
- desempeño de la lógica del negocio- y nada
más.
Ellos no son responsables por los eventos correspondientes a otros sistemas.
Pero Spring es aún mas. El framework
Spring viene con algunos módulos que fundamentados en la construcción de DI y AOP crean plataformas de caracterı́sticas completas en
Container
la cual se pueden construir aplicaciones. Para
Spring es un container en el sentido de que un vision general de los módulo ver la figura
contiene y maneja el ciclo de vida y la configu- 1.1.
3
NOTA : Usaremos los nombres en inglés de su descripción para no caer en malas traducciones y hacer
que esas palabras sean conocidas en nuestro texto.
4
Spring provee mucha estructura en funcionalidad
tales como manejo de transacciones, persistencia de integración del framework
4
1.2.
Módulos de Spring
1.2.3.
El framework Spring está compuesto de
módulos bien definidos, si los tomamos como
un todo estos módulos nos brindan todo lo
necesario para desarrollar aplicaciones empresariales, más no es necesario tomar como base
todo el framework Spring, comummente sólo
es necesario escoger aquellos módulos que sean
necesarios para nosotros y nuestra aplicación,
además Spring ofrece algunos puntos de integración con otros frameworks y librerı́as lo cual
no hace necesario que nosotros escribamos dichos códigos de integración.A continuación se
dará una breve reseña de cada uno de ellos,
para mayor información y documentación revisar la bibiografı́a al final de este texto.
1.2.1.
Este módulo como su nombre lo dice brinda
soporte a la programación orientada a aspectos, no entraremos en detalle de cual es el perfil
adecuado de la POA sino nos enfocaremos en la
funcionalidad del modo en si, para mayor referencia puede visitar libros como los citados aqui,
este módulo sirve como la base para el desarrollo particular de nuestras propios módulos orientados a aspectos en nuestras aplicaciones con
Spring, asi tambien como el DI , AOP soporta
bajo acoplamiento de los objetos de aplicación.
El módulo AOP ofrece algunos enfoques para
construcciones orientadas a aspectos, incluyendo construcción de aspectos basados en AOP
Alliance interfaces y soporte para AspectJ.
Módulo Core Container
1.2.4.
Como se puede ver en la figura 1.1 el contenedor principal está ubicado en la parte base
del framework por lo que este provee de la funcionalidad fundamental del framework Spring.
Aqui encontramos la BeanFactory el cual es
el contenedor fundamental y la base de la cual
la inyección de dependencias DI 5 está basada.
1.2.2.
Módulo AOP: Programación
Orientada a Aspectos
Módulos JDBC y DAO
Como es de costumbre, trabajar con JDBC
puede resultar en un fichero relleno de código que obtiene una conexión, crea sentencias,
procesas conjunto de resultados, y luego cierra
la conexión, Spring JDBC y DAO son módulos que abstraen el fichero relleno de código
en un código limpio y flexible con el cual se
puede mantener una base de datos, además de
evitar problemas en fallas al cerrar recursos
obtenidos de la base de datos.También estos
módulos construyen una capa significable de
manejo de errores o excepciones comunes dados por unos servidores de base de datos., es
decir no tratemos de descifrar mensajes de error criptigráficos de SQL propietarios.
Módulo Application Context
El contexto de la aplicación se construye en
el contenedor principal, Spring se vuelve un
contenedor gracias a la presencia del BeanFactory en su módulo Core Container, pero este
módulo( application context) el que lo hace un
framework extendiendo el concepto dado por
BeanFactory brindando soporte a eventos en
de
Integración
el ciclo de vida de la aplicación y validación. 1.2.5. Módulo
ORM(Mapeamento
ObjetoAdemás este módulo tambien brinda muchos
Relacional)
servicios empresariales como Email, acceso JNDI, integración EJB, acceso remoto y schedulPara aquellos desarrolladores que prefiering.
an el mapeamento objeto-relacional sobre las
5
A partir de aqui nos referiremos a la inyección de conexiones JDBC, es que existe este módudependencas por su siglas en inglés DI
lo. Spring ORM da soporte a construcciones
5
grar todas esas tecnologı́as en simples plantillas de código.
hechas con acceso a objetos de datos DAO.
Tenemos que tener en cuenta que Spring no
intenta implementar su propio solución ORM,
sino que provee ganchos o nexos con algunos
populares frameworks ORM incluyendo Hibernate, Java Persistence API, Java Data Objects e IBATIS SQL Maps. El servicio de manejo de transacciones de Spring da soporte para cada uno de estos frameworks ORM
asi como tambien para JDBC. Cabe recalcar
que aqui es donde se da uso a uno de los conceptos principales de Spring, IOC en la cual la
forma de hacer la conexión se la deja a Spring
mientras el usuario solo inyecta la dependencia
que se va a usar en la conexión.
1.2.6.
1.2.8.
Módulo MVC
El modelo MVC (modelo vista controlador)
es un paradigma comunmente aceptado para
construir aplicaciones Web, en donde la interface de usuario es separada de la implementación de la lógica de la aplicación. Java
no escasea de frameworks MVC, con Apache
Struts, JSF, WebWork y Tapestry estando entre las principales opciones. Aunque si bien
Spring integra la gran mayorı́a de frameworks
MVC, este también incluye su propio y muy
capaz framework MVC que promueve el uso
de técnicaas de bajo acoplamiento en la capa
Módulo JMX (Java Manage- de aplicación.
ment Extension)
1.2.9.
Un punto importante del desarrollo en Java
es el trabajo aislado el cual es una parte crı́tica
para la aplicación de aplicaciones. Spring JMX
es un módulo que lo hace fácil de aislar exponiendo las aplicaciones como JXM Beans,
haciendo que sea posible monitorear y reconfigurar las aplicaciones.
Módulo Spring Portlet MVC
Muchas aplicaciones web son basadas en
páginas, eso es, que cada solicitud a la aplicación resulta en una nueva página mostrada. Cada página presenta una pieza especı́fica de información o lo cuestiona al usuario
con un formulario de llenado. En contraste, las
aplicaciones basadas en portlet agregan unos
1.2.7. Módulo JCA (Java EE Conec- pequeños bits de funcionalidad en una simple
página web es decir que provee una vista de
tor API)
muchas aplicaciones a la ves.
La forma de vida de las aplicaciones empresariales se ve sumergida en una mezcla de apli1.2.10. Módulo Web Spring
caciones corriendo sobre una fila disparatada
Spring MVC y Portlet requieren de una esde servicios de servidores y plataformas. Integras todas estas aplicaciones en una sola suele pecial consideración cuando cargan el contexto
ser una tarea ardua y problemática. El JCA de la aplicación. Por lo tanto el módulo Web
de Spring provee una manera estándar de inte- de Spring provee unas clases especiales que dan
grar todas estas aplicaciones con una variedad soporte a los módulos ya mencionados. Este
de sistema de información empresariales, in- módulo web también contiene y brinda soporte
cluyendo mainframes y bases de datos. En var- para algunas tareas orientadas a web, tales coios modos, JCS es como JDBC, excepto que mo carga multiparte de archivos y encubrimJDBC está enfocado en el acceso a base de iento de los parámetros de solicitud a los obdatos y JCA es de propósito más general, ab- jetos de negocio. Tambien brinda soporte de
strayendo todo el código necesario para inte- integración para Apache Struts y JSF.
6
1.2.11.
1.3.
Remoting
Remoting 6 . No todas las aplicaciones trabajan solas, algunas veces unas aplicaciones
dan parte de su funcionalidad para que otras
aplicaciones obtengan estos recursos y puedan
trabajar. Cuando una aplicación es accesada
por medio de la red, algunas formas de manejo
remoto son usadas para lograr comunicación.
El remoting de Spring permite exponer la funcionalidad de los objetos Java como si fueran
objetos remotos. O si es el caso de que se desea
acceder a objetos remotamente, este módulo
tambien simplifica el trabajo de cablear 7 objetos remotos dentro de la aplicación como si ellos fueran locales. Varias opciones de remoting
están disponibles, entre ellas RMI (Remote
Method Invocation) Hessian, Burlap, Jax-RPC
y como si fuera poco su propio HTTP Spring’s
Invoker.
1.2.12.
Spring Web Flow
Spring Web Flow puede ser visto como un
complemento al Framework MVC de Spring, al
usar su solucionador de vistas y controladores
especializados para proveer funcionalidad. Web
Flow permite modelar el comportamiento de
aplicaciones como una máquina de estados : la
lógica de la aplicación reside en varios estados.
Esto permite diseñar módulos de las aplicaciones web como juegos de usuarios complejos
sin puntos finales arbitrarios. Asi como MVC
es ideal para el diseño de problemas basados en
formularios, Spring Web Flow es muy cómodo para la mayorı́a de problemas de dinámica mayor. Los dos pueden ser usados en una
combinación muy apropiada para la solución
de problemas de aplicaciones web. La ventaja adicional de construir aplicaciones web usando Web Flow es la ”facilidad de diseño”
las máquinas de estado son fáciles de modelar
como diagramas, estos diagramas combinados
con el hecho de que una aplicación Web Flow
puede ser rápidamente empaquetada amplı́an
el reuso de estos componentes en otros proyectos.
Por ejemplo, en la figura 1.2 se observa un
ejemplo del flujo de páginas de una aplicación
web sencilla
Módulo JMS (Java Message
Service)
El lado oscuro del manejo remoto depende
de la confiabilidad de la red la cual determina si la comunicación está disponible. La comunicación orientada a mensajes, en la otra
mano, es más confiables y garantiza la entrega
de mensajes, aún si la red o los puntos de acceso finales no están disponibles. A su ves este
módulo ayuda a crear un servidor de entrega
de mensajes POJO que son capaces de acabar
como mensajes ası́ncronos.
Aunque si bien Spring cubre un montón de
terreno, lo más importante a realizar es que
Spring elimina el hecho de reinventar la rueda” donde sea posible. Spring confia amplia- Figura 1.2: Ejemplo de flujo de páginas web de
una aplicación sencilla.
mente en las API’s y Frameworks existentes.
6
Uso la palabra en inglés para representar este
módulo y no caer en malinterpretaciones de traducción
7
Cablear es el térmno usado para decir que se desea
establecer una conexion o relacionamiento, interpretado
del ingles wiring
La aplicación se dedica a registrar los datos
de los usuarios que la acceden. Desde la pagina
inicial el usuario selecciona la opción REGIS7
TRAR para proceder a su registro. Se le muestra una página donde debe introducir sus datos
personales para completar el registro. Una vez
introducidos, la aplicación muestra una página
confirmando el registro si no se produjo ningún
error, o bien ofrece al usuario la posibilidad de
volver a introducir sus datos correctamente si
se produjo algún error.
Como puede observarse, la forma más intuitiva de representar el flujo de páginas de
una aplicación es con un diagrama de estados.
Spring Web Flow utiliza estructuras declarativas basadas en máquinas de estados, como se
mostrará más adelante. Partiendo de este concepto, los aspectos fundamentales que potencia
Spring Web Flow son:
Encapsulación de la lógica de los flujos
de páginas como un módulo autónomo
que puede reutilizarse en diferentes situaciones. Hay aplicaciones web especı́ficas
que suelen utilizar la misma lógica de flujo de páginas, como por ejemplo, aplicaciones tipo çarrito de la compra”, correo
web, etc.
Proporcionar un motor capaz de capturar
los flujos de páginas de una aplicación, integrándolo con algunos frameworks de uso
habitual como Spring, Spring MVC o JSF.
8
Capı́tulo 2
Spring en la práctica
2.1.
Entendiendo la Inyección
de dependencias
código difı́cil de testear.
Cuando aplicamos DI, a los objetos les es dado
sus dependencias en tiempo de creación por alComo ya vimos en el capı́tulo anterior Spring guna entidad externa que coordina cada objeto
hace un montón de cosas , ı̈ncreible no??”pero en el sistema.
si queremos exponer el corazón de la creación
de Spring entonces habları́amos de la Inyección de dependencias 1 . Suena un poco intimidante, conjurando nociones de técnicas de programación compleja o patrones de diseño, pero
no es tal cosa , el asunto es mas sencillo de lo
que suena, de hecho el aplicar DI en los proyectos que desarrollemos nos permitirá hallar un
código significante mucho más simple, fácil de
entender y sobretodo fácil de testear. Pero realmente que significa la Inyección de depen- Figura 2.1: Inyeccion de dependencias comdencias???
prende el dar a un objeto las dependencias en
oposición a que el objeto las adquiera las mismas. Figura tomada de [2].
2.1.1. Inyectando Dependencias
La inyección de dependencias 2 sucede como
sigue , en cualquier aplicación no trivial existen dos o más clases que colaboran entre si para
desempeñar la lógica del negocio, tradicionalmente cada objeto es responsable por obtener sus propias referencias a los objetos con
los cuales colabora ( sus dependencias) . Esto puede llevar a un alto acoplamiento y un
En otras palabras, las dependencias son inyectadas dentro de los objetos, asi que DI significa una inversión de la responsabilidad con
consideración a como un objeto obtiene referencias de los objetos con los cuales colabora.
Ver 2.1.
El beneficio de la DI es el bajo acoplamien1
DI: Dependency Injection
to que esta ofrece. Si un objeto solo conoce
2
DI originalmente era conocido como Inversion Of
sus dependencias por sus interfaces mas no su
control hasta que en 2004 Martin Fowler acuño el término Dependecy injection fundamentamento que este de- implementación o como están siendo instanciadas , entonces la dependencia puede ser inscribı́a mejor el proceso que sucedı́a.
9
tercambiada con diferentes implementaciones
sin depender del objeto . Por ejemplo como
se observa en 2.1 la clase Foo sólo sabe sobre
su dependencia Bar a través de una interface,
luego la implementación de Bar no tiene importancia para Foo. Bar puede ser un POJO
local, un servicio remoto, un EJB o una implementación para unidades de prueba. spring no
hace nada mágico aquı́, nosotros todavı́a tenemos que suministrar las vaiables de referencias con las cuales manipular estas dependencias externas, pero, esto mueve los detalles de
configuración de estas dependencias del tiempo
de compilación a tiempo de ejecución.
2.2.
tan pronto como sea posible en el ciclo de vida
de las aplicaciones basadas en Spring. Java es
un lenguaje fuertemente basada en tipos, asi
que casts inapropiados causarı́an usualmente
un fallo de aplicación, lo cual se convierte en
un mı́nimo pero razonable conjunto de test en
la infraestructura del proyecto lo cual permitirá detectar la mayor parte de tipos inconsistentes en tiempo de construcción, el cual es casi
tan bueno para la mayorı́a de los casos en tiempo de compilación. Tambien existen herramientas como el SpringIDE que nos provee de caracterı́sticas para desempeñar la validación de
tipos en el proceso del desarrollo
Ventajas y desventajas de 2.3. Acoplamiento
la inyección de dependenLa gran ganancia en usar la inyección de decias
pendencia es que esta permite hacer las aplica-
En un principio, no se necesitaba de un
framework para inyectar dependencias dentro
del código; esto se podı́a realizar desde código. En la práctica sin embargo, la mayorı́a
de aplicaciones es construida usando la inyeccion de dependencias como un framework de
algún tipo. Tipicamente con Spring, este lee
una información de configuracion y luego usa
la Java Reflection API o bytecode. Aunque
este comportamiento no es innato en el enfoque de la inyección de dependencias, es ampliamente usado, lamentablemente esto conlleva a una desventaja que los contenedores que
Spring manejan tienen una dura codificación:
es decir que ellos pierden algunas de las ventajas del chequeo de tipos estatico. La información de configuración no será leı́da hasta
el tiempo de ejecución, por lo tanto cualquier
tipo de información incompatible en tipo dada
en la configuración no producirá errores sino
hasta tiempo de ejecución. Esto no es un gran
problema por si ya lo habı́amos pensado, esta
desventaja es minorizada por la tendencia de
la información de configuración a ser procesada
ciones con bajo acoplamiento. Esto quiere decir
que, cualquier clase de la implementación no
tenderı́a a tener dependencias en cualquier otra
clases de la implementación especı́fica. Aún asi
se tendrán dependencias del tipo sistema que
tendrán que ser restablecidas en la aplicación,
por supuesto, el bajo acoplamiento encamina
al uso de la programación de interfaces mas
que abstracción o implementaciones concretas.
2.3.1.
Acoplamiento estrecho
Miremos el siguiente código :
public class TightlyCoupled
{
private Transport transport =
new SmtpImpl();
public void send Message(){
transport.send();
}
}
El código es sencillo pero refleja un escenario
de la vida real muy común en el cual el
10
acoplamiento estrecho causa muchos problemas .El mecanismo de transporte usado en
esta clases es obviamente SMTP. La implementación ha sido duramente codificada dentro de la clase y no puede ser cambiada excepto
por una recompilación, esto conlleva a dos conceptos mayores como Testing y reusabilidad.
Una prueba de unidad escrita para esta clases
no puede fácilmente separar el comportamiento
de la clase TightlyCoupled del comportamiento de la clase SmtpImpl. En pocas palabras
el hecho de que la implementación de Tightlycoupled tenga una implementación fuertemente codificada con la clases SmtpImpl , el
transporte no puede ser fácilmente reemplazado cuando sea necesario por un transporte
diferente , por ejemplo SOAP, para cualquier
contenido que quiera ser transmitido. Esto reduce considerablemente a la clases para ser reusada en otras situaciones.
2.3.2.
Como se puede ver este código ilustra claramente el rompimiento de las dependencias en la
implementación especı́fica del transporte, permitiendo a la implementación ser creada mediante el constructor, y se tendrı́a alternativas
de implementación a ser enviadas. Rompiendo
el acoplamiento a su minimo valor es sinonimo de eliminación de los problemas externos
en Test y reusabilidad. Para reusabilidad de
esta clases podemos cambiar el modo de transporte por SOAP, RMI o cualquier otro tipo de
transporte que sea necesario. La única desventaja del enfoque del bajo acoplamiento es un
notable exceso de elocuencia en los resultados
de la implementación de la clases, la mayoria de ellos derivando de la demanda de las
especificaciones de JavaBean cuando se añade
propiedades a las clases.
2.4.
Configuración XML
Libertad de acoplamiento
La libertad de acoplamiento (loose Coupling
de código permite la mayor de las dependencias suministradas desde el código externo. De
nuevo tocaremos el ejercicio anterior pero ahora con bajo acoplamientos de sus componentes
3
public class LooselyCoupled{
private Transport transport;
public LooselyCoupled(final Transport
transport){
this.transport= transport;
}
Figura 2.2: Archivo de configuración de dependencias XML, en la cual se observa la creación
de dos tipos de objetos, asi tambien el uso y
asignación de propiedades.
public void sendMessage(){
transport.send();
}
}
3
Por sus siglas en inglés peude ser interpretado como
poco acoplamiento.
Aunque si bien en un comienzo las aplicaciones Spring pueden ser configuradas por
11
varias maneras diferentes, la configuración
XML es por lejos el enfoque más común. Por
cierto, para la mayorı́a de desarrolladores, el
conjunto de archivos XML es usado para configurar la factory de instancias para un proyecto Spring y la BeanFactory las cuales son virtualmente sinónimas. La configuración XML
de la fábrica esta disponible en tiempo de ejecución, asi que no hay una mala manera de
pensar en ellas. Debemos de recordar en particular que no hay una correspondencia de 1:1
entre las fábricas y los archivos XML. Es totalmente posible y normal el uso de múltiples
archivos para configurar una simple fábrica, o
usar un simple archivo para instanciar algunas
fábricas discretas. Para ver un ejemplo de la
estructura general de una archivo xml ver 2.2
Por defecto, la definición del XML Bean se describe como un singleton
2.5.
Spring como framework
compilador (ECJ) que se entrega como parte
de Eclipse (y que son usados también para desarrollar el mismo Eclipse). Para los ejercicios
de aplicación usaremos la version liberada llamada Ganymede la cual corresponde a la versión 3.4 de eclipse lanzada el 25 de Junio del
2008.
2.5.2.
de
Spring
con
De acuerdo se han ido liberando versiones
de producción en eclipse, cabe recordar la versión Europa,Callisto y la actual Ganymede se
han ido facilitando las tareas de configuración
de plugins y ampliando el campo de trabajo
de los mismo con un arsenal completo de herramientas integradas para el desarrollo de software. Aquı́ por ahora solo necesitamos instalar
el plugin para eclipse de Spring denominado
SpringIDE plugin para eclipse.
Los pasos a seguir son los siguientes :
Para el desarrollo de aplicaciones usando
Spring primero definiremos unas cuantas herramientas asi como IDE’s para el apoyo en el
desarrollo, particularmente nos enfocaremos en
el IDE Eclipse Ganymede y en todas las posibilidades que este IDE brinda para el desarrollo de aplicaciones con Spring, para que en
el capı́tulo 3 nos dediquemos exclusivamente a
las demostraciones de Spring en aplicaciones
de proyectos de ejemplo.
2.5.1.
Instalación
Eclipse
1. Ir a la pestaña Help →Software update
como se puede apreciar en la figura 2.3
Eclipse IDE
Eclipse es un entorno de desarrollo integrado de código abierto multiplataforma para desarrollar lo que el proyecto llama .Aplicaciones
de Cliente Enriquecido”, opuesto a las aplicaciones Çliente-liviano”basadas en navegadores.
Esta plataforma, tı́picamente ha sido usada
Figura 2.3: Menu de actualizaciones de softpara desarrollar entornos de desarrollo integraware para Eclipse
dos (del inglés IDE), como el IDE de Java llamado Java Development Toolkit (JDT) y el
12
2. En caso de que no se encuentre el repositorio adecuado agregar como site la siguiente dirección
http://springide.org/updatesite/
.Luego esperar a que genere el site y entonces tendremos que elegir las siguientes
opciones de acuerdo a lo que deseemos
trabajar. Ver figura 2.4
pezar creando un Proyecto Spring de desarrollo muy similar a la creación de proyectos Java,
para ello ver figura 2.6 si se el resultado de
todos estos pasos es como el de las imágenes
anteriores entonces por ahora ya hemos terminado.
Figura 2.4: Opciones de instalación de plugins para Spring en Eclipse, escogiendo las necesarias de acuerdo al proyecto seleccionado
Bueno y eso serı́a todo para poder comenzar a
trabajar proyectos de Java con Spring , cabe recalcar que cuando expliquemos las aplicaciones
de ejemplo entraremos en detalle con las configuraciones hechas en el IDE para poder ejecutar las mismas, para ello ver el siguiente capı́tulo. Por lo pronto luego de hacer todo lo anterior
y saber y si nuestro plugin está completamente
instalado tenemos que crear un proyecto Java
4 y luego al hacer click derecho sobre el proyecto observar el menu contextual de Spring ver
figura 2.5 o si deseamos usar todas las potentes
caracterı́sticas y facilidades de este plugin em4
Aqui no se entrará en detalles de como crear proyectos Java ya que el fondo del presente trabaja es enfocarse en Spring
13
Figura 2.5: Menu de opciones de proyecto obtenido al hacer click derecho sobre un
proyecto Java , el cual nos indica si a nuestro
proyecto deseamos agregarle las caracterı́sticas
de Spring
Figura 2.6: Opción para crear un proyecto
tomando como base Spring y asi garantizar las
caracterı́sticas que SpringIDE da como beneficios para el desarrollo de proyectos
14
Capı́tulo 3
Spring en código
3.1.
Aplicación sencilla
programa para computar las áreas para una
colección de formas geométricas. Tenemos que
Para todos los ejemplos detallados en este tener en cuenta que debemos de usar un código
capı́tulo se seguira la misma instalación y con- que elimine la dependencia de cualquier tipo
figuración a seguir :
particular de forma, pero manteniendo una
Para crear un proyecto Java : New → gran variedad de formas.
Proyect → Java → java. Proyect.
Una ves creado el proyecto iremos con un
click derecho sobre el proyecto creado al
menu de Spring : Spring tools → Add
Spring Proyect Nature .
Una ves realizados estos pasos tenemos
que agregar los siguientes Jar al Proyecto spring.jar y commons-logging.jar ambos ubicados en la carpeta del framework de
Spring. Estos Jars debemos de agregarlos al
classpath de la aplicación , no creo que haya
mayores problemas al hacer eso pero los pasos
serı́an los siguientes Properties → Libraries →
Add Jars. y Ahora podremos trabajar con total tranquilidad en este ejemplo.
Para poder hacer un buen uso de las caracterı́sticas de Spring es necesario manejar y configurar un XML Bean Definition del cual se
forma una plantilla como la de la figura 2.2
para ello agregamos un nuevo fichero XML en
la carpeta Src de nuestro proyecto o vamos
a new → other → Spring →Bean Definition File .
Ahora toca exponer la lógica de la aplicación ,
en este sencillo ejemplo de Spring haremos un
Estrategias
Crear Interfaces o clases abstractas.
Hacer implementaciones concretas de las
interfaces.
Declarar objectos concretos en el fichero
de definiciones Bean.
Cargar del archivo Bean y obtener las dependencias.
Entonces empezaremos por crear nuestra interface perteneciente al paquete coreservlets
y llamada Shape
package coreservlets;
public interface Shape{
public double getArea();
}
Ahora implementamos nuestra clase concreta Rectangle la cual es una forma de objeto
15
public class Rectangle
implements Shape{
private double length, width;
public Rectangle (){}
public Rectangle(double length,
double width){
setLenght(length);
setWidth(width);
}
public double getLenght(){
return length ;
}
public void setLength
(double length){
this.length =length;
}
Figura 3.1: Archivo de configuración Xml para
nuestro primer ejemplo en la que usamos la DI
para señalar objetos con los cuales deseamos
trabajar
public void setWidth
(double width){
this.width=width;
}
Ahora una ves que compilamos todo nuestro
proyecto la salida aunque ya se sabe cual
será paso a especificar
Area of Rectangle is 200,00
Area of Circle is 314,16
public double getArea(){
return length* width;
}
}
En el Cd digital que acompaña a este texto
puse una aplicación por cada módulo de Spring
basado en [3] las cuales son de libre uso para
Tambien definimos una clase Circle como exposición y uso, las que a continuación detallo
clase concreta a diferencia de que esta solo ten- :
dra un radio en ves de Length y Width. Mas
01* Spring-* Son las primeras aplicaciones
importante aqui es el manejar el archivo de
en las que se da ejemplos de como es soporconfiguración de la aplicación el cual lo detaltado Spring en Eclipse asi como también
lamos como sigue(Ver 3.1) :
la manera de asignar Beans, usar métoAhora para terminar nuestra pequeña dedos Factory y alcances de los Beans. Asi
mostración solo falta definir nuestro método
como tambien en el tercer paquete enconmain , y para ello recien utilizaremos Spring
tramos la manera como añadir Proyectos
1
para poder ejecutar todo nuestro proyecto. . El
Web Dinámicos con Eclipse y además de
código de nuestro método main quedaria como
poder registrar Listeners con web.xml.
se observa en la figura 3.2
1
Los proyectos vienen adjunto al presente trabajo ,
asi que no soy muy explı́cito en todo el contenido ni
detallo todo el código
16
01-spring-foundations Aunque parezca un
poco mas sencillo aqui se detalla los fundamentos de Spring tales como el ambiente
Para mayor información revise las referencias aunque por ser muy pocas poseen
un buen contenido didactico y completo
acerca de todo lo hablado aqui.
Figura 3.2: Código del método main en la cual
primero llamamos a nuestro archivo de configuración y luego cargamos las dependencias
de ejecución o la inversión de control, el
desarrollo POJO y como ejemplo se desarrolla el clasico Hola Mundo.
Spring-core En este módulo se da a completar los conceptos de integración de propiedades, mapeamento de colecciones y referencias a
otros beans.
Spring-Jdbc Aqui tomamos una introducción a JDBC
y su desarrollo mostrando la IoC.
Spring-AOC Un ejemplo práctico de la Programación
Orientada a Aspectos y su integración con
Spring.
Spring-Int* Bueno aqui un poco mas complicado el
tema pero se tocan puntos como la integración con JPA, JSF, test en medios
transaccionales, asi como los procedimientos para construcción generales y construcción de módulos multiproyecto, los
cuales de por si son extensos y complicados de explicar y lograr dicho objetivo requerı́ria de cientos de imagenes y hojas,
este texto escapa de su explicación en detalle mas no podı́amos dejar de tocarlo.
17
Bibliografı́a
[1] CRAIG WALLS with Ryan Breidenbach.
”Spring in Action”Second Edition ”Manning Publications 2008.
[2] Dave Minter. ”Beginning Spring 2 From
Novice to Professional”.Apress , 2008.
[3] http://courses.coreservlets.com/CourseMaterials/spring.html
18