Статьи

Недвижимость с весны

1. Обзор

Из этого туториала вы узнаете, как настроить и использовать свойства в Spring — с помощью конфигурации XML или Java.

До Spring 3.1 добавление новых файлов свойств в Spring и использование значений свойств не было настолько гибким и надежным, как могло бы быть. Начиная с Spring 3.1 , новые абстракции Environment и PropertySource значительно упрощают этот процесс.

2. Регистрация свойств через пространство имен XML

Используя XML, новые файлы свойств могут быть сделаны доступными для Spring через следующий элемент пространства имен:

01
02
03
04
05
06
07
08
09
10
11
12
13
<?xml version="1.0" encoding="UTF-8"?>
   xsi:schemaLocation="
 
      <context:property-placeholder location="classpath:foo.properties" />
 
</beans>

Файл foo.properties должен быть помещен в / src / main / resources, чтобы он был доступен в пути к классам во время выполнения.

2.1. Несколько <property-placeholder>

Если в контексте Spring присутствуют несколько элементов <property-placeholder> , следует придерживаться нескольких рекомендаций:

  • атрибут порядка должен быть указан, чтобы исправить порядок, в котором они обрабатываются Spring
  • все заполнители свойств минус последний (самый высокий порядок ) должны иметь значение ignore-unresolvable = ”true”, чтобы механизм разрешения мог передавать другим в контексте без исключения

3. Регистрация свойств через аннотации Java

Spring 3.1 также представляет новую аннотацию @PropertySource как удобный механизм добавления источников свойств в среду. Эта аннотация должна использоваться вместе с конфигурацией на основе Java и аннотацией @Configuration :

1
2
3
4
5
6
7
8
9
@Configuration
@PropertySource("classpath:foo.properties")
public class PropertiesWithJavaConfig {
 
   @Bean
   public static PropertySourcesPlaceholderConfigurer propertySourcesPlaceholderConfigurer() {
      return new PropertySourcesPlaceholderConfigurer();
   }
}

В отличие от использования элемента пространства имен XML, аннотация Java @PropertySource не регистрирует PropertySourcesPlaceholderConfigurer автоматически в Spring . Вместо этого компонент должен быть явно определен в конфигурации, чтобы механизм разрешения свойств работал. Причиной этого неожиданного поведения является дизайн и задокументированы по этому вопросу .

4. Использование свойств

И старый PropertyPlaceholderConfigurer, и новый PropertySourcesPlaceholderConfigurer, добавленные в Spring 3.1, разрешают заполнители $ {…} в значениях свойств определения компонента и аннотациях @Value .

Например, чтобы добавить свойство с помощью аннотации @Value :

1
2
@Value( "${jdbc.url}" )
private String jdbcUrl;

Также можно указать значение по умолчанию для свойства :

1
2
@Value( "${jdbc.url:aDefaultUrl}" )
private String jdbcUrl;

Использование свойств в конфигурации Spring XML:

1
2
3
<bean id="dataSource">
  <property name="url" value="${jdbc.url}" />
</bean>

И, наконец, получение свойств через новые API среды:

1
2
3
4
@Autowired
private Environment env;
...
dataSource.setUrl(env.getProperty("jdbc.url"));

Здесь очень важно предостеречь о том, что использование <property-placeholder> не будет предоставлять свойства Spring Environment — это означает, что получение значения, подобного этому, не будет работать — оно вернет null :

1
env.getProperty("key.something")

4.1 Свойства Поиск Приоритет

По умолчанию в Spring 3.1 локальные свойства являются последними в поиске после всех источников свойств среды, включая файлы свойств. Это поведение может быть переопределено через свойство localOverride свойства PropertySourcesPlaceholderConfigurer , для которого можно установить значение true, чтобы локальные свойства могли переопределять свойства файла.

В Spring 3.0 и более ранних версиях старый PropertyPlaceholderConfigurer также пытался искать свойства как в источниках, определенных вручную, так и в свойствах System. Приоритет поиска также можно настраивать с помощью свойства systemPropertiesMode в конфигураторе:

  • никогда — никогда не проверяйте свойства системы
  • отступление (по умолчанию) — проверка системных свойств, если они не разрешены в указанных файлах свойств
  • override — сначала проверьте системные свойства, прежде чем пытаться указывать файлы свойств. Это позволяет системным свойствам переопределять любой другой источник свойств.

