Jestem ciekawy, jak wtrysk sprężyny obsługuje wywoływanie metod z @Bean
adnotacją. Jeśli umieszczę @Bean
adnotację w metodzie i zwrócę instancję, rozumiem, że to mówi spring o utworzeniu fasoli przez wywołanie metody i pobranie zwróconej instancji. Jednak czasami ta fasola musi być używana do łączenia innych ziaren lub ustawiania innego kodu. Zwykłym sposobem jest to wywołanie @Bean
metody z adnotacjami w celu pobrania instancji. Moje pytanie brzmi: dlaczego nie powoduje to unoszenia się wielu egzemplarzy fasoli?
Na przykład zobacz poniższy kod (zaczerpnięty z innego pytania). entryPoint()
Metoda jest opatrzone @Bean
, tak to sobie wyobrazić, wiosna będzie utworzyć nową instancję BasicAuthenticationEntryPoint
jako fasoli. Następnie entryPoint()
ponownie wywołujemy w bloku konfiguracji, ale wygląda na to, że entryPoint()
zwraca instancję bean i nie jest wywoływana wiele razy (próbowałem rejestrować i otrzymałem tylko jeden wpis w dzienniku). Potencjalnie moglibyśmy wywołać entryPoint()
wiele razy w innych częściach konfiguracji i zawsze otrzymalibyśmy tę samą instancję. Czy moje rozumienie tego jest prawidłowe? Czy wiosna w jakiś magiczny sposób przepisuje metody z adnotacjami @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
i@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.
W tym przypadku CGLIB tworzy podklasę klasy @Configuration i przesłania jej metody (w tym metodę @Bean). Tak więc, gdy wywołujemy metodę @Bean z innej metody, w rzeczywistości wywołujemy jej nadpisaną wersję (dzięki dynamicznemu wiązaniu java).@Component
będzie działał, jeśli używam CHLIB do tworzenia serwerów proxy zamiast java Poxy?