martes, 1 de mayo de 2012

Reference Card de Weld

Siguiendo con el tópico del post pasado: CDI (JSR-299), el Contenedor de Contextos e Inyección de Dependencia (Java Contexts and Dependency Injection for the Java EE platform), comparto en esta entrada dos referencias excelentes para aprender CDI y Weld, la implementación de referencia de CDI:
Una de las cosas que sorprende de Weld es que puede funcionar standalone, sin necesidad de ningún tipo de servidor. Esto es fascinante, ya que en una aplicación Java SE podemos contar con un inyector de dependencias. La documentación aclara que hay contextos que no estarán disponibles, como Session o Request, algo que es lógico. También puede funcionar en un contenedor de Servlets, como Tomcat o Jetty.

La reference card hace referencia a tres arquetipos Maven (ninguno es el que usamos en el post anterior):
  • weld-jsf-servlet-minimal: crea una aplicación web que usa Weld y JSF 2.0 (JSR-314)
  • weld-jsf-jee-minimal: crea una aplicación web que usa Weld, EJB 3.1 (JSR-318) y JSF 2.0 (JSR-314), pero sin persistencia
  • weld-jsf-jee: crea una aplicación web que usa Weld, EJB 3.1 (JSR-318), JSF 2.0 (JSR-314) y JPA 2.0 (JSR-317) para la persistencia
Comparado con el arquetipo jboss-javaee6-webapp que habíamos visto, la aplicación que crea weld-jsf-jee es un poco más pequeña. Claro, el primero muestra un ejemplo más completo, incluso exponiendo un servicio REST con JAX-RS 1.1 (JSR-311).

Otra de las cosas que sorprende, por lo menos a mí que vengo de trabajar bastante con Seam 2, es que no hace falta ninguna anotación ni configuración extra para que una clase Java normal sea considerada como un Bean para el CDI. La única condición de Weld es que exista un archivo beans.xml en el META-INF del EAR o en el WEB-INF del WAR. En este xml se pueden declarar interceptores, decoradores e implementaciones alternativas de interfaces para cambiar en tiempo de despliegue. El archivo puede estar vacío.


Como en Seam, dependiendo del tipo de componente Java EE que sea (Entidad, EJB, Managed Bean de JSF, Spring Bean), tomara un scope u otro por defecto (si no se le especifica).

Los scopes que CDI provee son:
  • @RequestScoped
  • @ConversationScoped
  • @SessionScoped
  • @ApplicationScoped
  • @Dependent
Voy a echar en falta el contexto PAGE (o VIEW como se llama en JSF 2.0). Yo lo usaba bastante. No sé si lo provee Seam 3. De todas formas, todo apunta a que se use bastante el scope Conversation, que parece mucho más sencillo de utilizar que en Seam 2.

Es claro que habrá un antes y un después de CDI en el mundo de Java EE. El @Inject es demasiado simple de usar y, como dicen los españoles: mola demasiado.

Para cerrar, les cuento que estaré dando una charla de Java EE 6 que se llamará justamente Java EE 6 In Action. La charla será en la Universidad CAECE el 15 de mayo a las 19hs, con duración estimada de una hora y media. Todavía no fue lanzada la propaganda oficial. Cuando lo esté, supongo que durante esta semana o la próxima, la linkearé en este blog.