L'appel d'une @Bean méthode annotée au Printemps de configuration java
Je suis curieux de savoir comment le printemps injection gère l'appel de méthodes à la @Bean
annotation. Si j'ai mis un @Bean
annotation sur une méthode, et de retourner une instance, je comprends que qui dit printemps pour créer un bean par l'appel de la méthode et obtenir le retour de l'instance. Il arrive parfois que le bean doit être utilisé pour le fil d'autres graines ou de configuration à un autre code. De la manière habituelle, c'est fait, c'est d'appeler le @Bean
méthode annotée pour obtenir une instance. Ma question est, pourquoi n'est-il pas provoquer de multiples instances de la fève flottant autour?
Voir, par exemple, le code ci-dessous (suivis d'une autre question). Le entryPoint()
méthode est annoté avec @Bean
, donc j'imagine que le printemps va créer une nouvelle instance de BasicAuthenticationEntryPoint
comme un haricot. Ensuite, nous appelons entryPoint()
de nouveau dans la configuration de bloc, mais il semble que entryPoint()
renvoie l'exemple d'haricot, et n'est pas appelé à plusieurs reprises (j'ai essayé de journalisation, et n'ai qu'une entrée de journal). Potentiellement on pourrait appeler entryPoint()
plusieurs fois dans d'autres parties de la configuration, et on obtenait toujours la même instance. Est ma compréhension de ce correct? Ne ressort ne magiques réécriture des méthodes annotées avec @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();
}
Vous devez vous connecter pour publier un commentaire.
Oui, le Printemps n'certains magie. De vérifier la Printemps Docs:
Cela signifie que les appels à la
@Bean
méthodes sont mandatées par CGLIB et, par conséquent, la version en cache de la fève est retourné (un nouveau n'est pas créé).L'étendue par défaut de
@Bean
s estSINGLETON
, si vous spécifiez un autre champ d'application tels quePROTOTYPE
l'appel sera transmis à la méthode d'origine.Veuillez noter que ceci est pas valable pour les méthodes statiques. Comme par le printemps docs:
@Bean
et@Primary
).