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