Appel d'une méthode annotée @Bean dans la configuration java Spring


Je suis curieux de savoir comment spring injection gère les méthodes d'appel avec l'annotation @Bean. Si je mets une annotation @Bean sur une méthode et renvoie une instance, je comprends que cela indique à spring de créer un bean en appelant la méthode et en obtenant l'instance renvoyée. Cependant, parfois ce bean doit être utilisé pour câbler d'autres beans ou configurer un autre code. La façon habituelle de le faire est d'appeler la méthode annotée @Bean pour obtenir une instance. Ma question est, pourquoi n'est-il pas provoquer plusieurs instances du haricot flottant?

Par exemple, voir le code ci-dessous (tiré d'une autre question). La méthode entryPoint() est annotée avec @Bean, donc j'imagine que spring va créer une nouvelle instance de BasicAuthenticationEntryPoint en tant que bean. Ensuite, nous appelons à nouveau entryPoint() dans le bloc configure, mais il semble que entryPoint() renvoie l'instance de bean et n'est pas appelé plusieurs fois (j'ai essayé de me connecter et j'ai seulement obtenu une entrée de journal). Potentiellement, nous pourrions appeler entryPoint() plusieurs fois dans d'autres parties du configuration, et nous obtiendrions toujours la même instance. Ma compréhension de cela est-elle correcte? Spring fait-il une réécriture magique 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();       
}
Author: wassgren, 2015-01-16

1 answers

Oui, le printemps fait de la magie . De vérifier la Printemps Docs:

Toutes les classes @Configurationsont sous-classées au démarrage avec CGLIB. Dans la sous-classe, la méthode enfant vérifie d'abord le conteneur pour tout beans mis en cache (portée) avant d'appeler la méthode parent et de créer une nouvelle instance.

Cela signifie que vos appels aux méthodes @Bean sont mandatés via CGLIB et donc la version mise en cache du bean est renvoyée (une nouvelle est pas créé).

La portée par défaut de @Bean s est SINGLETON, si vous spécifiez une portée différente telle que PROTOTYPE l'appel sera passé à la méthode d'origine.

 77
Author: wassgren, 2015-01-16 18:55:09