Estudio comparativo entre JBoss Seam y Spring

RECU-0169 (Recurso Técnica)

Descripción

Las dificultades que presenta la integración de Spring con la capa de presentación basada en JSF, provoca que se busquen alternativas eficientes a esta arquitectura, o que, al menos, de soporte a alguna de las deficiencias que presenta Spring. JBoss Seam es un framework que puede integrarse con Spring y que puede resolver alguno de los problemas de este framework, especialmente los originados por el uso de JSF como estándar de la capa de presentación.

Uso en MADEJA

A continuación se va a realizar un estudio comparativo sobre los dos frameworks.

¿Porque elegiríamos Spring?

  • Produce código limpio
  • Mejoró la configuración de la aplicación
  • Da soporte a la programación orientada a aspectos
  • Escala la seguridad mediante la integración de Spring Security
  • Muchos de los objetos de negocio construidos bajo spring no tienen dependencias con Spring
  • Proporciona un marco constante para el acceso de datos, usando JDBC o una O/R que traza un mapa del producto como TopLink, Hibernate o JPA
  • Resuelve muchos problemas sin el uso de EJB
  • Realizar testeo es sencillo

¿Porque elegiríamos JBoss Seam?

  • Combina las normas de JEE 5 (EJB 3.0, JPA, JSF, la Anotación) a la perfección
  • Introduce la biyección de dependencias
  • Diseñado para controlar estados
  • Integración de Proceso de negocio (jBPM)
  • Integración de AJAX (da soporte a ICEFaces y RichFaces)
  • La integración de Reglas de negocio (Drools)
  • Manejo del workspace
  • Probablemente forme parte del futuro estándar WEB-Beans

Comparativo

A continuación vamos a ofrecer un estudio centrado en varias funcionalidades del Framework. Vamos a considerar :

  • Aspectos centrados al desarrollo
  • Aspectos centrados en la configuración
  • Aspectos centrados en la presentación
  • Aspectos centrados en los servicios
  • Aspectos sobre la persistencia y la abstracción
  • Aspectos de despliegue

Aspectos centrados al desarrollo

DesarrolloSpringSeam
Inicio rápido de proyectosAppFuse permite generar una básica de proyectosUtilizando su herramienta propia SeamGen
Plugin IDESpringIDEJBossTools
DocumentaciónEs muy completa y exhaustivaExiste buena documentación
LoggerTípica configuración basada en logging habitualRealiza anotaciones con la etiqueta @logger para crear el log
PruebasSpring tiene completamente integrado el testing. Al estar basado en POJOs, se adapta perfectamente a JUnit. Para realizar las pruebas de integración, existen herramientas basada en la capacidad de inyección de dependencias y de transaccionalidadAl ser POJOs todos los componentes, las pruebas unitarias resultan triviales. Con anotaciones, se logra recrear el entorno de forma sencilla. La herramienta SeamGen crea de forma automática los test unitarios y test TestNG permite gestionar simulaciones y respuestas JSF para cada acción mediante scripting.
Capas afectadasSpring, esta muy centrado en la capa de negocio. Ofrece soluciones para manejar la capa de presentación y se integra con los motores de persistencia mas comunes.JBoss Seam ofrece una solución completa. Engloba desde la capa de presentación a la capa de datos.

Aspectos centrados en la configuración

ConfiguraciónSpringSeam
Alcance de objetosPredefinido, extensiblePredefinido, no extensible
XMLRequeridoOpcional
AnotacionesActualmente sólo usa anotaciones cuando se realizan transaccionesPueden utilizarse anotaciones en un sentido más amplio, en todas las capas.
Definición por defecto de la configuraciónOfrece la ventaja de “XML extensible”. Spring permite que el resto de frameworks implicados se integren configurando un xml de configuración.Se realiza básicamente sobre anotaciones. Aún así, existe parte de la configuración que debe hacerse con XML (como la relativa a JSF). Esta pequeña parte es autogenerada por la herramienta SeamGen.

Aspectos centrados en la presentación

PresentaciónSpringSeam
WEB FrameworkA elegirJSF
VistaA elegirJSP, Facelets
PlantillasNo tiene un sistema de plantillas propio, depende de la tecnología usada en la capa de presentaciónSoporta de forma integrada al generador de plantillas para JSF facelets. Su principal característica es la definición de la vista mediante xml en forma de árbol. De esta forma, se permite ir creando componentes como composición de otros componentes
NavegaciónPosee un módulo propio que controla la navegación denominado Spring Web Flow. Con él, se permite capturar los flujos de las páginas e integrarlo con otros frameworks (struts, JSF, etc..)Permite elegir entre dos modos de navegación . El primero se basa en el estado de la aplicación usando el framework jPDL y el segundo basado en las reglas de navegación JSF Rules o Seam Rules.
AJAXDado el carácter abierto de la elección de la tecnología para la capa de presentación, el soporte para Ajax dependerá principalmente de la elección.Esta diseñado para soportar AJAX de forma integrada. Maneja peticiones que se realizan de forma simultánea por usuarios independientes, preservando la confidencialidad e integridad de los datos. Posee un sistema de caché que evita la sobrecarga producida por el uso de AJAX en el flujo de datos El soporte en la parte del cliente dependerá de la implementación de JSF que se elija.

