Заполнение Spring bean-компонента с помощью поля constructor-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 Эквивалент:

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

Спасибо

20
задан skaffman 12 August 2010 в 11:50
поделиться

2 ответа

Примерно так:

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

33
ответ дан 29 November 2019 в 23:48
поделиться

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

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 );
}
8
ответ дан 29 November 2019 в 23:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: