@Conditional 条件注入

359 阅读1分钟

有时我们想在满足指定条件的时候才将某个 bean 注册到spring 容器中,我们可以通过 @Conditional 注解来实现这类操作。

image.png

但是在使用@Conditional 比较麻烦,还有实现Condition接口。

image.png

贴心的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 
    testconditional :true
    配置这些才能成功注册bean

总结

Spring Boot提供了几个非常有用的条件装配注解,可实现灵活的条件装配。