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

Java 使spring@Value从静态字段中获取默认值,java,spring,spring-java-config,Java,Spring,Spring Java Config,我有一个java配置,我使用application.properties中定义的一些属性创建bean。对于其中一个,我有一个相当长的默认值,因此我将该值提取到该配置的公共静态最终字符串字段中,现在我想让@value将其用作默认值 所以最终我想要这样的东西: @Configuration public class MyConfiguration { public static final String DEFAULT_PROPERTY_VALUE = "long string...";

我有一个java配置,我使用
application.properties
中定义的一些属性创建bean。对于其中一个,我有一个相当长的默认值,因此我将该值提取到该配置的
公共静态最终字符串
字段中,现在我想让
@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...
    }
}
@配置
公共类MyConfiguration{
公共静态最终字符串默认值_属性_值=“长字符串…”;
@Bean(“中端”)
公共分布式数据空间中端点(
@值(${foo.bar.my property:DEFAULT\u property\u Value})字符串myPropertyValue){
…创建并返回bean。。。
}
}
然而,春天并没有我的领域,所以我很好奇,如果我能以某种方式使它查找它


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

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

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

您可能只想注入
环境
,并将值作为默认值,如下所示:

@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);
    }
}
@配置
公共类MyConfiguration{
公共静态最终字符串默认值_属性_值=“长字符串…”;
@自动连线
私人环境署;
@Bean(“中端”)
公共分布式数据空间MIDPRICEDSDSENDPOINT(){
字符串myPropertyValue=env.getProperty(“foo.bar.MyProperty”,默认值);
}
}
我个人认为这更有可读性…

我会做


@Value(${foo.bar.my property:“+DEFAULT\u property\u Value+”}”)

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

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

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

我不确定您的代码是做什么的。为什么要将propertyValue与其他内容进行比较?用例只是我有一个默认值,它是一个长字符串,我不想直接将它粘贴到注释pa我不理解你的问题-在静态字段中放置长值如何比直接在注释参数中放置长值更好?在任何情况下,如果必须这样做,可以使用其他值,如“null”作为默认值,然后通过我上面粘贴的方法而不是通过字段值访问该值。这将检查您的值是否等于预定义的“默认标记”值(在本例中为“null”)如果是这样,将返回静态字段的值,从而增加可读性,一方面是在方法参数声明的中间有巨字符串,另一方面,如果该字符串被提取到某个字段中,并且在<代码> @值<代码>中,您只需参考该字段。哦,对,我的坏,我只是略略地看了一下您的阙。stion并没有注意到这实际上是一个方法参数。请查看下面@Dovmo的答案。这是一个好主意,我考虑过,但在这种情况下是否有任何禁止的符号?我的意思是,此default值不是字母数字的,并且包含
{}等符号=,.
等,这样的声明能正常工作吗?没有区别,因为设置默认值直接在@value中,常量不会发生任何更改,仅适用于公共可访问的静态常量。请参阅我的答案。此模式也适用于常量,例如@value(${foo.bar)。我的属性:{t(fully.qualified.package.MyConfiguration).DEFAULT_PROPERTY_VALUE}}”)不是OP要求的直接答案,它使用的是
@VALUE