1. Overview
1.概述
In this quick tutorial, we’ll show how to read a YAML properties file using the @PropertySource annotation in Spring Boot.
在这个快速教程中,我们将展示如何使用Spring Boot中的@PropertySource注释来读取YAML属性文件。
2. @PropertySource and YAML Format
2.@PropertySource和YAML格式
Spring Boot has great support for externalized configuration. Also, it’s possible to use different ways and formats to read the properties in the Spring Boot application out-of-the-box.
Spring Boot对外部化配置有很大支持。此外,还可以使用不同的方式和格式来读取Spring Boot应用程序中开箱即用的属性。
However, by default, @PropertySource doesn’t load YAML files. This fact is explicitly mentioned in the official documentation.
然而,默认情况下,@PropertySource不会加载YAML文件。这一事实在官方文档中被明确提及。。
So, if we want to use the @PropertySource annotation in our application, we need to stick with the standard properties files. Or we can implement the missing puzzle piece ourselves!
因此,如果我们想在我们的应用程序中使用@PropertySource注释,我们需要坚持使用标准properties文件。或者我们可以自己实现缺少的那块拼图!。
3. Custom PropertySourceFactory
3.自定义PropertySourceFactory
As of Spring 4.3, @PropertySource comes with the factory attribute. We can make use of it to provide our custom implementation of the PropertySourceFactory, which will handle the YAML file processing.
从Spring 4.3开始,@PropertySource自带factory属性。我们可以利用它来提供我们对PropertySourceFactory的自定义实现,它将处理YAML文件的处理。
This is easier than it sounds! Let’s see how to do this:
这比听起来要容易得多!让我们看看如何做到这一点:
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);
}
}
As we can see, it’s enough to implement a single createPropertySource method.
正如我们所看到的,实现一个单一的createPropertySource方法即可。
In our custom implementation, first, we used the YamlPropertiesFactoryBean to convert the resources in YAML format to the java.util.Properties object.
在我们的自定义实现中,首先,我们使用了YamlPropertiesFactoryBean 将YAML格式的资源转换成java.util.Properties对象。
Then, we simply returned a new instance of the PropertiesPropertySource, which is a wrapper that allows Spring to read the parsed properties.
然后,我们简单地返回了一个新的PropertiesPropertySource的实例,它是一个包装器,允许Spring读取解析的属性。。
4. @PropertySource and YAML in Action
4.@PropertySource和YAML的作用
Let’s now put all the pieces together and see how to use them in practice.
现在让我们把所有的碎片放在一起,看看如何在实践中使用它们。
First, let’s create a simple YAML file – foo.yml:
首先,让我们创建一个简单的YAML文件 – foo.yml。
yaml:
name: foo
aliases:
- abc
- xyz
Next, let’s create a properties class with @ConfigurationProperties and use our custom YamlPropertySourceFactory:
接下来,让我们用@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
}
And finally, let’s verify that the properties are properly injected:
最后,让我们验证一下属性是否被正确注入。
@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. Conclusion
5.总结
To sum up, in this quick tutorial, we first showed how easy it is to create a custom PropertySourceFactory. After that, we presented how to pass this custom implementation to the @PropertySource using its factory attribute.
总之,在这个快速教程中,我们首先展示了创建一个自定义的PropertySourceFactory是多么简单。之后,我们介绍了如何使用其@PropertySource属性将这个自定义实现传递给。
Consequently, we were able to successfully load the YAML properties file into our Spring Boot application.
因此,我们能够成功地将YAML属性文件加载到我们的Spring Boot应用程序中。
As usual, all the code examples are available over on GitHub.
像往常一样,所有的代码实例都可以在GitHub上找到。