Basic Concepts Bean And Configuration
Conceptos básicos: @Bean y @Configuration
Los elementos centrales del soporte de Spring para la configuración Java son las clases anotadas con @Configuration y los métodos anotados con @Bean.
La anotación @Bean indica que un método crea una instancia, la configura y la inicializa como un objeto que será gestionado por el contenedor IoC de Spring. Para quienes conozcan la configuración XML de Spring mediante <beans/>, la anotación @Bean cumple la misma función que el elemento <bean/>.
Puedes usar métodos anotados con @Bean con cualquier @Component de Spring. Sin embargo, lo más habitual es utilizarlos con beans @Configuration.
Anotar una clase con @Configuration indica que su propósito principal es servir como fuente de definiciones de beans. Además, las clases @Configuration permiten definir dependencias entre beans mediante llamadas a otros métodos @Bean de la misma clase.
La clase @Configuration más sencilla posible es la siguiente:
@Configuration
public class AppConfig {
@Bean
public MyServiceImpl myService() {
return new MyServiceImpl();
}
}
La clase AppConfig anterior equivale a la siguiente configuración XML de Spring:
<beans>
<bean id="myService" class="com.acme.services.MyServiceImpl"/>
</beans>
¿Clases @Configuration con o sin llamadas locales entre métodos @Bean?
En los escenarios habituales, los métodos @Bean deben declararse dentro de clases @Configuration. De este modo, se aplica el procesamiento completo de las clases de configuración y las referencias entre métodos se redirigen a la gestión del ciclo de vida del contenedor.
Esto evita que el mismo método @Bean se invoque accidentalmente mediante una llamada Java normal y ayuda a reducir errores sutiles que pueden ser difíciles de detectar.
Cuando los métodos @Bean se declaran dentro de clases que no están anotadas con @Configuration, o cuando se declara @Configuration(proxyBeanMethods = false), se procesan en modo “lite”.
En estos escenarios, los métodos @Bean actúan como un mecanismo general de métodos de fábrica sin procesamiento especial en tiempo de ejecución; es decir, no se genera una subclase CGLIB para ellos.
Una llamada Java personalizada a uno de esos métodos no es interceptada por el contenedor. Por tanto, se comporta como una llamada normal a un método y crea una instancia nueva cada vez, en lugar de reutilizar una instancia singleton —o con ámbito— existente del bean correspondiente.
Como consecuencia, los métodos @Bean de clases sin proxy en tiempo de ejecución no deben declarar dependencias entre beans. En su lugar, deben operar sobre los campos del componente que los contiene y, opcionalmente, sobre los argumentos que el método de fábrica declare para recibir colaboradores autoconectados.
Por tanto, un método @Bean de este tipo nunca necesita invocar otros métodos @Bean: cada llamada de ese tipo puede expresarse mediante un argumento del método de fábrica.
El efecto positivo es que no se necesita aplicar la creación de subclases CGLIB en tiempo de ejecución, lo que reduce la sobrecarga y la huella de memoria.
Las anotaciones @Bean y @Configuration se explican en detalle en las secciones siguientes. Antes, se describen las diferentes formas de crear un contenedor de Spring mediante configuración basada en Java.