有时我们想在满足指定条件的时候才将某个 bean 注册到spring 容器中,我们可以通过 @Conditional 注解来实现这类操作。
但是在使用@Conditional 比较麻烦,还有实现Condition接口。
贴心的spring 已经我们提供了几个常用的注解,我们就不要自己去实现了。
- ConditionalOnBean 指定的bean存在,才会注册
@Bean
ExistBean getExistBean(){
return new ExistBean();
}
//ExistBean 已注册的情况下LoadBeanByExist才能注册
@Bean
@ConditionalOnBean(ExistBean.class)
LoadBeanByExist getLoadBeanByExist(){
return new LoadBeanByExist();
}
- ConditionalOnMissingBean 指定的bean不存在,才会注册
@Bean
ExistBean getExistBean(){
return new ExistBean();
}
//指定的bean不存在,才会注册
@Bean
@ConditionalOnMissingBean(ExistBean.class)
LoadBeanByExist getLoadBeanByExist(){
return new LoadBeanByExist();
}
会导致启动失败,ExistBean已经注册了,LoadBeanByExist就注册不了,当我们需要从spring中获取LoadBeanByExist bean时就会错
- ConditionalOnClass classpath中存在指定的class才能注册
@Bean
ExistBean getExistBean(){
return new ExistBean();
}
@Bean
@ConditionalOnClass({ExistBean.class})
LoadBeanByExist getLoadBeanByExist(){
return new LoadBeanByExist();
}
- ConditionalOnMissingClass classpath中不存在指定的class才能注册
@Bean
ExistBean getExistBean(){
return new ExistBean();
}
@Bean
@ConditionalOnMissingClass("com.mystarter.chiv.conditional.ExistBean")
LoadBeanByExist getLoadBeanByExist(){
return new LoadBeanByExist();
}
前面的两个注解跟后面两个是相似的,区别一个是spring 容器中一个是classpath中
- ConditionalOnProperty 指定配置存在的时候才能注册
@Bean
@ConditionalOnProperty(value = "test.conditional",havingValue = "true",matchIfMissing = true)
LoadBeanByExist getLoadBeanByExist(){
return new LoadBeanByExist();
}
application.yml
test:
conditional :true
配置这些才能成功注册bean
总结
Spring Boot提供了几个非常有用的条件装配注解,可实现灵活的条件装配。