Pergunta

Como posso injetar um arquivo de propriedades contendo um mapa a ser usado como Arg adicional de construtor usando o campo.

Com um mapa sendo carregado de um arquivo de propriedades

O feijão está atualmente configurado usando:

<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 equivalente:

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

Obrigado

Foi útil?

Solução

Algo assim:

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

Isso tira proveito de A capacidade de criar feijão usando métodos arbitrários de fábrica estática, neste caso usando loadConfigurations() como um método de fábrica para criar o configuration Bean, que é então injetado no construtor adequado de EmbeddedGraphDatabase.

Outras dicas

Crie um feijão que carregue as propriedades (e pega o nome do arquivo como argumento) e injete isso.

EDITAR Ao usar anotações, coisas como a injeção de construtor se tornam mais simples:

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

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

Observe que o segundo método de definição do feijão "simplesmente" chama o primeiro. Quando esse código for executado, a primavera fará um pouco de mágica para que você ainda possa substituir o feijão em outro lugar (ou seja, os feijões ainda se substituem) e garantirá que o corpo do método seja executado apenas uma vez (não importa com que frequência e de onde ele foi chamado).

Se a configuração estiver em um diferente @Configuration classe, então você pode @Autowired isto:

@Autowired
private Map<String,String> configuration;

@Bean
public GraphDatabaseService graphDb() {
    return new EmbeddedGraphDatabase( "data/neo4j-db", configuration );
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top