Заполнение 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 );
Спасибо
Ответы
Ответ 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 );
}