Заполнение пружинного компонента с использованием поля constructor-arg - PullRequest
20 голосов
/ 12 августа 2010

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

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

Боб в настоящее время настроен с использованием:

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

Спасибо

Ответы [ 2 ]

33 голосов
/ 12 августа 2010

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

<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() в качестве фабричного метода для созданиябин configuration, который затем вводится в соответствующий конструктор EmbeddedGraphDatabase.

8 голосов
/ 12 августа 2010

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

РЕДАКТИРОВАТЬ При использовании аннотаций такие вещи, как внедрение в конструктор, становятся более простыми:

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

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

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

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

@Autowired
private Map<String,String> configuration;

@Bean
public GraphDatabaseService graphDb() {
    return new EmbeddedGraphDatabase( "data/neo4j-db", configuration );
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...