我尝试仅在满足属性条件时创建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
注解。
谢谢。
暂无答案!
目前还没有任何答案,快来回答吧!