2010-08-12 19 views
20

Comment puis-je injecter un fichier de propriétés contenant une carte à utiliser comme argument constructeur supplémentaire à l'aide du champ.Remplissage d'un haricot source à l'aide d'un champ constructeur-arg

une carte étant chargée à partir d'un fichier de propriétés

le haricot est actuellement configuré en utilisant:

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

équivalent Java:

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

Merci

Répondre

32

Quelque chose comme ceci: dans ce cas

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

Ce tire avantage de the ability to create beans using arbitrary static factory methods, en utilisant loadConfigurations() comme une méthode d'usine pour créer le haricot configuration, qui est ensuite injecté dans le bon constructeur de EmbeddedGraphDatabase.

+3

Merci, skaffman, ça marche parfaitement :) – patrickandroid

+1

J'ai ajouté cela à le [wiki Neo4j] (http://wiki.neo4j.org/content/Spring_And_Neo4j#Configuring_Neo4j_settings_in_Spring) aussi, merci les gars! – nawroth

+0

@skaffman +1 Merci !! Pourriez-vous également ajouter une réponse en utilisant des annotations? –

8

Créez un haricot qui charge les propriétés (et prend le nom du fichier comme argument) et injecter cela à la place.

EDIT Lorsque vous utilisez des annotations, des choses comme l'injection de constructeur devient plus simple:

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

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

Notez que la seconde méthode de définition de haricot "simplement" appelle le premier. Lorsque ce code est exécuté, Spring va faire de la magie pour que vous puissiez toujours remplacer le bean ailleurs (les beans se remplacent encore) et il s'assurera que le corps de la méthode ne sera exécuté qu'une seule fois (quelle que soit la fréquence a été appelé).

Si la config est dans une classe @Configuration différente, alors vous pouvez @Autowired il:

@Autowired 
private Map<String,String> configuration; 

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

Pourriez-vous, s'il-vous-plaît, ajouter une réponse en utilisant des annotations? –

+0

@KanagaveluSugumar: Fait. –

+0

Merci beaucoup !!, j'ai soulevé une sous-question basée sur votre réponse. http://stackoverflow.com/questions/20210307/sping-annotations-how-to-create-autowire-annotation-for-static-method-with-argu –