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:
Como comentaba al principio, existen básicamente dos tipos clases java que se implementan en una aplicación Spring:
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
@SpringBootApplication: es la que incluye por defecto el método main que comentaba. Y es equivalente a utilizar tres anotaciones independientes:
Para controladores:
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
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.
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:
- @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.
- @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.
- @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.
Para controladores:
@Controller
@RequestMapping("/food")
public class FoodController { ... }
Para servicios:@Service
public class FoodService { ... }
Y para repositorios de datos:
@Repository
public class FoodRepository { ... }
Comentarios
Publicar un comentario