Tutorial Java Web: JSF + Hibernate + BootsFaces [Parte 9: Inyección de Dependencias en JSF]

Miguel Manjarres
4 min readJun 19, 2020

--

Hola 👋 y bienvenido a la novena parte de este tutorial en el que construiremos nuestra propia aplicación de tareas en JSF. En el tutorial anterior terminamos la capa de presentación de nuestra aplicación. Sin embargo antes de avanzar hay un tema importante del que debemos hablar respecto a los beans.

En el tutorial número 7 “Introducción a los Managed Beans” discutimos acerca de que eran los Managed Beans, cómo crearlos y como podíamos ajustar su alcance (contexto), les había dicho que esos eran beans en JSF pero en realidad eso no es del todo cierto, Cuando anotamos una clase con @Named en efecto, estamos creando un MB pero también estamos diciendo que esa clase es un buen manejado por el CDI.

¿Qué es el CDI?

El contexto e inyección de dependencias (Context and Dependency Injection, por sus siglas en inglés) es una parte fundamental y una herramienta de la arquitectura de las aplicaciones Java EE. El CDI se encarga de gestionar el ciclo de vida de un MB ya sea a través de los contextos anotados o a partir de un archivo de configuración XML.

Pero, ¿Qué es la inyección de dependencias? supongamos que tenemos las siguientes clases:

La clase Carro tiene un atributo de tipo Motor. Para que el método encender() de la clase Carro funcione, el atributo motor tiene que estar instanciado, de otra forma fallará. Podriamos instanciar un nuevo objeto Motor en el constructor de la clase, ¿Pero no sería genial que nuestra aplicación en tiempo de ejecución hiciera esto por nosotros? De eso se trata la inyección de dependencias, le decimos a Java que nuestra clase Carro depende de la clase Motor para funcionar, al momento de ejecutar la aplicación crea una nueva instancia de esta clase para que todo marche según lo planeado.

De hecho nosotros ya habíamos hecho este proceso en nuestro proyecto y tú nisiquiera lo habías notado. ¿Recuerdas nuestra capa de servicios? Los controladores necesitaban los métodos que estaban en nuestro servicio, para suplir esta necesidad lo que hicimos fue crear manualmente una instancia de la clase y usarla dentro de nuestro controlador, pero, ¿Porque hacer eso si la Inyección de Dependencias es una opción?

Para empezar a usar esta maravillosa herramienta, abre el proyecto JSFTutorial en tu IDE Eclipse, a continuación abre las clases UsuarioService y TareaService y remueve de ellas las facilidades del patrón Singleton, no lo necesitaremos más, debería quedarte lo siguiente:

Clase UsuarioService
Clase TareaService

A continuación vamos a anotar nuestras clases con uno de los contextos que vimos en tutoriales anteriores, en específico la anotación @ApplicationScoped (si no recuerdas, te invito a releer el tutorial número 7). Escogemos este contexto porque nuestro bean necesita mantener su estado durante todo el ciclo de la vida de la aplicación.

Después de haber hecho eso, en los controladores, reemplaza las lineas:

UsuarioService uService = UsuarioService.getInstance();TareaService tService = TareaService.getInstance();

Por las siguientes:

@Inject
UsuarioService uService;
@Inject
TareaService tService;

Dónde corresponda. Debería quedarte algo como esto:

Clase UsuarioController
Clase TareaController
Clase TareaService

Como paso final, dirígete a la carpeta WebContent > WEB-INF y crea un archivo XML llamado beans.xml . Este es un archivo de configuración para el CDI, en el que le diremos que haga un escaneo a nivel de paquetes en todo el proyecto en busca de posibles beans.

Cuando estés listo, copia y pega en el archivo el siguiente código:

Si ejecutas tu aplicación verás que no hay ningún cambio o error, todo funciona como debería, pero ahora estás aprovechando el poder de la Inyección de Dependencias.

Como ejercicio puedes repetir el proceso con los repositorios, después de todo, los servicios dependen de los métodos definidos en los repositorios para funcionar.

¡Felicidades 🥳! Has refactorizado tu código de forma exitosa, ya puedes presumir ante tus amigos que sabes acerca de la inyección de dependencias. En los próximos tutoriales veremos cómo integrar BootsFaces a nuestro proyecto. Muchas gracias por leer hasta aquí y espero verte en una próxima ocasión.

Si te gustó el tutorial y quieres apoyarme para seguir creando más contenido así puedes hacerme una donación aquí.

Tutorial anterior: https://medium.com/@devtony101/tutorial-java-web-jsf-hibernate-bootsfaces-8aca49a41f44

Tutorial siguiente: https://medium.com/@devtony101/tutorial-java-web-jsf-hibernate-bootsfaces-bbd06893c0ff

--

--

Miguel Manjarres

Ingeniero de Software con experiencia en desarrollo de aplicaciones web y de escritorio