La anotación @Configuration en Spring Boot se utiliza para definir clases que contienen configuraciones de beans y otras configuraciones relacionadas con la infraestructura de la aplicación. Es una forma de organizar y agrupar definiciones de beans que luego pueden ser gestionadas por el contenedor de Spring. Al usar @Configuration, se pueden registrar y configurar beans mediante métodos anotados con @Bean, simplificando la administración de dependencias y la modularidad del código.
@Configuration es una anotación de Spring que se aplica a clases para indicar que contienen definiciones de beans y configuraciones que Spring debe gestionar y cargar durante el tiempo de ejecución. Las clases con esta anotación funcionan como archivos de configuración equivalentes a los antiguos archivos applicationContext.xml, pero utilizando el enfoque de Java-based Configuration (configuración basada en Java).
Cuando se utiliza @Configuration, la clase se convierte en un contenedor de beans y configuraciones, y Spring automáticamente detecta estas configuraciones al escanear el contexto de la aplicación, registrando los beans definidos en ella.
@Bean.
@ComponentScan para detectar componentes adicionales.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public MiServicio miServicio() {
return new MiServicio();
}
}
En este ejemplo:
@Configuration indica que AppConfig es una clase que contiene definiciones de beans.
@Bean se utiliza en el método miServicio() para registrar un bean de la clase MiServicio en el contenedor de Spring.
miServicio se convierte en un bean disponible para ser inyectado en otras partes de la aplicación mediante @Autowired.
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class AppConfig {
@Bean
public ServicioA servicioA() {
return new ServicioA();
}
@Bean
public ServicioB servicioB() {
return new ServicioB(servicioA()); // Inyecta servicioA en servicioB
}
}
En este caso:
ServicioA y ServicioB.
servicioB() depende de servicioA(), lo que permite a Spring gestionar la creación y resolución de dependencias entre beans dentro de la clase AppConfig.
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan(basePackages = "com.ejemplo.servicios") // Escanea el paquete especificado para encontrar componentes
public class ConfiguracionServicios {
}
En este ejemplo:
@ComponentScan se usa junto con @Configuration para indicar a Spring que debe buscar y registrar automáticamente todos los componentes anotados con @Component, @Service, @Repository, etc., en el paquete com.ejemplo.servicios.
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class PropiedadesConfig {
@Value("${mi.propiedad.nombre}")
private String nombrePropiedad;
@Bean
public PropiedadServicio propiedadServicio() {
return new PropiedadServicio(nombrePropiedad);
}
}
Aquí:
@Value("${mi.propiedad.nombre}") se utiliza para inyectar un valor desde el archivo de configuración application.properties.
nombrePropiedad) se pasa al constructor del bean PropiedadServicio durante su creación.
Si necesitas modularizar aún más la configuración, puedes usar @Import para dividir la configuración en múltiples clases:
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Import;
@Configuration
@Import({AppConfig.class, PropiedadesConfig.class}) // Importa otras configuraciones
public class ConfiguracionGeneral {
}
En este caso:
ConfiguracionGeneral agrupa múltiples configuraciones (AppConfig y PropiedadesConfig) usando @Import.
@Configuration se debe utilizar cuando:
1. Necesitas crear y gestionar beans personalizados que no se pueden definir fácilmente con otras anotaciones como @Component.
2. Deseas agrupar configuraciones específicas en un solo lugar, como configuraciones de seguridad, acceso a datos o servicios.
3. Necesitas crear configuraciones modulares o compuestas en aplicaciones grandes.
4. Quieres personalizar la configuración de beans ya existentes en el contexto.
@Configuration.
@Component que se utiliza para clases de servicio, pero no para configuraciones.
Para más información sobre @Configuration, consulta la documentación oficial de Spring.
Jorge García
Fullstack developer