Мне любопытно, как 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
).