Aspectos centrados en los servicios

ServiciosSpringSeam
PlanificaciónQuartzSe realiza mediante anotaciones @timeout
Plantilla de EmailsFreemarker, VelocityFacelets
Recepción EmailNoMDB
ValidacionesRealiza las validaciones a partir de un sistema propio que no pertenece a ninguna capa. Permite que el usuario integre su propia lógica de interfaz a partir de una interfaz. Posee tratamiento de errores y añade, con Spring Security otro paquete de validacionesLas validaciones son definidas mediante anotaciones permitidas en la especificación JPA. Se pueden realizar validaciones individuales o completas (todos los campos de un formulario).
SeguridadSpring posee un framework de seguridad asociado, Spring security , que gestiona todo el mecanismo de login, autentificación y autorizaciónEl Seam Security API es una parte de Seam que proporciona funcionalidades de autenticación y autorización basado en JAAS (Java Authentication and Authorization Service). Puede usarse el modo sencillo, por defecto, que se basa en roles o usar el framework JBoss Rules, que ofrece un sistema más poderoso basado en reglas. El sistema se encarga del manejo de errores de autorización o autenticación, permitiendo redirigir al usuario a una página determinada. Las restricciones pueden establecerse mediante el uso de anotaciones. Permite restringir tanto acciones como entidades o páginas o componentes de la página.
EBJ 2.XSiNo

Aspectos sobre la persistencia y la abstracción

Persistencia y AbstracciónSpringSeam
TransaccionesAbstractas (hay que escalarlas)CMT y BMT o mediante JBoss JTA
Inyección de dependenciasEs un factor básico en la arquitectura de Spring. Mediante el BeanFactory, se instancian los objetos y se manejan las relaciones entre ellosSoporta la Dependency Injection y ademas añade Dependency Outjection, depositando y obteniendo instancias de un componente de los diferentes contextos, cada una de ellas con su propio estado.
AOPTiene implementado el uso de aspectos a través de proxies dinámicos. Sólo pueden utilizarse a nivel de métodos. Permite la integración de AspectJ que ofrece funcionalidad completa.Hace uso extensivo de AOP para proporcionar funcionalidades de caché, seguridad, inyección de dependencias, interceptores, pageflow…

Mapeo ORMSe permite la integración de las implementaciones ORM más significativas. Se puede utilizar las implementaciones ofrecidas por el módulo SpringDAO o realizar implementaciones de DAOs sobre las diferentes APIs de los ORMOfrece la posibilidad de integrar los motores de persistencia más populares: Hibernate y el Java Persistence API introducido con EJB 3.0. Mediante el uso del contexto de conversación y el empleo de componentes con estado asociados al contexto, soluciona eficientemente las operaciones transaccionales y elimina los errores de implementación del patrón de carga perezosa (LazyLoad) que se producen en otras soluciones ORM.
CachéNo dispone de un sistema de caché propio, pero se permite la integración de frameworks destinados a su manejo o módulos propios como el Spring AOP Cache. Éste último se basa en AOP para realizar las intercepciones entre las diferentes invocaciones de métodos y almacenar en memoria el resultado de operaciones como una consulta a una base de datos.Ofrece la integración de varios sistemas de caché. Ofrece una caché para el manejo de los datos. Se mantiene una caché en la solución ORM adoptada. El contexto de persistencia manejado por Seam actúa como caché de los datos leídos en la conversación actual.

Aspectos de despliegue

DespliegueSpringSeam
JDK mínima1.31.5
Contenedor ServletSiSi, integrando JBoss miniservlet
Servidor de aplicacionesSiSi

Conclusiones

Uno de los aspectos a considerar es que JBoss Seam permite la integración de Spring, por lo tanto puede ser una buena solución como capa intermedia entre la presentación proporcionada por JSF y la capa de negocio definida por Spring.

De esta manera podremos utilizar las ventajas referentes al uso de anotaciones y de la biyección proporcionadas por JBoss Seam, con respecto a la tecnología JSF. Asimismo, la rápida integración que se puede hacer de AJAX resulta muy beneficioso para un correcto desarrollo.

Por otra parte, no se presentan, a priori, problemas de integración en la comunicación de Spring con JBoss Seam. Seam está concebido como una programación por componentes (como JSF, GWT, Wicket) y esta dirigido hacia el nuevo estándar WEB-Beans, lo que puede convertirlo en una arquitectura imprescindible en los próximos años.

Ademas implementa JPA como motor de persistencia, lo que indica que tampoco deben existir problemas en esta capa. En definitiva, Seam es una buena opción para proyectos que necesitan un alto grado de integración.

Referencias

  • “Seam Framework. Experience the Evolution of Java EE” Michael Yuan, Editorial Prentice-Hall
  • “Seam 2.x Web Development”, David Salter, editorial PACKT
  • “Seam in Action” Dan Allen, editorial Manning
  • “Practical Jboss Seam” Jim Farley, Editorial Apress
  • “Spring framework reference manual” Documentación de referencia del framework Spring
JSP, Facelets