La anotación @Configuration en Spring se utiliza para definir clases que contienen métodos productores de beans, marcados con @Bean. Uno de sus atributos más relevantes es proxyBeanMethods, que controla si los métodos de bean dentro de la clase de configuración deben ser interceptados mediante proxies.
Comportamiento predeterminado: proxyBeanMethods = true
Cuando proxyBeanMethods está activado (valor por defecto), Spring genera un proxy de la clase de configuración. Esto permite que cada invocación a un método @Bean desde otro método en la misma clase devuelva siempre la misma instancia del bean gestionada por el contenedor. Este mecanismo asegura la coherencia del ciclo de vida del bean y evita creaciones duplicadas.
@Configuration
public class AppConfig {
@Bean
public ServicioA servicioA() {
return new ServicioA();
}
@Bean
public ServicioB servicioB() {
ServicioA servicio = servicioA(); // Devuelve la instancia gestionada por Spring
return new ServicioB(servicio);
}
}
Este enfoque garantiza que servicioA() sea una llamada gestionada por el contenedor, retornando el singleton correcto incluso cuando se llama internamente.
Modo ligero: proxyBeanMethods = false
Al establecer proxyBeanMethods = false, se desactiva la creación de proxies. En este modo, las llamadas directas entre métodos de configuración no están bajo control del contenedor. Cada invocación produce una nueva instancia, ya que se trata simplemente de una llamada Java común.
@Configuration(proxyBeanMethods = false)
public class LightConfig {
@Bean
public ComponenteX componenteX() {
return new ComponenteX();
}
@Bean
public ComponenteY componenteY() {
ComponenteX cx = componenteX(); // Nueva instancia, no gestionada
return new ComponenteY(cx);
}
}
En este caso, aunque componenteX() esté anotado como @Bean, su llamada interna en componenteY() no pasa por el contexto de Spring, lo que puede resultar en múltiples instancias si no se maneja adecuadamente.
Cuándo usar cada opción
Se recomienda usar proxyBeanMethods = false cuando:
- Los métodos de configuración no se invocan entre sí.
- Se busca mejorar el rendimiento al evitar la sobrecarga de proxies.
- La clase actúa solo como fuente declarativa de beans independientes.
Por el contrario, si existe dependencia entre métodos @Bean dentro de la misma clase, debe mantenerse true para preservar el comportamiento esperado del contenedor.
Conclusión
El atributo proxyBeanMethods ofrece un equilibrio antre funcionalidad y rendimiento. Usarlo correctamente permite optimizar la inicialización del contexto de Spring sin sacrificar la integridad de las dependencias, especialmente útil en aplicaciones grandes donde el tiempo de arranque es crítico.