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