我有一个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使用静态字段作为属性的默认值?
答案 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