Я пытаюсь запустить приложение springboot, в котором использовалась эта аннотация. Когда я пытаюсь запустить приложение, появляется следующая ошибка:
org.springframework.boot.autoconfigure.condition.OnBeanCondition$BeanTypeDeductionException Failed to deduce bean type for com.shutterfly.sbs.platform.SbsPlatformConfigurationClientConfig.getRestTemplate
Код:
@ConditionalOnMissingBean
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
Спасибо @pvpkiran




Аннотация @ConditionalOnMissingBean - это условная аннотация Spring для регистрации bean-компонентов, только если они еще не находятся в контексте приложения.
См. Документацию: https://docs.spring.io/spring-boot/docs/2.0.0.RELEASE/api/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBean.html
Мы используем @ConditionalOnMissingBean, если хотим включить компонент, только если указанный компонент отсутствует. Например,
Давайте настроим bean-компонент transactionManager, который будет загружаться только в том случае, если bean-компонент типа JpaTransactionManager еще не определен:
@Bean
@ConditionalOnMissingBean(type = "JpaTransactionManager")
JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
JpaTransactionManager transactionManager = new JpaTransactionManager();
transactionManager.setEntityManagerFactory(entityManagerFactory);
return transactionManager;
}
Чтобы понять больше, рассмотрите также этот сценарий.
Допустим, в моем проекте я настроил bean-компонент videoDecoderService
@Bean
@ConditionalOnMissingBean(VideoDecoderService.class)
public videoDecoderService videoDecoderService(){
return new VideoDecoderService;
}
Что он будет делать, так это то, что тот, кто использует мой проект, сможет заменить videoDecoderService собственным videoDecoderService. Если они не пишут свой собственный videoDecoderService, то будет предоставлен этот @ConditionalOnMissingBean по умолчанию.
Аннотация @ConditionalOnMissingBean используется для загрузки bean-компонента, только если данный bean-компонент отсутствует:
@Bean
@ConditionalOnMissingBean(SomeBean.class)
public SomeBean otherBean(){
return new SomeBean();
}
Вышеупомянутый bean-компонент будет загружен Spring только в том случае, если в контексте нет другого bean-компонента этого типа. С другой стороны, если в контексте приложения уже присутствует компонент типа SomeBean, указанный выше компонент не будет создан.
Некоторые варианты использования, в которых может пригодиться эта аннотация:
будьте осторожны с порядком, в котором добавляются определения bean-компонентов, так как эти условия оцениваются на основе того, что было обработано до сих пор (из Spring doc)
Вы не должны пропускать ту часть документации, в которой четко сказано:
The condition can only match the bean definitions that have been processed by the application context so far and, as such, it is strongly recommended to use this condition on auto-configuration classes only.
Позже будет сказано:
If a candidate bean may be created by another auto-configuration, make sure that the one using this condition runs after
Проще говоря, это может означать, что @Bean, вызванный некоторой автоконфигурацией Другие, должен иметь приоритет над тем, который вы определили. Чтобы это работало, вам необходимо правильно настроить порядок этих конфигураций через @AutoConfigureBefore.
Он инициализирует bean-компонент только в том случае, если он не может найти bean-компонент RestTemplate в своем контексте. Если у него уже есть bean-компонент RestTemplate, он пропустит это.