Как ввести полный файл свойств в ягодах - PullRequest
10 голосов
/ 09 мая 2011

У меня есть файл свойств с большим количеством значений, и я не хочу перечислять их в моем файле конфигурации бина отдельно. E.g.:

<property name="foo">
    <value>${foo}</value>
</property>
<property name="bar">
    <value>${bar}</value>
</property>

и т. Д.

Я полагаю, что вводить все полностью как java.util.Properties или меньше как java.util.Map. Есть ли способ сделать это?

Ответы [ 5 ]

16 голосов
/ 02 июля 2015

Для конфигурации Java вы можете использовать что-то вроде этого:

@Autowired @Qualifier("myProperties")
private Properties myProps;

@Bean(name="myProperties")
public Properties getMyProperties() throws IOException {
    return PropertiesLoaderUtils.loadProperties(
        new ClassPathResource("/myProperties.properties"));
}

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

14 голосов
/ 09 мая 2011

Да, вы можете использовать <util:properties> для загрузки файла свойств и объявления результирующего объекта java.util.Properties как компонента. Затем вы можете ввести это, как и любое другое свойство бина.

См. раздел C.2.2.3 руководства Spring и их пример:

<util:properties id="myProps" location="classpath:com/foo/jdbc-production.properties"

Не забудьте объявить пространство имен util: согласно этим инструкциям .

11 голосов
/ 04 марта 2013

Для Java Config используйте PropertiesFactoryBean:

@Bean
public Properties myProperties() {
    PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
    propertiesFactoryBean.setLocation(new ClassPathResource("/myProperties.properties"));
    Properties properties = null;
    try {
        propertiesFactoryBean.afterPropertiesSet();
        properties = propertiesFactoryBean.getObject();

    } catch (IOException e) {
        log.warn("Cannot load properties file.");
    }
    return properties;
}

А затем установите свойства объекта:

@Bean
public AnotherBean myBean() {
    AnotherBean myBean = new AnotherBean();
    ...

    myBean.setProperties(myProperties());

    ...
}

Надеюсь, это поможет тем, кто интересуется способом Java Config.

2 голосов
/ 09 мая 2011

Это возможно с механизмом PropertyOverrideConfigurer:

<context:property-override location="classpath:override.properties"/>

Файл свойств:

beanname1.foo=foovalue
beanname2.bar.baz=bazvalue

Механизм объясняется в разделе 3.8.2.2 Пример: PropertyOverrideConfigurer

0 голосов
/ 15 февраля 2019

Это эхо ответа @ skaffman в этом вопросе SO.Я добавляю больше деталей, чтобы помочь другим и себе, когда я пытаюсь решить эту проблему в будущем.

Существует три способа внедрить файл свойств

Метод 1

<bean id="myProps" class="org.springframework.beans.factory.config.PropertiesFactoryBean">
    <property name="locations">
        <list>
            <value>classpath:com/foo/jdbc-production.properties</value>
        </list>
    </property>
</bean>

Ссылка ( ссылка )

Метод 2

<?xml version="1.0" encoding="UTF-8"?>
<beans
    ...
    xmlns:util="http://www.springframework.org/schema/util"
    xsi:schemaLocation="...
    ...
    http://www.springframework.org/schema/util/spring-util.xsd"/>
    <util:properties id="myProps" location="classpath:com/foo/jdbc-production.properties"/>

Ссылка ( ссылка )

Метод 3

<bean id="propertyConfigurer"
    class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
    <property name="location" value="classpath:com/foo/jdbc-production.properties" />
</bean>

Ссылка ( ссылка )

По сути, все методы могут создавать бин Properties из файла свойств.Вы можете даже напрямую ввести значение из файла свойств, используя @Value injector

@Value("#{myProps[myPropName]}")
private String myField; 
...