使spring @Value从静态字段

时间:2018-05-17 15:22:07

标签: java spring spring-java-config

我有一个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...
    }
}

然而,春天不是我的领域,所以我很好奇,如果我能以某种方式让它查找它。

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

4 个答案:

答案 0 :(得分:6)

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

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

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

答案 1 :(得分:3)

您可能只想注入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);
    }
}

我个人认为这有点可读......

答案 2 :(得分:1)

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

答案 3 :(得分:0)

我不是百分百肯定,但我认为这是不可能的。这里真正的问题是为什么你需要做那样的事情?用例是什么?您可以随时制作一个简单的解决方法,如

# lib/tasks/db/truncate.rake

namespace :db do
  desc 'Truncate all tables except users state and meta'
  task truncate: :environment do
    conn = ActiveRecord::Base.connection
    tables = conn.tables - %w[
      sessions
      users
      roles
      users_roles
      schema_migrations
      ar_internal_metadata
    ]
    tables.each { |t| conn.execute("TRUNCATE #{t}") }

    puts "Truncated tables\n================\n#{tables.sort.join("\n")}"
  end
end