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 注解内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • spring mvc中直接注入的HttpServletRequst安全吗

    spring mvc中直接注入的HttpServletRequst安全吗

    这篇文章主要给大家介绍了关于spring mvc中直接注入的HttpServletRequst是不是安全的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面来一起看看吧。
    2018-04-04
  • Spring项目接入DeepSeek的两种超简单的方式分享

    Spring项目接入DeepSeek的两种超简单的方式分享

    DeepSeek 作为一款卓越的国产 AI 模型,越来越多的公司考虑在自己的应用中集成,本文为大家 分享了Spring项目接入DeepSeek的两种超简单的方式,希望对大家有所帮助
    2025-02-02
  • 基于springboot+vue实现垃圾分类管理系统

    基于springboot+vue实现垃圾分类管理系统

    这篇文章主要为大家详细介绍了基于springboot+vue实现垃圾分类管理系统,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • Java表单重复提交的避免方法

    Java表单重复提交的避免方法

    如何避免表单重复提交,这篇文章就为大家详细介绍了Java表单重复提交的避免方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2016-12-12
  • 基于mybatis查询结果映射不到对象的处理

    基于mybatis查询结果映射不到对象的处理

    这篇文章主要介绍了mybatis查询结果映射不到对象的处理方案,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-08-08
  • Java语言中Swing组件编程详解

    Java语言中Swing组件编程详解

    这篇文章主要为大家介绍了Java语言中Swing组件编程详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-10-10
  • Java使用自定义注解实现函数测试功能示例

    Java使用自定义注解实现函数测试功能示例

    这篇文章主要介绍了Java使用自定义注解实现函数测试功能,结合实例形式分析了java自定义注解在函数测试过程中相关功能、原理与使用技巧,需要的朋友可以参考下
    2019-10-10
  • MyBatis中association的基本使用方法

    MyBatis中association的基本使用方法

    在项目中某些实体类之间肯定有关键关系,比如一对一,一对多等,在hibernate中用one to one和one to many,而mybatis中就用association和collection,下面这篇文章主要给大家介绍了关于MyBatis中association基本使用方法的相关资料,需要的朋友可以参考下
    2022-09-09
  • 使用Spring注入Hibernate验证框架

    使用Spring注入Hibernate验证框架

    这篇文章主要介绍了使用Spring注入Hibernate验证框架方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-12-12
  • SpringBoot 整合MyBatis+MyBatis-Plus+MyBatisX插件使用

    SpringBoot 整合MyBatis+MyBatis-Plus+MyBatisX插件使用

    本文主要介绍了SpringBoot 整合MyBatis+MyBatis-Plus+MyBatisX插件使用,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04

最新评论