我是春天的新手,我正试图处理价值注入问题。我有以下spring boot bean:
@Configuration
public class GraphProductionConfig {
@Value("${database.config}")
private static String CONFIG;
@Bean
public static GraphFactory getGraphFactory(){
return new GraphProductionFactory();
}
public static class GraphProductionFactory implements GraphFactory{
public Graph buildGraph() {
TitanGraph titanGraph = TitanFactory.open(CONFIG);
Graph graph = titanGraph;
graph.tx().onClose(Transaction.CLOSE_BEHAVIOR.ROLLBACK);
return graph;
}
}
}
在我的application.properties文件中包含以下内容:
database.config="conf/titan-cassandra.properties";
我正在尝试将database.config
注入GraphProductionFactory
,以便我可以使用不同的配置。我知道注入静态字段非常糟糕。我有读取构造函数注入可能,但我希望我的GraphProductionFactory
保持静态。有关如何进行的任何建议吗?
修改
我已经能够使用以下方法实现所需的行为:
public static class GraphProductionFactory implements GraphFactory{
@Value("${database.config}")
private String CONFIG;
public Graph buildGraph() {
TitanGraph titanGraph = TitanFactory.open(CONFIG);
Graph graph = titanGraph;
graph.tx().onClose(Transaction.CLOSE_BEHAVIOR.ROLLBACK);
return graph;
}
}
我不确定这种新方法有多正确。
答案 0 :(得分:0)
application.propertiesAdd PropertySourcesPlaceholderConfigurer
bean a到您的配置。
@Configuration
@PropertySource("classpath:application.properties")//location of your property file
public class GraphProductionConfig {
@Value("${database.config}")
private static String CONFIG;
//other bean configuration
//..
@Bean
static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer() {
return new PropertySourcesPlaceholderConfigurer();
}
}
答案 1 :(得分:0)
一些澄清:
static PropertySourcesPlaceholderConfigurer propertyPlaceHolderConfigurer()
为了实现您的部分.properties的间接级别的目标,您有不同的解决方案: - 按照您的意图,在@Value注入的变量中指定最终.properties文件的名称,但是您必须将此新属性源添加到当前上下文,然后如果希望添加的值可用则刷新它在其他@Value中,这需要访问一些" low" Spring上下文API的级别API和仔细的bean依赖性分析,
更简单的解决方案是使用一个环境变量(使用-D在运行时传递给JVM的变量,例如-DrunningEnv = dev | test | prod | whatever ...)然后使用该环境变量作为指向您定位的实际配置的路径组件。 例如:
类路径:配置/ $ {runningEnv} /cassandra.properties
您可以在@PropertySource中使用。