java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Spring @ConditionalOnMissingBean 注解

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

作者:牧小七

@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 “约定优于配置” 理念的重要实现:

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

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

您可能感兴趣的文章:
阅读全文