2012-07-03 1 views
3

У меня есть MongoService класса, какSpring: как передать значения в конструктор из файла свойств

public class MongoService { 

    private final Mongo mongo; 
    private final String database; 
    private static final Logger LOGGER = LoggerFactory.getLogger(MongoService.class); 

    public MongoService(@Nonnull final String host, final int port, @Nonnull final String db) throws UnknownHostException { 
     mongo = new Mongo(host, port); 
     database = db; 
    } 

    public void putDocument(@Nonnull final DBObject document) { 
     LOGGER.info("inserting document - " + document.toString()); 
     mongo.getDB(database).getCollection(getCollectionName(document)).insert(document, WriteConcern.SAFE); 
    } 

    public void putDocuments(@Nonnull final List<DBObject> documents) { 
     for (final DBObject document : documents) { 
      putDocument(document); 
     } 
    } 

} 

Я хочу, чтобы ввести значение host, port, db в конструктор из внешних файл свойств
/хранения/локальными .properties

### === MongoDB interaction === ### 
host=127.0.0.1 
port=27017 
database=contract 

Мой файл wireup Spring выглядит следующим образом
wireup.xml

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" 
     xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.0.xsd"> 

    <util:properties id="mongoProperties" location="file:///storage//local.properties" /> 

    <bean id="mongoService" class="com.business.persist.MongoService"> 
     // TODO 
    </bean> 
</beans> 

Вопрос

Как я могу передать значение host, port, db из local.properties файла и передать его следующему конструктору?

public MongoService(@Nonnull final String host, final int port, @Nonnull final String db) throws UnknownHostException { 
     mongo = new Mongo(host, port); 
     database = db; 
    } 

ответ

11

Вместо того, чтобы импортировать файл свойства с помощью Util: свойства тег, вы хотите импортировать его с помощью контекста: property-placeholder. Версия util просто импортирует файл как объект Properties, а не раскрывает значения свойств для вашей конфигурации. Так что ваша установка будет что-то вроде:

<context:property-placeholder location="file:///storage//local.properties"/> 

Затем, когда вы разводка вашего MongoService, вы можете использовать имена свойств в конструкторе конфигурации, такие как

<bean id="mongoService" class="com.business.persist.MongoService"> 
    <constructor-arg value="${host}"/> 
    <constructor-arg value="${port}"/> 
    <constructor-arg value="${database}"/> 
</bean> 

См the spring docs для более подробной информации. На стороне примечания я хотел бы дать более описательное имя для каждого из свойств, чтобы избежать столкновения с другими свойствами, которые могут быть определены в вашем приложении.

+0

это работает совсем хорошо @ Mike, спасибо за Ваш ответ! – daydreamer

4

определяет свойство заполнителя:

<context:property-placeholder location="classpath:path/to/your.properties"/> 

и теперь используют свойства:

<bean id="mongoService" class="com.business.persist.MongoService"> 
    <constructor-arg value="${property.foo}" /> 
    <constructor-arg value="${property.bar}" /> 
</bean> 

См: 4.8.2.1 Example: the PropertyPlaceholderConfigurer

3

Mike и Шон дал вполне адекватные ответы. Вот одно дополнения: как только ваш PropertyPlaceHolderConfigurer настроен правильно, считает в настоящее время широко используется @Value аннотации для инъекций этих свойств в конструктор:

public class MongoService { 

    .. 

    @Autowired 
    public MongoService(@Value("${host}") final String host, @Value("${port}") final int port, @Value("${db}") @Nonnull final String db) throws UnknownHostException { 
     mongo = new Mongo(host, port); 
     database = db; 
    } 

.. 
} 
Смежные вопросы