在Spring Boot中使用YAML文件和@PropertySource

2023/05/12

1. 概述

在本快速教程中,我们将展示如何在Spring Boot中使用@PropertySource注解读取YAML属性文件。

2. @PropertySource和YAML格式

Spring Boot对外部化配置有很好的支持,此外,可以使用不同的方式和格式来读取开箱即用的Spring Boot应用程序中的属性。

但是,默认情况下,@PropertySource不会加载YAML文件官方文档中明确提到了这一事实。

因此,如果我们想在我们的应用程序中使用@PropertySource注解,我们需要坚持使用标准的properties文件,或者我们可以自己实现缺失的拼图

3. 自定义PropertySourceFactory

从Spring 4.3开始,@PropertySource带有factory属性,我们可以利用它来提供我们自定义的PropertySourceFactory实现,该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是多么容易;之后,我们介绍了如何使用其factory属性将此自定义实现传递给@PropertySource。

因此,我们能够成功地将YAML属性文件加载到我们的Spring Boot应用程序中。

与往常一样,本教程的完整源代码可在GitHub上获得。

Show Disqus Comments

Post Directory

扫码关注公众号:Taketoday
发送 290992
即可立即永久解锁本站全部文章