Sono curioso di sapere come Spring injection gestisce i metodi di chiamata con l' @Bean
annotazione. Se metto @Bean
un'annotazione su un metodo e restituisco un'istanza, capisco che ciò dice a spring di creare un bean chiamando il metodo e ottenendo l'istanza restituita. Tuttavia, a volte quel bean deve essere utilizzato per collegare altri bean o impostare altro codice. Il modo usuale per farlo è chiamare il @Bean
metodo annotato per ottenere un'istanza. La mia domanda è: perché questo non causa la presenza di più istanze del fagiolo in giro?
Ad esempio, vedere il codice seguente (tratto da un'altra domanda). Il entryPoint()
metodo è annotato con @Bean
, quindi immagino che spring creerà una nuova istanza di BasicAuthenticationEntryPoint
as a bean. Quindi, chiamiamo di entryPoint()
nuovo nel blocco configure, ma sembra che entryPoint()
restituisca l'istanza del bean e non venga chiamato più volte (ho provato a eseguire il log e ho ottenuto solo una voce di log). Potenzialmente potremmo chiamare entryPoint()
più volte in altre parti della configurazione e avremmo sempre la stessa istanza. La mia comprensione di questo è corretta? La primavera fa qualche magica riscrittura di metodi annotati con @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
e@Primary
).