@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();
}
}注意事项
- 加载顺序问题:bean 的创建顺序会影响
@conditionalonmissingbean的判断结果 - 多个配置类:如果有多个配置类都定义了相同的 bean,spring 需要确定哪个配置类先加载
- 配合
@primary使用:当有多个同类型 bean 时,可以指定哪个是主要的
@bean
@conditionalonmissingbean
@primary // 当有多个 datasource 时,这个作为主要的
public datasource primarydatasource() {
return new primarydatasource();
}
总结
@conditionalonmissingbean 是 spring boot “约定优于配置” 理念的重要实现:
- ✅ 提供开箱即用的默认配置
- ✅ 允许用户轻松自定义和覆盖
- ✅ 避免 bean 定义的冲突
- ✅ 是 spring boot 自动配置灵活性的关键
这种机制使得 spring boot 既能提供强大的默认配置,又保持了高度的可定制性。
到此这篇关于spring @conditionalonmissingbean 注解是做什么的的文章就介绍到这了,更多相关spring @conditionalonmissingbean 注解内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论