结合使用注解@ConditionalOnMissingBean和@Bean,可以做到只有特定名称或者类型的Bean不存在于BeanFactory中时才创建某个Bean :
@Configuration
public class ConditionalOnMissingBeanConfig {
@Bean
public A beanA(){
return new A(); // 无条件定义一个bean : beanA
}
@Bean
@ConditionalOnMissingBean(name="beanA")
public B beanB(){
// 如果 beanFactory 中存在一个名称为 beanA 的 bean,才定义bean : beanB;
// 因为上面的方法已经定义了一个 beanA,所以这里 beanB定义并不会发生。
return new B();
}
@Bean
@ConditionalOnMissingBean(name="beanD")
public C beanC(){
// 如果 beanFactory 中存在一个名称为 beanD的 bean,才定义bean : beanC;
return new C();
}
}
ConditionalOnMissingBean注解条件匹配所检查的bean定义仅限于spring boot 执行过程中application context截至当前所处理的那些bean,因此,强烈建议仅将 ConditionalOnMissingBean 使用于 auto-configuration 类。另外,如果一个候选 bean 需要在另外一个 auto-configuration 完成之后创建(或者不创建),那么需要确保该 ConditionalOnMissingBean 在那个 auto-configuration 完成之后执行。