Наконец, обратите внимание, что в случае, если свойство определено в двух или более файлах, определенных с помощью @PropertySourceпоследнее определение победит и переопределит предыдущие . Это затрудняет прогнозирование точного значения свойства, поэтому, если переопределение важно, вместо него можно использовать API-интерфейс PropertySource.

5. За кулисами — конфигурация пружины

5.1. До весны 3.1

В Spring 3.1 появилась удобная опция определения источников свойств с помощью аннотаций, но до этого для этого была необходима конфигурация XML.

XML-элемент <context: property-placeholder> автоматически регистрирует новый bean-компонент PropertyPlaceholderConfigurer в контексте Spring. Для обратной совместимости это также имеет место в Spring 3.1, если схемы XSD еще не обновлены, чтобы указывать на новые версии XSD 3.1.

5.2. После весны 3.1

Начиная с Spring 3.1, XML <context: property-placeholder> больше не будет регистрировать старый PropertyPlaceholderConfigurer, а только что представленный PropertySourcesPlaceholderConfigurer . Этот замещающий класс был создан, чтобы быть более гибким и лучше взаимодействовать с недавно введенным механизмом Environment и PropertySource .

Для приложений, использующих Spring 3.1 или выше, это должно считаться стандартом.

6. Конфигурирование с использованием Raw Beans в Spring 3.0 — PropertyPlaceholderConfigurer

Помимо удобных методов получения свойств в Spring — аннотации и пространство имен XML — компонент конфигурации свойств также может быть определен и зарегистрирован вручную . Работа с PropertyPlaceholderConfigurer дает нам полный контроль над конфигурацией, а недостаток в том, чтобы быть более подробным и в большинстве случаев ненужным.

6.1. Конфигурация Java

1
2
3
4
5
6
7
8
9
@Bean
public static PropertyPlaceholderConfigurer properties(){
  PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();
  Resource[] resources = new ClassPathResource[ ]
    { new ClassPathResource( "foo.properties" ) };
  ppc.setLocations( resources );
  ppc.setIgnoreUnresolvablePlaceholders( true );
  return ppc;
}

6.2. Конфигурация XML

1
2
3
4
5
6
7
8
<bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
  <property name="locations">
    <list>
      <value>classpath:foo.properties</value>
    </list>
  </property>
  <property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>

7. Конфигурация с использованием Raw Beans в Spring 3.1 — PropertySourcesPlaceholderConfigurer

Аналогично, в Spring 3.1 новый PropertySourcesPlaceholderConfigurer также можно настроить вручную:

7.1. Конфигурация Java

01
02
03
04
05
06
07
08
09
10
@Bean
public static PropertySourcesPlaceholderConfigurer properties(){
  PropertySourcesPlaceholderConfigurer pspc =
    new PropertySourcesPlaceholderConfigurer();
  Resource[] resources = new ClassPathResource[ ]
    { new ClassPathResource( "foo.properties" ) };
  pspc.setLocations( resources );
  pspc.setIgnoreUnresolvablePlaceholders( true );
  return pspc;
}

7.2. Конфигурация XML

1
2
3
4
5
6
7
8
<bean class="org.springframework.context.support.PropertySourcesPlaceholderConfigurer">
  <property name="location">
    <list>
      <value>classpath:foo.properties</value>
    </list>
  </property>
  <property name="ignoreUnresolvablePlaceholders" value="true"/>
</bean>

8. Заключение

В этой статье показано несколько примеров работы со свойствами и файлами свойств в Spring , а также обсуждены более старые параметры Spring 3.0, а также новая поддержка свойств, представленная в Spring 3.1.

Реализацию всех примеров регистрации файлов свойств и использования значений свойств можно найти в проекте github — это проект на основе Eclipse, поэтому его легко импортировать и запускать как есть.

Ссылка: Свойства с Spring от нашего партнера JCG Евгения Параскива в блоге baeldung .