Tengo curiosidad sobre cómo la inyección de resorte maneja los métodos de llamada con la @Bean
anotación. Si pongo una @Bean
anotación en un método y devuelvo una instancia, entiendo que eso le dice a Spring que cree un bean llamando al método y obteniendo la instancia devuelta. Sin embargo, a veces ese bean debe usarse para conectar otros beans o configurar otro código. La forma habitual de hacer esto es llamar al @Bean
método anotado para obtener una instancia. Mi pregunta es, ¿por qué esto no causa que haya múltiples instancias del bean flotando?
Por ejemplo, vea el código a continuación (tomado de otra pregunta). El entryPoint()
método está anotado con @Bean
, así que imagino que spring creará una nueva instancia de BasicAuthenticationEntryPoint
como un bean. Luego, volvemos a llamar entryPoint()
en el bloque de configuración, pero parece que entryPoint()
devuelve la instancia del bean y no se llama varias veces (intenté iniciar sesión y solo obtuve una entrada de registro). Potencialmente, podríamos llamar entryPoint()
varias veces en otras partes de la configuración y siempre obtendríamos la misma instancia. ¿Es correcto mi entendimiento de esto? ¿Spring hace una reescritura mágica de los métodos anotados @Bean
?
@Bean
public BasicAuthenticationEntryPoint entryPoint() {
BasicAuthenticationEntryPoint basicAuthEntryPoint = new BasicAuthenticationEntryPoint();
basicAuthEntryPoint.setRealmName("My Realm");
return basicAuthEntryPoint;
}
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.exceptionHandling()
.authenticationEntryPoint(entryPoint())
.and()
.authorizeUrls()
.anyRequest().authenticated()
.and()
.httpBasic();
}
@Bean
y@Primary
).CGLib allows us to create proxy classes at runtime by creating sub class of specified class using Byte code generation. CGLib proxies are used in the case where Proxy is to be created for those class which does not have any interfaces or have methods which are not declared in the implementing interface.
En este caso, CGLIB crea una subclase de la clase @Configuration y anula sus métodos (incluido el método @Bean). Por lo tanto, cuando llamamos al método @Bean desde otro método, en realidad llamamos a su versión anulada (gracias al enlace dinámico de Java).@Component
funcionará si uso CHLIB para crear proxies en lugar de java Poxy?