spring注释@ConditionalOnMissingBean有什么作用?

Rav*_*dje 8 java 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();
}
Run Code Online (Sandbox Code Playgroud)

Mar*_*sic 28

@ConditionalOnMissingBean注释用于加载只有在定bean缺少一个bean:

@Bean
@ConditionalOnMissingBean(SomeBean.class)
public SomeBean otherBean(){
    return new SomeBean();
}
Run Code Online (Sandbox Code Playgroud)

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

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

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

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


chi*_*oni 11

仅当指定的 bean 不存在时,我们@ConditionalOnMissingBean才需要包含某个 bean。对于前。

让我们配置一个仅在尚未定义transactionManager类型的 bean 时才加载的 bean :JpaTransactionManager

@Bean
@ConditionalOnMissingBean(type = "JpaTransactionManager")
JpaTransactionManager transactionManager(EntityManagerFactory entityManagerFactory) {
    JpaTransactionManager transactionManager = new JpaTransactionManager();
    transactionManager.setEntityManagerFactory(entityManagerFactory);
    return transactionManager;
}
Run Code Online (Sandbox Code Playgroud)

要了解更多信息,请考虑这种情况

假设在我的项目中我配置了一个 beanvideoDecoderService

@Bean
@ConditionalOnMissingBean(VideoDecoderService.class)
public videoDecoderService videoDecoderService(){
return new VideoDecoderService;
}
Run Code Online (Sandbox Code Playgroud)

它将做的是,无论谁使用我的项目都可以用他们自己的项目videoDecoderService覆盖。videoDecoderService如果他们不是自己编写的,videoDecoderService那么将提供这个默认的。


Mik*_*der 9

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

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


Eug*_*ene 9

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

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

后面接着说:

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

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