Мне любопытно, как Spring Injection обрабатывает методы вызова с @Bean
аннотацией. Если я помещаю @Bean
аннотацию к методу и возвращаю экземпляр, я понимаю, что это говорит Spring создать bean-компонент путем вызова метода и получения возвращенного экземпляра. Однако иногда этот компонент необходимо использовать для подключения других компонентов или для настройки другого кода. Обычно это делается путем вызова @Bean
аннотированного метода для получения экземпляра. У меня вопрос: почему это не приводит к тому, что вокруг плавает несколько экземпляров bean-компонента?
Например, посмотрите код ниже (взятый из другого вопроса). Этот entryPoint()
метод аннотирован @Bean
, поэтому я предполагаю, что Spring создаст новый экземпляр BasicAuthenticationEntryPoint
как bean-компонент. Затем мы entryPoint()
снова вызываем блок настройки, но похоже, что он entryPoint()
возвращает экземпляр компонента и не вызывается несколько раз (я пробовал вести журнал и получил только одну запись в журнале). Потенциально мы можем вызывать entryPoint()
несколько раз в других частях конфигурации, и мы всегда будем получать один и тот же экземпляр. Я правильно понимаю это? Произойдет ли в Spring какое-то волшебное переписывание аннотированных методов @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
и@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.
В этом случае CGLIB создает подкласс класса @Configuration и переопределяет его методы (включая метод @Bean). Таким образом, когда мы вызываем метод @Bean из другого метода, мы фактически вызываем его замененную версию (благодаря динамической привязке java).@Component
работать, если я использую CHLIB для создания прокси вместо java Poxy?