web-dev-qa-db-fra.com

Remplissage d'un haricot à l'aide d'un champ constructeur-arg

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

Avec une carte en cours de chargement à partir d'un fichier de propriétés

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

20
patrickandroid

Quelque chose comme ça:

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

Cela profite de la possibilité de créer des beans en utilisant des méthodes d'usine statiques arbitraires , dans ce cas en utilisant loadConfigurations() comme méthode d'usine pour créer le bean configuration, qui est puis injecté dans le bon constructeur de EmbeddedGraphDatabase.

33
skaffman

Créez un bean qui charge les propriétés (et prend le nom de fichier comme argument) et injectez-le à la place.

EDIT Lors de l'utilisation d'annotations, des choses comme l'injection de constructeur deviennent plus simples:

@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 deuxième méthode de définition de bean appelle "simplement" la première. Lorsque ce code est exécuté, Spring fera de la magie pour que vous puissiez toujours remplacer le bean ailleurs (c'est-à-dire que les beans se remplacent toujours) et il s'assurera que le corps de la méthode ne sera exécuté qu'une seule fois (peu importe la fréquence et d'où il provient). a été appelé).

Si la configuration est dans un autre @Configuration classe, alors vous pouvez @Autowired il:

@Autowired
private Map<String,String> configuration;

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