spring-boot-conditionalonexpression和来自外部源的属性

d7v8vwbk  于 2021-06-30  发布在  Java
关注(0)|答案(0)|浏览(164)

我尝试仅在满足属性条件时创建bean,并使用spring引导注解 @ConditionalOnExpression 为了它。我在表达式中使用的属性是从外部源(例如数据库或云)获取的,并且没有在我的应用程序代码中的属性文件中定义。这不管用。但当我在一个属性文件中定义相同的属性时,它就起作用了。
我的设置如下:
我的应用程序使用来自内部属性文件和一些外部源的属性。
使用 PropertyPlaceholderConfigurer 我已经从所有源加载了属性,并且可以使用 @Value 注解。
我的示例类:

@Component
@ConditionalOnExpression("${property1.enabled:false}")
public class PropertyIsEnabledClass {

    @Value("${property1.enabled:false}")
    private boolean isProperty1Enabled;

    public SomeClass(@Value("${property1.enabled:false}") consInputIsProperty1Enabled) {
        System.out.println("PropertyIsEnabledClass Constructor: consInputIsProperty1Enabled - " + consInputIsProperty1Enabled);
        System.out.println("PropertyIsEnabledClass Constructor: isProperty1Enabled - " + this.isProperty1Enabled);
    }

    @PostConstruct
    public void init() {
        System.out.println("PropertyIsEnabledClass PostConstruct: isProperty1Enabled - " + this.isProperty1Enabled);
    }
}

@Component
@ConditionalOnExpression("not ${property1.enabled:false}")
public class PropertyIsNotEnabledClass {

    @Value("${property1.enabled:false}")
    private boolean isProperty1Enabled;

    public SomeClass(@Value("${property1.enabled:false}") consInputIsProperty1Enabled) {
        System.out.println("PropertyIsNotEnabledClass Constructor: consInputIsProperty1Enabled - " + consInputIsProperty1Enabled);
        System.out.println("PropertyIsNotEnabledClass Constructor: isProperty1Enabled - " + this.isProperty1Enabled);
    }

    @PostConstruct
    public void init() {
        System.out.println("PropertyIsNotEnabledClass PostConstruct: isProperty1Enabled - " + this.isProperty1Enabled);
    }
}

在上面的例子中,当属性在外部数据源而不是内部属性文件中定义为true时,bean PropertyIsEnabledClass 未创建,并打印:

PropertyIsNotEnabledClass Constructor: consInputIsProperty1Enabled - true
PropertyIsNotEnabledClass Constructor: isProperty1Enabled - false
PropertyIsNotEnabledClass PostConstruct: isProperty1Enabled - true

但是,当我在内部属性文件中将属性定义为true时,它会打印:

PropertyIsEnabledClass Constructor: consInputIsProperty1Enabled - true
PropertyIsEnabledClass Constructor: isProperty1Enabled - true
PropertyIsEnabledClass PostConstruct: isProperty1Enabled - true

请帮助我了解这是一个有效的行为,或一些问题,我正在加载的属性-
spel要求属性在属性文件中定义,而不是在外部数据源中定义。
属性是在创建bean之后设置的。因此,在postconstruct方法中可用,但在构造函数中不可用。
但是,该物业始终可通过 @Value 注解。
谢谢。

暂无答案!

目前还没有任何答案,快来回答吧!

相关问题