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
).