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

Rus*_*dov 2 java spring spring-java-config

我有一个 java 配置,我使用一些属性创建 bean,在application.properties. 对于其中之一,我有一个很长的默认值,因此我将此值提取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...
    }
}
Run Code Online (Sandbox Code Playgroud)

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

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

Vyn*_*ent 8

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


Abh*_*kar 6

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

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

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