Je suis curieux de savoir comment l'injection de ressort gère les méthodes d'appel avec l' @Bean
annotation. Si je mets une @Bean
annotation 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 retournée. Cependant, parfois, ce bean doit être utilisé pour câbler d'autres beans ou configurer un autre code. La manière habituelle de procéder consiste à appeler la @Bean
méthode annotée pour obtenir une instance. Ma question est la suivante: pourquoi cela ne cause-t-il pas plusieurs instances du haricot flottant?
Par exemple, consultez le code ci-dessous (tiré d'une autre question). La entryPoint()
méthode est annotée avec @Bean
, donc j'imagine que Spring créera une nouvelle instance de en BasicAuthenticationEntryPoint
tant que bean. Ensuite, nous appelons à entryPoint()
nouveau dans le bloc de configuration, mais il semble que cela entryPoint()
renvoie l'instance du bean et ne soit pas appelée plusieurs fois (j'ai essayé de se connecter et je n'ai obtenu qu'une seule entrée de journal). Potentiellement, nous pourrions appeler entryPoint()
plusieurs fois dans d'autres parties de la configuration, et nous obtiendrions toujours la même instance. Est-ce que ma compréhension de cela est 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();
}
@Bean
et@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.
Dans ce cas, CGLIB crée une sous-classe de la classe @Configuration et remplace ses méthodes (y compris la méthode @Bean). Ainsi, lorsque nous appelons la méthode @Bean à partir d'une autre méthode, nous appelons en fait sa version surchargée (grâce à la liaison dynamique java).@Component
fonctionnera si j'utilise CHLIB pour créer des proxies au lieu de java Poxy?