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 .