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