使 spring @Value 从静态字段中获取默认值

Make spring @Value take default value from static field

我有一个 java 配置,我在其中使用 application.properties 中定义的一些属性创建 bean。对于其中一个,我有一个很长的默认值,所以我将这个值提取到这个配置的 public static final String 字段中,现在我想让 @Value 将它用作默认值。

所以最终我想要这样的东西:

@Configuration
public class MyConfiguration {

    public static final String DEFAULT_PROPERTY_VALUE = "long string...";

    @Bean("midPriceDDSEndpoint")
    public DistributedDataSpace<Long, MidPriceStrategy> midPriceDDSEndpoint(
        @Value("${foo.bar.my-property:DEFAULT_PROPERTY_VALUE}") String myPropertyValue) {
    ... create and return bean...
    }
}

但是 spring 不是我的领域,所以我很好奇我是否能以某种方式让它查找它。

解决此问题的一种方法是通过配置 bean 访问此静态字段:@Value(${foo.bar.my-property:#{myConfigurationBeanName.DEFAULT_PROPERTY_VALUE}}),但使用此方法会使构造函数不可读,因为 Value 注释需要大量 space(因为 属性 名称和配置 bean 名称比本例中的长)。有没有其他方法可以让 spring 使用静态字段作为 属性 的默认值?

我不是 100% 确定,但我认为这是不可能的。这里真正的问题是为什么你需要做那样的事情?用例是什么?你总是可以做一个简单的解决方法,比如

private String getMyPropertyValue() {
    return myPropertyValue.equals("some_explicitly_defined_default_value") ? DEFAULT_PROPERTY_VALUE : myPropertyValue;
}

您可能只想注入 Environment,并像这样获取默认值:

@Configuration
public class MyConfiguration {

    public static final String DEFAULT_PROPERTY_VALUE = "long string...";

    @Autowired
    private Environment env;

    @Bean("midPriceDDSEndpoint")
    public DistributedDataSpace<Long, MidPriceStrategy> midPriceDDSEndpoint() {
        String myPropertyValue = env.getProperty("foo.bar.my-property", DEFAULT_PROPERTY_VALUE);
    }
}

我个人认为这样更易读一些...

我愿意 @Value("${foo.bar.my-property:" + DEFAULT_PROPERTY_VALUE + "}")

@Vyncent 的回答范围有限,因为它只适用于可公开访问的静态常量,因为注释属性必须是编译时常量。要调用静态方法,请使用以下内容:

@Value("${demo.parallelism:#{T(java.lang.Runtime).getRuntime().availableProcessors()}}")
private int parallelism;

这会设置 parallelism = demo.parallelism JVM 变量或动态获取处理器数量。