繁体   English   中英

spring注解@ConditionalOnMissingBean有什么作用?

[英]What does the spring annotation @ConditionalOnMissingBean do?

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

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

代码:

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

@ConditionalOnMissingBean注释仅用于在给定 bean 缺失时加载 bean:

@Bean
@ConditionalOnMissingBean(SomeBean.class)
public SomeBean otherBean(){
    return new SomeBean();
}

仅当上下文中不存在此类型的其他 bean 时,Spring 才会加载上述 bean。 另一方面,如果应用程序上下文中已经存在SomeBean类型的 bean,则不会创建上述 bean。

此注释派上用场的一些用例是:

  • 指定一个回退 bean,如果不存在相同类型的 bean,则该 bean 仅作为备份加载(例如:如果没有配置真正的数据库,则使用内存数据库)
  • 指定一个默认 bean,允许在上下文中存在相同类型的更具体 bean 的情况下被覆盖(例如:使用默认身份验证机制,除非有人决定用他自己的自定义身份验证替换它)

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

@ConditionalOnMissingBean注解是一个 spring 条件注解,仅当 bean 不在应用程序上下文中时才注册它们。

请参阅文档: https : //docs.spring.io/spring-boot/docs/2.0.0.RELEASE/api/org/springframework/boot/autoconfigure/condition/ConditionalOnMissingBean.html

如果我们只想在指定的 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则将提供此默认服务。

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

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

后面接着说:

如果候选 bean 可能由另一个自动配置创建,请确保使用此条件的那个在之后运行

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM