Вызов аннотированного метода @Bean в конфигурации Spring java



мне любопытно, как spring injection обрабатывает методы вызова с помощью @Bean Примечание. Если я поставлю @Bean аннотация на методе и возвращает экземпляр, я понимаю, что это говорит spring создать Боб, вызвав метод и получив возвращенный экземпляр. Однако иногда этот компонент должен использоваться для подключения других компонентов или настройки другого кода. Обычно это делается так, чтобы вызвать @Bean аннотированный метод для получения экземпляра. Мой вопрос в том, почему это не вызывает там должно быть несколько экземпляров Боба, плавающих вокруг?



например, см. код ниже (взятый из другого вопроса). Элемент entryPoint() метод с аннотацией @Bean, поэтому я бы предположил, что spring создаст новый экземпляр BasicAuthenticationEntryPoint как фасоль. Затем мы вызываем entryPoint() снова в блоке настройки, но похоже, что entryPoint() возвращает экземпляр bean и не вызывается несколько раз (я пробовал вести журнал и получил только одну запись журнала). Потенциально мы могли бы назвать entryPoint() несколько раз в других частях конфигурации, и мы всегда будем получать один и тот же экземпляр. Правильно ли я это понимаю? Делает ли весна какое-то волшебное переписывание методов, аннотированных с @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();
}
504   1  

1 ответ:

да, Весна делает некоторые магия. Проверьте Spring Docs:

все @Configuration классы разделяются на подклассы во время запуска с помощью CGLIB. В подклассе дочерний метод сначала проверяет контейнер для любых кэшированных (ограниченных) бобов, прежде чем вызвать родительский метод и создать новый экземпляр.

Это означает, что ваши призывы к @Bean методы проксируются через CGLIB и поэтому возвращается кэшированная версия компонента (новая не создается).

объем по умолчанию @Bean s - это SINGLETON, Если вы укажете другую область, например PROTOTYPE вызов будет передан исходному методу.

Comments

    Ничего не найдено.