Inversión de Control (IoC) en Spring Boot

Spring es una implementación del patrón de Inversión de Control, un patrón de diseño increíblemente popular hoy en día cuyo significado es que las aplicaciones pueden describirse como una colección de componentes, algunos con la lógica de negocio, y otros son objetos persistentes como pueden ser recursos y su estado que tienen que ser inicializados y mantenidos.

La Inversión de Control responde a la pregunta "¿Cómo conecto los componentes de mi aplicación?" Que resuelve preguntas del estilo ¿Necesita la base de datos ser inicializada después del sistema de cache? ¿Dónde debería arrancar un Thread Pool? ¿Y el requestListener? ¿Como vamos a reescribir nuestro código conectando todo si algo cambia? La Inversión de Control es un patrón de diseño en el que:
  • Le indicamos al framework que componentes deben existir y como crearlos.
  • Que componentes necesitan otros componentes
La forma en la que este patrón se materializa en Spring es a través de la Inyección de Dependencia. Lo que significa que cada vez que diseñamos un componente también definimos sus dependencias. Esas dependencias pueden ser de cualquier tipo, desde cadenas o números hasta drivers de base de datos.

Como comentaba al principio, existen básicamente dos tipos clases java que se implementan en una aplicación Spring:
  • Data Types: clases sencillas cuya finalidad es simplemente almacenar información. Como puede ser UserProfile. Nunca contiene lógica de negocio.
  • Components: son servicios persistentes que pedimos a Spring que maneje. Por ejemplo, una clase UserService, que implemente un método que al pasarle el nombre de un usuario nos devuelva su perfil (UserProfile). Son pura lógica de negocio. Estos componentes son los que Spring se encarga de inicializar y hacerlos disponibles a lo largo de toda la aplicación.
Como regla general siempre que se implemente lógica de negocio, se implementará una clase de tipo Componente. Lo que significa que registraremos esa clase para que se inicialice automáticamente y esté a disposición de toda la aplicación. O sea que si te ves escribiendo un new UserService(), no vas por buen camino.

Configuración de IoC

Cuando Spring se ejecuta, escanea el código de la aplicación en busca de ficheros de configuración y de Anotaciones de Componentes. Que usará para encontrar e inicializar nuestro componentes, y almacena estas instancias en lo que se denomina el Contexto de Aplicación. Que no es más que una colección o un conjunto que usa Spring para almacenar, recuperar y manejar los componentes de la aplicación.

Las instancias de componentes se llaman Beans en Spring, y pueden ser buscadas dentro del Contexto de Aplicación.

Aunque se pueda utilizar la configuración base en XML, la forma más extendida y típica de configurar nuestros componentes es a través de las Anotaciones

Anotaciones

Toda aplicación en Spring dispone de una clase inicial por defecto contiene un método main que inicializa el Contexto de Aplicación, escaneará y auto configurará nuestros componentes. Este método dispone de la siguiente anotación:

@SpringBootApplication: es la que incluye por defecto el método main que comentaba. Y es equivalente a utilizar tres anotaciones independientes:
  1. @Configuration: le indica a Spring que la clase contiene definición de componentes, que deberán incluir la anotación @Bean. Estos métodos pueden contener parámetros que evidentemente tendrán que ser dependencias de otros métodos ya creados en esta clase.
  2. @EnableAutoConfiguration: le pide a Spring que intente mapear dependencias de componentes automáticamente. Que Spring se basará fundamentalmente en el tipo para resolver estos mapeos.
  3. @ComponentScan: le pide a Spring la búsqueda de componentes, pero dentro de todo el código fuente de la aplicación. Recuerda, siempre dentro del mismo paquete que incluye @SpringBootApplication, o sus sub-paquetes. @Service, @Controller y @Repository son todos tipos de @Component.
Las tres anotaciones más comunes en nuestras aplicaciones, todas ellas especificaciones de @Component son:

Para controladores: @Controller @RequestMapping("/food") public class FoodController { ... } Para servicios:@Service public class FoodService { ... } Y para repositorios de datos: @Repository public class FoodRepository { ... }

Comentarios

Entradas populares de este blog

Envío de checkboxes o selector multiple por AJAX con jQuery

Patrones de Diseño Creacionales

Conceptos básicos de la POO