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