• Giovanny Rey Cediel

Inversión de Control en Spring Boot—@Component, @Autowired, @Value, @Bean y @Configuration


Inversión de control o IoC también se conoce como inyección de dependencias. Es un proceso mediante el cual el ciclo de vida de los objetos se transfiere a un componente que en Spring se conoce como contenedor IoC. Cuando el contenedor IoC crea los objetos también se encarga de asociarles las dependencias, es decir, si un objeto tiene otros objetos declarados como atributos, el contenedor IoC también es capaz de crearlos. Este proceso lo puede hacer valiéndose de argumentos de constructor, o de un método de fábrica, o de atributos que son establecidos después de que el objeto es construido.


Supongamos que tenemos la clase Usuario, que internamente contiene como atributo la clase Persona,


Si quisiéramos instanciar la clase Usuario sería necesario hacer lo siguiente:

Observamos que primero se instanció la clase Persona, ya que es requerida para construir el objeto Usuario. Si tuviéramos muchos clases que instanciar —es decir, dependencias—, antes de crear el objeto usuario, este proceso se volvería tedioso. La buena noticia, es que el contenedor IoC puede hacer este trabajo de forma automática siguiendo una serie de instrucciones conocidas en Spring como configuración de metadatos.


La configuración de metadatos la podemos hacer por medio de un archivo XML o por medio de decoradores —también conocidos como anotaciones. Ya que los archivos XML de configuración son rara vez usados en Spring Boot, en este post vamos a centrarnos en la configuración de metadatos con decoradores. Sin embargo, comparto el siguiente enlace de referencia, con información más amplia para aquellos interesados en el tema: Configuración de metadatos en Spring.


Configuración de Metadatos con Decoradores

Hay dos maneras de proporcionar información de metadatos para que el contenedor IoC construya objetos con sus dependencias. Una manera es con el uso de @Component y @Autowired. Y la otra es con el uso de @Configuration, @Bean y @Autowired.


Para aquellos que hemos trabajado en Java con el estándar JSR330 hay una buena noticia, y es que @Named pude ser usado en vez de @Autowired.


Metadatos con @Component y @Autowired

Una clase decorada con @Component indicará a Spring que el ciclo de vida de la misma será manejado por el contenedor IoC. Por tanto la clase puede ser inyectada como dependencia en otras clases haciendo uso de @Autowired.

Siguiendo con nuestro ejemplo, vamos a instanciar la clase Usuario de la cual hablamos arriba, pero esta vez vamos a hacerlo con @Component y @Autowired.


Primero vamos a decorar la clase Persona con @Component para que pueda ser inyectada en el atributo persona de la clase Usuario:

Ahora vamos decorar la clase Usuario con con @Component para que pueda ser inyectada en otras partes del código —incluyendo clases unitarias. También vamos a decorar con @Autowired el atributo persona, para que una instancia de la persona sea inyectada en este.

Eso es todo, ahora podemos crear un objeto de la clase Usuario inyectándolo con @Autowired en un atributo de cualquier otra clase. En el siguiente trozo de código vamos a usar una clase de prueba para inyectar una instancia de la clase Usuario, y luego la vamos a imprimir en la salida estándar.

Cuando ejecutamos la clase de prueba observamos que no se produce ningún error, esto indica que la inyección se realizó con éxito, es decir, el contenedor IoC se encargó de construir y asociar el objeto usuario en el atributo decorado con @Autowired.


Constructor con @Autowired y Parámetros por Default con @Value

Usualmente los parámetros dependientes de una una clase se asocian en el constructor de la misma. Inclusive, estos pueden tener valores por default. Asi que nuevamente vamos a instanciar la clase Usuario con @Autowired, pero esta vez vamos a usar constructores y valores por default en las clases Persona y Usuario. La clase Persona quedaría como se muestra a continuación:

La clase Usuario quedaría de la siguiente manera:

La clase de prueba sería como se muestra a continuación:

Cuando ejecutamos la clase de prueba, el resultado mostrará los valores por default del objeto usuario, construido e inyectado por el contenedor IoC, como se observa a continuación:


@Bean y @Configuration

El decorador @Bean es usado para indicar que un método instancia, configura e inicia un nuevo objeto para ser manejado por el contenedor IoC. Se puede usar con clases decoradas con @Component, sin embargo, es más usado con clases decoradas con @Configuration.

Decorar una clase con @Configuration indica que su propósito principal es ser fuente de definiciones de bean. Además, las clases @Configuration permiten inyectar las dependencias entre beans llamando a otros métodos decorados con @Bean en la misma clase.


Inyección de Dependencias entre Beans en Clases @Configuration

Cuando los beans tienen dependencias entre sí, expresar esa dependencia es tan simple como hacer que un método de bean llame a otro, como muestra el siguiente ejemplo:


En el ejemplo anterior, beanA recibe una referencia a beanB a través de la inyección del constructor.

Este método de declarar dependencias entre beans funciona solo cuando el método @Bean se declara dentro de una clase @Configuration. No es posible declarar dependencias entre beans utilizando clases @Component.


Hasta aquí, tenemos información suficiente acerca de la inversión de control (IoC) en Spring Boot, para entender el uso común de los decoradores @Component, @Autowired, @Value, @Bean y @Configuration.


Copyright Giovynet.com 2018 - 2020