web-dev-qa-db-ja.com

constructor-argフィールドを使用してSpring Beanを生成する

フィールドを使用して追加のコンストラクタ引数として使用されるマップを含むプロパティファイルを挿入するにはどうすればよいですか。

プロパティファイルからマップが読み込まれる場合

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 );

ありがとう

20
patrickandroid

このようなもの:

_<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>
_

これは 任意の静的ファクトリメソッドを使用してBeanを作成する機能 を利用します。この場合は、configuration Beanを作成するファクトリメソッドとしてloadConfigurations()を使用します。その後、EmbeddedGraphDatabaseの適切なコンストラクターに注入されます。

33
skaffman

プロパティーをロードする(そしてファイル名を引数として取る)Beanを作成し、代わりにそれを注入します。

[〜#〜] edit [〜#〜]注釈を使用する場合、コンストラクター注入のようなものはより単純になります。

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

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

2番目のBean定義メソッドは、最初のメソッドを「単純に」呼び出すことに注意してください。このコードが実行されると、Springは何らかの魔法をかけるので、Beanを他の場所でオーバーライドできます(つまり、Beanは相互に上書きします)。と呼ばれていました)。

構成が別の@Configurationクラスにある場合、@Autowired itできます:

@Autowired
private Map<String,String> configuration;

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