Spring @ConditionalOnMissingBean 注解的主要作用解析

 更新时间:2026年01月24日 09:19:00   作者:牧小七  
@ConditionalOnMissingBean是Spring Boot中用于条件化配置的注解,确保只有在指定Bean不存在时才创建,它在自动配置中广泛应用,提供默认配置并允许用户自定义Bean,本文给大家介绍Spring @ConditionalOnMissingBean注解的作用,感兴趣的朋友一起看看吧

@ConditionalOnMissingBean 是 Spring Boot 自动配置中一个非常常用的条件化注解,它的核心作用是:只有当指定的 Bean 在 Spring 容器中不存在时,才创建被标注的 Bean 或配置类。

主要作用

1.提供默认配置

Spring Boot 的自动配置大量使用该注解,为常见组件提供默认实现。

@Configuration
public class MyAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean  // 只有在用户没有定义自己的 DataSource 时,才创建这个默认的
    public DataSource dataSource() {
        return new HikariDataSource();
    }
}

2.允许用户自定义 Bean 覆盖默认配置

用户可以定义自己的 Bean 来覆盖 Spring Boot 的默认实现。

@Configuration
public class MyCustomConfig {
    @Bean
    public DataSource dataSource() {
        // 用户自定义的 DataSource
        return new MyCustomDataSource();
        // 由于这个 Bean 存在,上面的自动配置的 DataSource 就不会被创建
    }
}

常见用法

1.指定 Bean 类型

@Bean
@ConditionalOnMissingBean
public MyService myService() {
    return new DefaultMyService();
}

2.指定具体的 Bean 名称

@Bean
@ConditionalOnMissingBean(name = "customBean")
public MyService myService() {
    return new DefaultMyService();
}

3.指定多个 Bean 类型

@Bean
@ConditionalOnMissingBean({DataSource.class, XADataSource.class})
public DataSource dataSource() {
    return new EmbeddedDataSource();
}

实际应用场景

场景1:数据库配置

@Configuration
@ConditionalOnClass(DataSource.class)
public class DataSourceAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    @ConditionalOnProperty(prefix = "spring.datasource", name = "type")
    public DataSource dataSource(DataSourceProperties properties) {
        // 创建默认数据源
    }
}

场景2:缓存配置

@Configuration
@ConditionalOnClass(CacheManager.class)
public class CacheAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean
    public CacheManager cacheManager() {
        // 提供默认的缓存管理器
    }
}

与其他条件注解配合使用

@Configuration
@ConditionalOnClass(MyService.class)  // 类路径存在时才生效
@ConditionalOnProperty(prefix = "app", name = "enabled", havingValue = "true")  // 属性条件
public class MyAutoConfiguration {
    @Bean
    @ConditionalOnMissingBean  // 用户没有自定义时才生效
    public MyService myService() {
        return new DefaultMyService();
    }
}

注意事项

  1. 加载顺序问题:Bean 的创建顺序会影响 @ConditionalOnMissingBean 的判断结果
  2. 多个配置类:如果有多个配置类都定义了相同的 Bean,Spring 需要确定哪个配置类先加载
  3. 配合 @Primary 使用:当有多个同类型 Bean 时,可以指定哪个是主要的
@Bean
@ConditionalOnMissingBean
@Primary  // 当有多个 DataSource 时,这个作为主要的
public DataSource primaryDataSource() {
    return new PrimaryDataSource();
}

总结

@ConditionalOnMissingBean 是 Spring Boot “约定优于配置” 理念的重要实现:

  • ✅ 提供开箱即用的默认配置
  • ✅ 允许用户轻松自定义和覆盖
  • ✅ 避免 Bean 定义的冲突
  • ✅ 是 Spring Boot 自动配置灵活性的关键

这种机制使得 Spring Boot 既能提供强大的默认配置,又保持了高度的可定制性。

到此这篇关于Spring @ConditionalOnMissingBean 注解是做什么的的文章就介绍到这了,更多相关Spring @ConditionalOnMissingBean 注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • java compiler没有1.8怎么解决

    java compiler没有1.8怎么解决

    这篇文章主要介绍了java compiler没有1.8的解决方法,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-08-08
  • Java字符串去除特殊字符内容的实例

    Java字符串去除特殊字符内容的实例

    下面小编就为大家分享一篇Java字符串去除特殊字符内容的实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • mybatis中mapper代理的生成过程全面分析

    mybatis中mapper代理的生成过程全面分析

    这篇文章主要为大家介绍了mybatis中mapper代理的生成过程全面分析,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-09-09
  • Java跨域问题的几种后端解决方式举例详解

    Java跨域问题的几种后端解决方式举例详解

    跨域,是指浏览器不能执行其他网站的脚本,它是由浏览器的同源策略造成的,是浏览器对JavaScript实施的安全限制,这篇文章主要给大家介绍了关于Java跨域问题的几种后端解决方式的相关资料,需要的朋友可以参考下
    2023-11-11
  • java序列化和serialVersionUID的使用方法实例

    java序列化和serialVersionUID的使用方法实例

    这篇文章主要介绍了java序列化和serialVersionUID的使用方法实例的相关资料,这里说明很详细的使用方法让你彻底学会,需要的朋友可以参考下
    2017-08-08
  • 一篇文章让你学会Java的输入与输出

    一篇文章让你学会Java的输入与输出

    这篇文章主要介绍了Java输入与输出的相关资料,包括使用System.out.println()、System.out.printf()和System.out.print()进行输出,以及使用Scanner类和System.in.read()方法进行输入,需要的朋友可以参考下
    2025-03-03
  • SpringBoot整合缓存方式(Caffeine、Redis)

    SpringBoot整合缓存方式(Caffeine、Redis)

    SpringBoot整合缓存注解包括@EnableCaching、@Cachable、@CachePut和@CacheEvict,分别用于配置缓存管理器和标记缓存操作,文章详细介绍了整合Caffeine和Redis缓存的步骤,并展示了配置类与控制层代码,优点是快速应用缓存,缺点是无法精细处理缓存
    2026-05-05
  • java实现随机数生成器

    java实现随机数生成器

    这篇文章主要为大家详细介绍了java实现随机数生成器,随机数生成小程序,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Java常用集合与原理解析

    Java常用集合与原理解析

    这篇文章主要介绍了Java常用集合与原理解析,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • k8s部署的java服务添加idea调试参数的方法

    k8s部署的java服务添加idea调试参数的方法

    文章介绍了如何在K8S容器中的Java服务上进行远程调试,包括配置Deployment、Service以及本地IDEA的调试设置,感兴趣的朋友跟随小编一起看看吧
    2025-02-02

最新评论