我正在尝试启动一个使用此注释的springboot应用程序。当我尝试启动应用程序时,它给出了以下错误:
org.springframework.boot.autoconfigure.condition.OnBeanCondition $ BeanTypeDeductionException无法推断出com.shutterfly.sbs.platform.SbsPlatformConfigurationClientConfig.getRestTemplate的bean类型
代码:
@ConditionalOnMissingBean
@Bean
public RestTemplate getRestTemplate() {
return new RestTemplate();
}
答案 0 :(得分:3)
@ConditionalOnMissingBean
注释是一个弹簧条件注释,用于仅在bean不在应用程序上下文中时才注册它们。
查看文档:{{3}}
答案 1 :(得分:0)
如果仅当不存在指定的bean时才想包含bean,则使用@ConditionalOnMissingBean
。例如。
让我们配置一个transactionManager
bean,仅在尚未定义类型JpaTransactionManager
的bean时才加载它:
@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
,那么将提供此默认值。
答案 2 :(得分:0)
@ConditionalOnMissingBean批注仅在缺少给定bean时才用于加载bean:
@Bean
@ConditionalOnMissingBean(SomeBean.class)
public SomeBean otherBean(){
return new SomeBean();
}
仅当上下文中不存在其他这种类型的bean时,Spring才会加载上述bean。另一方面,如果在应用程序上下文中已经存在SomeBean类型的bean,则不会创建上述bean。
使用此注释很方便的一些用例是:
答案 3 :(得分:0)
您不应跳过文档中明确指出的部分:
该条件只能匹配到目前为止应用程序上下文已处理的bean定义,因此,强烈建议仅在自动配置类上使用此条件。
稍后再说:
如果可以通过另一种自动配置创建候选bean,请确保使用此条件的候选bean在之后自动运行
用简单的话来说,这可能意味着由某些 other 自动配置引入的@Bean
应该优先于您定义的那个。为此,您需要通过@AutoConfigureBefore
正确设置这些配置的顺序。