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
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
.
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 );
}