TFdream / blog

个人技术博客,博文写在 Issues 里。
Apache License 2.0
129 stars 18 forks source link

SpringBoot @ConditionalOnProperty 复杂场景应用 #409

Open TFdream opened 2 years ago

TFdream commented 2 years ago

最近在开发 spring-boot-starter时 涉及到多个条件进行 OR 逻辑运算,而ConditionalOnProperty默认是支持 “多个条件逻辑” AND运算;

例如:

@ConditionalOnProperty(name={"app.initialize.dictionary","app.initialize.all"}, havingValue="true")

这显然不符合我们的要求,我们需要“逻辑或”

解决方案有2个:

方案一

class DicOrAllCondition extends AnyNestedCondition {

    public DicOrAllCondition() {
        super(ConfigurationPhase.PARSE_CONFIGURATION);
    }

    @ConditionalOnProperty(name = "app.initialize.dictionary", value = "true")
    static class DicCondition {
    }

    @ConditionalOnProperty(name = "app.initialize.all", value = "true")
    static class AllCondition {
    }
}

用法:

@Order(1)
@Component
@Conditional(DicOrAllCondition.class)
public class DictionaryInitializer implements CommandLineRunner{

}

方案二

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

}

application.properties如下:

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

还有更灵活的配置方式:

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