spring注释@ConditionalOnMissingBean有什么作用?

时间:2018-06-11 11:36:19

标签: spring spring-boot

我正在尝试启动一个使用此注释的springboot应用程序。当我尝试启动应用程序时,它给出了以下错误:

  

org.springframework.boot.autoconfigure.condition.OnBeanCondition $ BeanTypeDeductionException无法推断出com.shutterfly.sbs.platform.SbsPlatformConfigurationClientConfig.getRestTemplate的bean类型

代码:

@ConditionalOnMissingBean
@Bean
public RestTemplate getRestTemplate() {
    return new RestTemplate();
}

4 个答案:

答案 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。

使用此注释很方便的一些用例是:

  • 指定一个后备bean,如果不存在相同类型的bean(例如:如果未配置实际数据库,则使用内存数据库)仅作为备份被加载
  • 指定默认Bean,以便在上下文中存在相同类型的更特定的Bean时被覆盖(例如:使用默认的身份验证机制,除非有人决定将其替换为自己的自定义身份验证)< / li>

参考:https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-developing-auto-configuration.html

答案 3 :(得分:0)

您不应跳过文档中明确指出的部分:

该条件只能匹配到目前为止应用程序上下文已处理的bean定义,因此,强烈建议仅在自动配置类上使用此条件。

稍后再说:

如果可以通过另一种自动配置创建候选bean,请确保使用此条件的候选bean在之后自动运行

用简单的话来说,这可能意味着由某些 other 自动配置引入的@Bean应该优先于您定义的那个。为此,您需要通过@AutoConfigureBefore正确设置这些配置的顺序。