Подтвердить что ты не робот

Заполнение spring bean с использованием поля конструктор-arg

Как я могу вставить файл свойств, содержащий карту, которая будет использоваться в качестве дополнительного аргумента конструктора, используя поле.

С Картой, загружаемой из файла свойств

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" value=?  />
</bean>

Java Equivalent:

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

Спасибо

4b9b3361

Ответ 1

Что-то вроде этого:

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

Это позволяет создать beans с помощью произвольных статических factory методов, в этом случае используя loadConfigurations() как factory для создания configuration bean, который затем вводится в собственный конструктор EmbeddedGraphDatabase.

Ответ 2

Создайте bean, который загружает свойства (и берет имя файла в качестве аргумента) и вместо этого вводит это.

EDIT При использовании аннотаций вещи, такие как инъекция конструктора, становятся более простыми:

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

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

Обратите внимание, что второй метод определения bean "просто" вызывает первый. Когда этот код будет выполнен, Spring сделает какую-то магию, поэтому вы все равно можете переопределить bean в другом месте (т.е. beans все еще переписывать друг друга), и он будет следить за тем, чтобы тело метода выполнялось только один раз (независимо как часто и откуда он был вызван).

Если config находится в другом классе @Configuration, вы можете @Autowired его:

@Autowired
private Map<String,String> configuration;

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