Заполнение весеннего боба с использованием поля конструктора-ARG
Вопрос
Как я могу ввести файл свойств, содержащий карту, которая будет использоваться в качестве дополнительного конструктора Arg, используя поле.
С картой, загруженной из файла свойств
Фасоль в настоящее время настроен с использованием:
<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 );
Спасибо
Решение
Что-то вроде этого:
<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>
Это использует Способность создавать бобы с использованием произвольных статических фабричных методов, в этом случае с использованием loadConfigurations()
как фабричный метод для создания configuration
фасоль, который затем вводится в правильный конструктор EmbeddedGraphDatabase
.
Другие советы
Создайте боб, который загружает свойства (и принимает имя файла в качестве аргумента) и вместо этого впрыскивается.
РЕДАКТИРОВАТЬ При использовании аннотаций, такие вещи, как инъекция конструктора, становятся более простыми:
@Bean
public Map<String,String> configuration() {
return EmbeddedGraphDatabase.loadConfigurations( "neo4j_config.props" );
}
@Bean
public GraphDatabaseService graphDb() {
return new EmbeddedGraphDatabase( "data/neo4j-db", configuration() );
}
Обратите внимание, что второй метод определения бобов «просто» вызывает первый. Когда этот код выполнен, пружина будет делать некоторую магию, чтобы вы все еще можете переопределить боб в другом месте (то есть бобы все еще перезаписывают друг друга), и он убедит, что корпус метода будет выполнен только один раз (независимо от того, как часто и откуда его выполнено назывался).
Если конфигурация находится в другом @Configuration
класс, то вы можете @Autowired
Это:
@Autowired
private Map<String,String> configuration;
@Bean
public GraphDatabaseService graphDb() {
return new EmbeddedGraphDatabase( "data/neo4j-db", configuration );
}