美文网首页
Spring Boot通过@ConditionalOnPrope

Spring Boot通过@ConditionalOnPrope

作者: zhuchunyan_aiji | 来源:发表于2020-11-14 15:52 被阅读0次

    发现了Spring boot中有个注解@ConditionalOnProperty,这个注解能够控制某个configuration是否生效。具体操作是通过其两个属性name以及havingValue来实现的,其中name用来从application.properties中读取某个属性值,如果该值为空,则返回false;如果值不为空,则将该值与havingValue指定的值进行比较,如果一样则返回true;否则返回false。如果返回值为false,则该configuration不生效;为true则生效。

    也可以在 @Service 注解一起使用. 这样service层就可以不生效

    //在application.properties配置"mf.assert",对应的值为true
    @Configuration
    //如果synchronize在配置文件中并且值为true
    @ConditionalOnProperty(prefix="mf",name = "assert", havingValue = "true")
    public class SecondDatasourceConfig {
    
        @Bean(name = "SecondDataSource")
        @Qualifier("SecondDataSource")
        @ConfigurationProperties(prefix = "spring.second.datasource")
        public DataSource jwcDataSource() {
            return DataSourceBuilder.create().build();
        }
    }
    

    一些复杂应用

    最近在写一个“启动时导入数据”的小功能。实现很简单, CommandLineRunner会在SpringBoot启动时运行,第一版长这样:

    Order(1)
    @Component
    public class DictionaryInitializer implements CommandLineRunner {
        @Override
        public void run(String... args) throws Exception {
              //do import dictionary
        }
    }
    

    自然的,我们希望这个可配置化,只在需要的时候运行。我们使用@ConditionalOnProperty

    @Order(1)
    @Component
    @ConditionalOnProperty(name="app.initialize.dictionary", havingValue="true")
    public class DictionaryInitializer implements CommandLineRunner {
        @Override
        public void run(String... args) throws Exception {
              //do import dictionary
        }
    }
    

    然后在application.properties中加入

    app.initialize.dictionary=true
    

    随着功能的迭代,我们又更多类似的导入功能,例如导入Product和Parameter。依样画葫芦,application.properties中多了相似的配置
    这个有点麻烦,涉及到多个条件的组合。ConditionalOnProperty是支持 “多个条件逻辑与”的

    还有一种比较灵活的方式是使用@ConditionalOnExpression写一个表达式

    @Order(1)
    @Component
    @ConditionalOnExpression("${app.initialize.dictionary:false} || ${app.initialize.all:false}")
    public class DictionaryInitializer implements CommandLineRunner{}
    

    精益无止境,其实还有更灵活的配置方式:除了dictionary其他都导入:

    app.initialize.all=true
    app.initialize.dictionary=false
    

    换种说法就是:如果局部有配置,则按局部配置处理。如果局部没配置,则按全局配置处理。如果全局、局部都没配置,则默认不导入。这里可以利用“默认值”嵌套表达式实现

    @ConditionalOnExpression("${app.initialize.dictionary:${app.initialize.all:false}}")
    
    

    相关文章

      网友评论

          本文标题:Spring Boot通过@ConditionalOnPrope

          本文链接:https://www.haomeiwen.com/subject/ldcebktx.html