Spring Util: внедрение свойств с помощью аннотаций в bean-компонент - PullRequest
30 голосов
/ 28 августа 2011

Если у меня в Spring Spring XML настроено 2 файла .properties:

<util:properties id="serverProperties" location="file:./applications/MyApplication/server.properties"/>
<util:properties id="someConfig" location="file:./applications/MyApplication/config.properties"/>

Как я могу с помощью аннотаций внедрить эти файлы свойств в bean-компонент с java.util.Properties?

Как получить определенные свойства с помощью аннотаций Spring?

ура!

Ответы [ 5 ]

46 голосов
/ 28 августа 2011
@Autowired
@Qualifier("serverProperties")
private Properties serverProperties;
@Autowired
@Qualifier("someConfig")
private Properties otherProperties;

или

@Resource(name = "serverProperties")
private Properties serverProperties;
@Resource(name = "someConfig")
private Properties otherProperties;

Как правило, @Autowired используется для автоматического подключения по типу весной, а @Resource используется для имени.@ Autowired + @ Qualifier может быть удвоен как автоматическое подключение по имени, но оно действительно предназначено для автоматического подключения по типу с возможностью точной настройки типа .

16 голосов
/ 18 марта 2013

Поскольку у этого вопроса много обращений. Я подумал, что было бы целесообразно указать на другой вариант с использованием SpEL (Spring Expression Language) - если вам нужны конкретные свойства, они могут быть введены с помощью аннотации @Value для определенных свойств бина;

class SomeClass {
   @Value("#{serverProperties['com.svr.prop']}")
   private String aServerCfgProperty;

   @Value("#{someConfig['another.config.setting']}")
   private String someOtherProperty;
}

Вам не нужно использовать синтаксис индексации ['index.val'], вы можете просто получить его напрямую;

@Value("#{someConfig}")
private Properties someConfig

@Value("#{serverProperties}")
private Properties svrProps;

Я нашел это довольно полезным и отошел от использования объекта свойств, напрямую внедренного через @ Resource / @ Autowired.

Другая хорошая причина для использования @Value с индексированным объектом Properties состоит в том, что некоторые IDE (например, IntelliJ) могут реорганизовывать фактические имена свойств, если у вас также есть файл .properties в проекте, что приятно. Другой совет - использовать что-то вроде EProperties (что расширяет собственный объект свойств Java), если вы хотите сделать включение / вложение / замену в файлах свойств без использования класса PropertiesPlaceholderConfigurer Spring (который, к сожалению, не раскрывает его свойства). - для использования индексации SpEL ['key'] компонент должен быть экземпляром Map<>, т. е. расширять карту, что делает объект свойств Java) ...

Наконец, еще одна полезная функция SpEL - это прямой доступ к свойствам бинов. Скажем, например, если SomeClass в приведенном выше примере был Spring bean, например someClass тогда в AnotherBeanClass мы могли бы иметь;

@Value("#{someClass.someOtherProperty}")
private String injectedBeanProp

Вы также можете вызвать метод получения:

@Value("#{someClass.getSomeOtherProperty()}")
private String injectedBeanProp

См. Руководство по SpEL здесь; http://static.springsource.org/spring/docs/3.1.x/spring-framework-reference/htmlsingle/spring-framework-reference.html#expressions

2 голосов
/ 01 июля 2012

Вы можете использовать @ PropertySource

@Configuration
@PropertySource(name = "someName", value = {"classpath:a.properties", "classpath:b.properties"})
public class MyConfiguration {
}
1 голос
/ 04 января 2017

XMl файл

<beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xmlns:mvc="http://www.springframework.org/schema/mvc"
 xmlns:util="http://www.springframework.org/schema/util"
 xsi:schemaLocation="
 http://www.springframework.org/schema/beans
 http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
 http://www.springframework.org/schema/context
 http://www.springframework.org/schema/context/spring-context-4.0.xsd
 http://www.springframework.org/schema/mvc
 http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
 http://www.springframework.org/schema/util 
 http://www.springframework.org/schema/util/spring-util-4.0.xsd">
    <context:component-scan base-package="com.sha.home" />
    <mvc:annotation-driven/>
    <util:properties id="dbProp" location="classpath:db.properties" />
    <!-- <context:property-placeholder location="classpath:db.properties"/> -->

</beans>

в файле Java @Value ( "# {dbProp}") Частная собственность dbProperties;

System.out.println ( "urllll" + dbProperties.getProperty ( "jdbc.url"));

0 голосов
/ 24 марта 2014

Большую часть времени я инкапсулирую все свойства в одну утилиту, которая используется в моих приложениях.Таким образом, вам не нужно беспокоиться / управлять каждым файлом свойств на уровне приложения.Autowired setProps (...) считывает все загруженные вами util: properties в список props .

import java.util.List;
import java.util.Properties;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;

@Component
public class AppProperiesProcessor {

private List<Properties> props;
private Properties mergedProperties;

@Autowired
public final void setProps(List<Properties> props) {
    this.props = props;
}

public String getProp(final String keyVal) {

    if (null == this.mergedProperties) {
        this.mergedProperties = new Properties();

        for (Properties prop : this.props) {
            this.mergedProperties.putAll(prop);
        }
    }
    return mergedProperties.getProperty(keyVal);
  } 
}
...