Перейти к основному содержимому

@PropertySource с файлами YAML в Spring Boot

· 2 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Обзор

В этом кратком руководстве мы покажем, как читать файл свойств YAML с помощью аннотации @PropertySource в Spring Boot.

2. @PropertySource и формат YAML

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

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

Итак, если мы хотим использовать аннотацию @PropertySource в нашем приложении, нам нужно придерживаться стандартных файлов свойств . Или мы можем реализовать недостающую часть головоломки сами! ****

3. Custom PropertySourceFactory

Начиная с Spring 4.3, @PropertySource поставляется с атрибутом factory . Мы можем использовать его, чтобы предоставить собственную реализацию PropertySourceFactory , которая будет обрабатывать файлы YAML .

Это проще, чем кажется! Давайте посмотрим, как это сделать:

public class YamlPropertySourceFactory implements PropertySourceFactory {

@Override
public PropertySource<?> createPropertySource(String name, EncodedResource encodedResource)
throws IOException {
YamlPropertiesFactoryBean factory = new YamlPropertiesFactoryBean();
factory.setResources(encodedResource.getResource());

Properties properties = factory.getObject();

return new PropertiesPropertySource(encodedResource.getResource().getFilename(), properties);
}
}

Как видим, достаточно реализовать единственный метод createPropertySource .

В нашей пользовательской реализации сначала мы использовали YamlPropertiesFactoryBean для преобразования ресурсов в формате YAML в `` объект java.util.Properties . ****

Затем мы просто вернули новый экземпляр PropertiesPropertySource , который является оболочкой, позволяющей Spring читать проанализированные свойства.

4. @PropertySource и YAML в действии

Давайте теперь соберем все части вместе и посмотрим, как использовать их на практике.

Во-первых, давайте создадим простой файл YAML — foo.yml :

yaml:
name: foo
aliases:
- abc
- xyz

Затем давайте создадим класс свойств с @ConfigurationProperties и используем нашу пользовательскую фабрику YamlPropertySourceFactory:

@Configuration
@ConfigurationProperties(prefix = "yaml")
@PropertySource(value = "classpath:foo.yml", factory = YamlPropertySourceFactory.class)
public class YamlFooProperties {

private String name;

private List<String> aliases;

// standard getter and setters
}

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

@RunWith(SpringRunner.class)
@SpringBootTest
public class YamlFooPropertiesIntegrationTest {

@Autowired
private YamlFooProperties yamlFooProperties;

@Test
public void whenFactoryProvidedThenYamlPropertiesInjected() {
assertThat(yamlFooProperties.getName()).isEqualTo("foo");
assertThat(yamlFooProperties.getAliases()).containsExactly("abc", "xyz");
}
}

5. Вывод

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

Следовательно, мы смогли успешно загрузить файл свойств YAML в наше приложение Spring Boot .

Как обычно, все примеры кода доступны на GitHub .