Рубрики
Без рубрики

Свойства с весенней и весенней загрузкой

Учебник по работе с файлами свойств и значениями свойств весной.

Автор оригинала: Eugen Paraschiv.

1. Обзор

Этот учебник покажет как настроить и использовать свойства весной через конфигурацию Java и @PropertySource.

Мы также увидим, как свойства работают в весенней загрузки.

Дальнейшее чтение:

Весеннее выражение Языка Руководство

Настройка веб-приложения Spring Boot

Путеводитель по @ConfigurationProperties в весенней загрузке

2. Зарегистрируйте файл свойств через аннотации

Весна 3.1 также вводит новый @PropertySource аннотация как удобный механизм добавления источников свойств в окружающую среду.

Мы можем использовать эту аннотацию в сочетании с @Configuration аннотация:

@Configuration
@PropertySource("classpath:foo.properties")
public class PropertiesWithJavaConfig {
    //...
}

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

@PropertySource({ 
  "classpath:persistence-${envTarget:mysql}.properties"
})
...

2.1. Определение нескольких местоположений свойств

@PropertySource аннотация повторяется в соответствии с Java 8 конвенций . Поэтому, если мы используем Java 8 или выше, мы можем использовать эту аннотацию для определения нескольких местоположений свойств:

@PropertySource("classpath:foo.properties")
@PropertySource("classpath:bar.properties")
public class PropertiesWithJavaConfig {
    //...
}

Конечно, мы также можем использовать @PropertySources аннотация и указать массив @PropertySource . Это работает в любой поддерживаемой java-версии, а не только на Java 8 или выше:

@PropertySources({
    @PropertySource("classpath:foo.properties"),
    @PropertySource("classpath:bar.properties")
})
public class PropertiesWithJavaConfig {
    //...
}

В любом случае, стоит отметить, что в случае столкновения имени свойства, последний источник чтения имеет приоритет.

3. Использование/инъекционной свойства

Инъекция свойства с @Value аннотация просто:

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

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

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

Новая НедвижимостьРесурсПлейсхолдерКонфигуратор добавлено весной 3.1 решить $ й …” placeholders в фасоли определение стоимости имущества и @Value аннотации .

Наконец, мы можем получить стоимость имущества с помощью Экологические API :

@Autowired
private Environment env;
...
dataSource.setUrl(env.getProperty("jdbc.url"));

4. Свойства с весенней загрузкой

Прежде чем перейти к более продвинутым вариантам конфигурации свойств, давайте посмотрим на поддержку новых свойств в Spring Boot.

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

4.1. application.properties: Файл свойств по умолчанию

Boot применяет свою типичную конвенцию по подходу конфигурации к файлам свойств. Это означает, что мы можем просто поставить application.properts файл в нашем src/main/resources каталог, и он будет автоматически обнаружен . Затем мы можем вводить любые загруженные свойства из него, как обычно.

Таким образом, используя этот файл по умолчанию, мы не должны явно зарегистрировать НедвижимостьИсточник или даже предоставить путь к файлу свойств.

Мы также можем настроить другой файл во время выполнения, если это необходимо, используя свойство среды:

java -jar app.jar --spring.config.location=classpath:/another-location.properties

По Весенняя загрузка 2.3 , мы также можем указать места подстановочных карт для файлов конфигурации .

Например, мы можем установить spring.config.location имущество для конфигг/К/ :

