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