Ich bin gespannt, wie die Federeinspritzung mit der @Bean
Annotation aufruft . Wenn ich @Bean
einer Methode eine Annotation hinzufüge und eine Instanz zurückgebe, muss Spring eine Bean erstellen, indem die Methode aufgerufen und die zurückgegebene Instanz abgerufen wird. Manchmal muss diese Bean jedoch verwendet werden, um andere Beans zu verkabeln oder anderen Code einzurichten. Die übliche Vorgehensweise besteht darin, die mit @Bean
Anmerkungen versehene Methode aufzurufen , um eine Instanz abzurufen. Meine Frage ist, warum dies nicht dazu führt, dass mehrere Instanzen der Bean herumschweben.
Siehe zum Beispiel den folgenden Code (entnommen aus einer anderen Frage). Die entryPoint()
Methode ist mit Anmerkungen versehen @Bean
, daher würde ich mir vorstellen, dass der Frühling eine neue Instanz BasicAuthenticationEntryPoint
als Bohne erstellen wird . Dann rufen wir entryPoint()
den Konfigurationsblock erneut auf, aber es scheint, als würde entryPoint()
die Bean-Instanz zurückgegeben und nicht mehrmals aufgerufen (ich habe versucht, mich zu protokollieren, und habe nur einen Protokolleintrag erhalten). Möglicherweise könnten wir entryPoint()
in anderen Teilen der Konfiguration mehrmals aufrufen , und wir würden immer dieselbe Instanz erhalten. Ist mein Verständnis davon richtig? Führt der Frühling eine magische Umschreibung der mit Anmerkungen versehenen Methoden durch @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
und kommentiere@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.
In diesem Fall erstellt CGLIB eine Unterklasse der @ Configuration-Klasse und überschreibt deren Methoden (einschließlich der @ Bean-Methode). Wenn wir also die @ Bean-Methode von einer anderen Methode aus aufrufen, rufen wir tatsächlich ihre überschriebene Version auf (dank der dynamischen Java-Bindung).@Component
, wenn ich CHLIB verwende, um Proxys anstelle von Java Poxy zu erstellen?