使用构造函数-arg字段填充spring bean

时间:2010-08-12 09:47:56

标签: java spring neo4j

如何使用该字段注入包含Map的属性文件以用作其他构造函数arg。

从属性文件加载地图

目前使用以下方式设置bean:

<bean id="graphDbService" class="org.neo4j.kernel.EmbeddedGraphDatabase"
     init-method="enableRemoteShell" destroy-method="shutdown">

     <constructor-arg index="0" value= "data/neo4j-db"/>
         <constructor-arg index="1" value=?  />
</bean>

Java等效:

Map<String,String> configuration =  EmbeddedGraphDatabase.loadConfigurations( "neo4j_config.props" );
GraphDatabaseService graphDb = new EmbeddedGraphDatabase( "data/neo4j-db", configuration );

由于

2 个答案:

答案 0 :(得分:33)

这样的事情:

<bean id="configuration" class="org.neo4j.kernel.EmbeddedGraphDatabase" 
      factory-method="loadConfigurations">
   <constructor-arg value="neo4j_config.props"/>
</bean>

<bean id="graphDbService" class="org.neo4j.kernel.EmbeddedGraphDatabase"
     init-method="enableRemoteShell" destroy-method="shutdown">

     <constructor-arg index="0" value="data/neo4j-db"/>
     <constructor-arg index="1" ref="configuration"  />
</bean>

这利用了the ability to create beans using arbitrary static factory methods,在这种情况下使用loadConfigurations()作为工厂方法来创建configuration bean,然后将其注入EmbeddedGraphDatabase的正确构造函数中

答案 1 :(得分:8)

创建一个加载属性的bean(并将文件名作为参数)并注入它。

编辑使用注释时,构造函数注入等内容变得更加简单:

@Bean
public Map<String,String> configuration() {
    return EmbeddedGraphDatabase.loadConfigurations( "neo4j_config.props" );
}

@Bean
public GraphDatabaseService graphDb() {
    return new EmbeddedGraphDatabase( "data/neo4j-db", configuration() );
}

请注意,第二个bean定义方法“简单地”调用第一个。当执行此代码时,Spring会做一些魔术,所以你仍然可以在别处覆盖bean(即bean仍然会相互覆盖),并且它将确保方法体只执行一次(无论多久和从哪里开始)被称为。)

如果配置位于不同的@Configuration级别,那么您可以@Autowired

@Autowired
private Map<String,String> configuration;

@Bean
public GraphDatabaseService graphDb() {
    return new EmbeddedGraphDatabase( "data/neo4j-db", configuration );
}
相关问题