java -jar app.jar --spring.config.location=config/*/

Таким образом, Spring Boot будет искать файлы конфигурации, соответствующие конфигг/К/ шаблон каталога за пределами нашего файла банки. Это пригодится, когда у нас есть несколько источников свойств конфигурации.

С момента версии 2.4.0 , Spring Boot поддерживает использование файлов с многоформерными свойствами , аналогичным образом как ЯМЛ по замыслу:

baeldung.customProperty=defaultValue
#---
baeldung.customProperty=overriddenValue

Обратите внимание, что для файлов свойств, три тире нотации предшествует комментарий символ ( и ).

4.2. Файл свойств, специфичных для окружающей среды

Если нам нужно ориентироваться на различные среды, есть встроенный механизм для этого в Boot.

Мы можем просто определить применение-environment.properties файл в src/main/ресурсы каталог, а затем установить весенний профиль с тем же именем среды.

Например, если мы определяем «постановочную» среду, это означает, что нам придется определить постановка профиль, а затем приложения-staging.properts .

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

4.3. Файл свойств, специфичных для тестирования

У нас также может быть требование использовать различные значения свойств, когда наше приложение находится на тестировании.

Весенняя загрузка обрабатывает это для нас, глядя в нашем src/test/ресурсы каталог во время тестового запуска . Опять же, свойства по умолчанию будут по-прежнему инъекционные, как обычно, но будут переопределены этими, если есть столкновение.

4.4. Аннотация @TestPropertySource США

Если нам нужно больше гранулированного контроля над свойствами теста, то мы можем использовать @TestPropertySource аннотация.

Это позволяет нам устанавливать свойства тестирования для определенного контекста теста, преваляя над источниками свойств по умолчанию:

@RunWith(SpringRunner.class)
@TestPropertySource("/foo.properties")
public class FilePropertyInjectionUnitTest {

    @Value("${foo}")
    private String foo;

    @Test
    public void whenFilePropertyProvided_thenProperlyInjected() {
        assertThat(foo).isEqualTo("bar");
    }
}

Если мы не хотим использовать файл, мы можем указать имена и значения напрямую:

@RunWith(SpringRunner.class)
@TestPropertySource(properties = {"foo=bar"})
public class PropertyInjectionUnitTest {

    @Value("${foo}")
    private String foo;

    @Test
    public void whenPropertyProvided_thenProperlyInjected() {
        assertThat(foo).isEqualTo("bar");
    }
}

Мы также можем достичь аналогичного эффекта, используя свойства аргумент @SpringBootTest аннотация:

@RunWith(SpringRunner.class)
@SpringBootTest(
  properties = {"foo=bar"}, classes = SpringBootPropertiesTestApplication.class)
public class SpringBootPropertyInjectionIntegrationTest {

    @Value("${foo}")
    private String foo;

    @Test
    public void whenSpringBootPropertyProvided_thenProperlyInjected() {
        assertThat(foo).isEqualTo("bar");
    }
}

4.5. Иерархические свойства

Если у нас есть свойства, которые сгруппированы вместе, мы можем использовать @ConfigurationProperties аннотация, которая будет сопоставить эти иерархии свойств на графиках объектов Java.

Возьмем некоторые свойства, используемые для настройки соединения базы данных:

database.url=jdbc:postgresql:/localhost:5432/instance
database.username=foo
database.password=bar

А затем давайте использовать аннотацию, чтобы сопоставить их с объектом базы данных:

@ConfigurationProperties(prefix = "database")
public class Database {
    String url;
    String username;
    String password;

    // standard getters and setters
}

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

Если вы хотите глубже углубиться в свойства конфигурации, взгляните на нашу углубленную статью.

4.6. Альтернатива: Файлы YAML

Spring также поддерживает файлы YAML.

Все те же правила именования применяются для файлов свойств, специфичных для тестирования, среды и по умолчанию. Разница лишь в расширении файла и зависимости от ЗмеяЯМЛ библиотека находясь на нашем classpath.

YAML особенно хорош для иерархического хранения имущества ; следующий файл свойства:

database.url=jdbc:postgresql:/localhost:5432/instance
database.username=foo
database.password=bar
secret: foo

является синонимом следующего файла YAML:

database:
  url: jdbc:postgresql:/localhost:5432/instance
  username: foo
  password: bar
secret: foo

Стоит также отметить, что файлы YAML не поддерживают @PropertySource аннотация, так что если нам нужно использовать эту аннотацию, это ограничит нас в использовании файла свойств.

Другим примечательным моментом является то, что в версии 2.4.0 Весенняя загрузка изменила способ загрузки свойств из много документов файлов YAML. Ранее порядок их добавления основывался на заказе активации профиля. Однако с новой версией эта структура следует тем же правилам заказа, которые мы указали ранее для .свойства файлы; свойства, объявленные ниже в файле, просто переопределит те, которые выше.

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

4.7. Импорт дополнительных файлов конфигурации

До версии 2.4.0, Весенняя загрузка позволила включить дополнительные файлы конфигурации с spring.config.location и spring.config.additional-location свойства, но они имели определенные ограничения. Например, они должны быть определены перед запуском приложения (как свойства среды или системы или с использованием аргументов командной строки), поскольку они использовались на ранних стадиях процесса.

В упомянутой версии мы можем использовать spring.config.import недвижимость в пределах application.properts или application.yml файл, чтобы легко включить дополнительные файлы. Это свойство поддерживает некоторые интересные функции:

  • добавление нескольких файлов или каталогов
  • файлы могут быть загружены либо из classpath или из внешнего каталога
  • с указанием, если процесс запуска должен выйти из строя, если файл не найден, или если это необязательный файл
  • импорт безлинных файлов

Рассмотрим действительный пример:

spring.config.import=classpath:additional-application.properties,
  classpath:additional-application[.yml],
  optional:file:./external.properties,
  classpath:additional-application-properties/

Примечание: здесь мы отформатированы это свойство с помощью линии перерывов только для ясности.

Весна будет рассматривать импорт как новый документ, вставленный непосредственно под декларацию об импорте.

4.8. Свойства из аргументов командной строки

Помимо использования файлов, мы можем передавать свойства непосредственно на командной строке:

java -jar app.jar --property="value"

Мы также можем сделать это с помощью системных свойств, которые предоставляются до команды, а не после нее:

java -Dproperty.name="value" -jar app.jar

4.9. Свойства переменных среды

Весенняя загрузка также будет обнаруживать переменные среды, рассматривая их как свойства:

export name=value
java -jar app.jar

4.10. Рандомизация стоимости недвижимости

Если нам не нужны значения свойств детерминантов, мы можем использовать RandomValuePropertyИсточник рандомизировать значения свойств:

random.number=${random.int}
random.long=${random.long}
random.uuid=${random.uuid}

4.11. Дополнительные типы источников недвижимости

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

5. Конфигурация с использованием сырых бобов – PropertySourcesPlaceholderConfigurer

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

Работа с НедвижимостьРесурсПлейсхолдерКонфигуратор дает нам полный контроль над конфигурацией, с недостатком быть более многословным и большую часть времени, ненужным.

Давайте посмотрим, как мы можем определить эту фасоль с помощью конфигурации Java:

@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;
}

6. Свойства в контексте родителей и детей

Этот вопрос возникает снова и снова: что происходит, когда наши веб-приложение имеет родительский и детский контекст ? Родительский контекст может иметь некоторые общие основные функции и бобы, а затем один (или несколько) детских контекстов, может быть, содержащие сервлет конкретных бобов.

В этом случае, как лучше всего определить файлы свойств и включить их в эти контексты? И как лучше всего получить эти свойства от весны?

Мы дадим простой разбивки.

Если файл определяется в родительском контексте :

  • @Value работает в Детский контекст : ДА
  • @Value работает в Родительский контекст : ДА
  • environment.getProperty в Детский контекст : ДА
  • environment.getProperty в Родительский контекст : ДА

Если файл определяется в контексте ребенка :

  • @Value работает в Детский контекст : ДА
  • @Value работает в Родительский контекст : НЕТ
  • environment.getProperty в Детский контекст : ДА
  • environment.getProperty в Родительский контекст : НЕТ

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

Эта статья показала несколько примеров работы с файлами свойств и свойств весной.

Как всегда, весь код, поддерживающий статью, доступен более на GitHub .