«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.