使 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 变量或动态获取处理器数量。
我有一个 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 变量或动态获取处理器数量。