Spring值注入Bean

时间:2015-11-13 15:55:50

标签: java spring spring-mvc dependency-injection spring-boot

我是春天的新手,我正试图处理价值注入问题。我有以下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;
    }
}

我不确定这种新方法有多正确。

2 个答案:

答案 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()
是@PropertySource工作所必需的,以便注入@Value。

为了实现您的部分.properties的间接级别的目标,您有不同的解决方案: - 按照您的意图,在@Value注入的变量中指定最终.properties文件的名称,但是您必须将此新属性源添加到当前上下文,然后如果希望添加的值可用则刷新它在其他@Value中,这需要访问一些" low" Spring上下文API的级别API和仔细的bean依赖性分析,

  • 更简单的解决方案是使用一个环境变量(使用-D在运行时传递给JVM的变量,例如-DrunningEnv = dev | test | prod | whatever ...)然后使用该环境变量作为指向您定位的实际配置的路径组件。 例如:

    类路径:配置/ $ {runningEnv} /cassandra.properties

您可以在@PropertySource中使用。