Domanda

Come posso iniettare un file delle proprietà che contiene una mappa, da utilizzare come ulteriore costruttore arg utilizzando il campo.

Con una mappa viene caricato da un file delle proprietà

il fagiolo è attualmente messa a punto utilizzando:

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

Grazie

È stato utile?

Soluzione

Qualcosa di simile a questo:

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

Questa sfrutta la capacità di creare fagioli usando metodi factory statico arbitrario , in questo caso utilizzando loadConfigurations() come metodo factory per creare il fagiolo configuration, che viene poi iniettato nel corretto costruttore EmbeddedGraphDatabase .

Altri suggerimenti

Creare un fagiolo che carica le proprietà (e prende il nome di file come argomento) e iniettare che invece.

Modifica Quando si utilizza le annotazioni, le cose come iniezione costruttore diventare più semplice:

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

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

Si noti che il secondo metodo definizione fagiolo "semplicemente" chiama il primo. Quando viene eseguito questo codice, Primavera sarà fare un po 'di magia in modo da poter ancora ignorare il fagiolo altrove (ad esempio i fagioli sovrascrivono ancora tra loro) e farà in modo che il corpo del metodo verrà eseguito solo una volta (non importa quante volte e da dove esso è stato chiamato).

Se la configurazione è in una classe diversa @Configuration, allora si può @Autowired che:

@Autowired
private Map<String,String> configuration;

@Bean
public GraphDatabaseService graphDb() {
    return new EmbeddedGraphDatabase( "data/neo4j-db", configuration );
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top