在ConditionalOnExpression评估期间,PropertySource不可用

问题描述 投票:3回答:1

我有以下组件类,我想根据属性实例化;

@Component("componentA")
@PropertySource("classpath:components.properties")
@ConditionalOnExpression("'${components.enabled}'.contains('componentA')")
public class ComponentA implements ComponentIF {
...

components.properties文件具有以下属性;

components.enabled=componentA,componentB,componentD

问题是@PropertySource("classpath:components.properties")似乎在评估@ConditionalOnExpression("'${components.enabled}'.contains('componentA')")期间无法使用。

另一方面,如果我将components.enabled=componentA,componentB,componentD属性放在spring-boot的application.properties文件中,则该属性在ConditionalOnExpression评估期间变为可用,并且它按预期工作。

但是,我想使用components.properties来保持所有组件特定属性在同一个地方。

在ConditionalOnExpression期间,PropertySource是否无效的任何想法?

java spring spring-boot spring-java-config
1个回答
1
投票

I also had the same problem。就我而言,我想根据条件启用某些方面。看起来spring在初始化的早期阶段读取了一些值,并且很难覆盖这些值。 (像@ConditionalOnExpression的价值观)。

为了设置这些变量的值。

  1. 在类路径中的application.properties中指定属性。始终从此文件中读取在较早阶段加载的变量。
  2. 使用配置文件并将application.properties定义为application-profile.properties并激活相应的配置文件。
  3. 将属性值作为JVM参数传递,如-Dproperty.key=value

否则如果你想使用属性文件本身覆盖属性,我建议你使用go through this answer

所有这些都可以组合在一起。 To know about their precedence refer this

© www.soinside.com 2019 - 2024. All rights reserved.