Poblar un grano de primavera usando un campo constructor-arg
Pregunta
¿Cómo me inyecto un archivo de propiedades que contiene un mapa para ser utilizado como constructor de Arg adicional utilizando el campo.
Con un mapa se carga desde un archivo de propiedades
el grano se pone actualmente 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 );
Gracias
Solución
Algo como esto:
<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>
Esto aprovecha la capacidad de crear frijoles usando métodos de fábrica estática arbitraria , en este caso utilizando loadConfigurations()
como un método de fábrica para crear el bean configuration
, que se inyecta a continuación en el constructor adecuado de EmbeddedGraphDatabase
.
Otros consejos
Crear un bean que carga las propiedades (y lleva el nombre del archivo como argumento) y se inyecta en su lugar.
Editar Cuando se utiliza anotaciones, cosas como la inyección de constructor ser más simple:
@Bean
public Map<String,String> configuration() {
return EmbeddedGraphDatabase.loadConfigurations( "neo4j_config.props" );
}
@Bean
public GraphDatabaseService graphDb() {
return new EmbeddedGraphDatabase( "data/neo4j-db", configuration() );
}
Tenga en cuenta que el segundo método de definición de frijol "simplemente" llama a la primera. Cuando se ejecuta este código, la primavera va a hacer un poco de magia lo que aún puede anular el frijol en otro lugar (es decir, los granos todavía sobreescriben entre sí) y que se asegurará de que el cuerpo del método se ejecutará sólo una vez (no importa con qué frecuencia y desde donde fue llamado).
Si la configuración está en una clase @Configuration
diferente, entonces se puede @Autowired
que:
@Autowired
private Map<String,String> configuration;
@Bean
public GraphDatabaseService graphDb() {
return new EmbeddedGraphDatabase( "data/neo4j-db", configuration );
}