2010-08-12 24 views
20

¿Cómo puedo inyectar un archivo de propiedades que contiene un Mapa para usar como constructor adicional arg usando el campo?Poblando un bean de primavera usando un campo constructor-arg

con un mapa que 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> 

equivalente Java:

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

Gracias

Respuesta

32

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 se aprovecha de the ability to create beans using arbitrary static factory methods, en este caso utilizando loadConfigurations() como un método de fábrica para crear el bean configuration, que luego se inyecta en el constructor apropiado de EmbeddedGraphDatabase.

+3

Gracias skaffman, funciona perfectamente :) – patrickandroid

+1

He añadido esto a el [wiki de Neo4j] (http://wiki.neo4j.org/content/Spring_And_Neo4j#Configuring_Neo4j_settings_in_Spring) también, ¡gracias chicos! – nawroth

+0

@skaffman +1 Gracias !! ¿Podría también agregar una respuesta mediante el uso de anotaciones? –

8

Crear una frijol que carga las propiedades (y toma el nombre del archivo como argumento) e inyecte eso en su lugar.

EDITAR Al utilizar 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, Spring hace algo de magia para que pueda anular el bean en otro lugar (es decir, los beans se sobrescriban) y se asegurará de que el cuerpo del método se ejecute solo una vez (sin importar la frecuencia y desde dónde fue llamado).

Si la configuración es en una clase diferente @Configuration, a continuación, puede @Autowired que:

@Autowired 
private Map<String,String> configuration; 

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

¿Podría por favor agregar una respuesta mediante el uso de anotaciones? –

+0

@KanagaveluSugumar: Listo. –

+0

¡¡Muchas gracias !!, he planteado una pregunta secundaria basada en su respuesta. http://stackoverflow.com/questions/20210307/sping-annotations-how-to-create-autowire-annotation-for-static-method-with-argu –

Cuestiones relacionadas