1、概览 {#1概览}
在设计 Spring Boot 应用程序时,我们通常希望使用外部配置来定义 application properties。这样,我们就可以在不同的环境中使用相同的代码。在某些情况下,即使是同一个环境,我们可能希望将属性定义在多个 YAML 配置文件中。
在本教程中,我们将学习在 Spring Boot 应用中加载多个 YAML 配置文件的两种方法。
2、使用 Spring Profiles {#2使用-spring-profiles}
在应用程序中包含多个 YAML 配置文件的一种方法是使用 Spring profiles。
这种方法利用了 "Spring 自动加载与 profiles 相关联的 YAML 配置文件" 的功能。
接下来,让我们以两个 .yml
文件为例进行说明。
2.1、YAML 配置 {#21yaml-配置}
我们的第一个文件列出了 student 列表。我们将其命名为 application-students.yml
,并将其放在 ./src/main/resources
目录中:
students:
- Jane
- Michael
我们将第二个文件命名为 application-teachers.yml
,并放置在相同的 ./src/main/resources
目录中:
teachers:
- Margo
- Javier
2.2. Application {#22-application}
现在,让我们来设置我们的示例应用。我们将在应用中使用 CommandLineRunner
来查看属性加载情况:
@SpringBootApplication
public class MultipleYamlApplication implements CommandLineRunner {
@Autowired
private MultipleYamlConfiguration config;
public static void main(String[] args) {
SpringApplication springApp = new SpringApplication(MultipleYamlApplication.class);
springApp.setAdditionalProfiles("students", "teachers");
springApp.run(args);
}
public void run(String... args) throws Exception {
System.out.println("Students: " + config.getStudents());
System.out.println("Teachers: " + config.getTeachers());
}
}
在本例中,我们使用 setAdditionalProfiles()
方法以编程式附加了 Spring profile。
我们也可以在 application.yml
文件中使用 spring.profiles.include
属性:
spring:
profiles:
include:
- teachers
- students
这两种方法都可以设置 profile,在应用程序启动期间,Spring 会加载任何符合 application-{profile}.yml
模式的 YAML 配置文件。
2.3、Configuration {#23configuration}
为了完成示例,让我们创建配置类。这将从 YAML 文件中加载属性:
@Configuration
@ConfigurationProperties
public class MultipleYamlConfiguration {
List<String> teachers;
List<String> students;
// get/set 方法省略
}
运行应用程序后,让我们检查一下日志:
c.b.p.m.MultipleYamlApplication : The following 2 profiles are active: "teachers", "students"
以下是输出结果:
Students: [Jane, Michael]
Teachers: [Margo, Javier]
虽然这种方法可行,但缺点是它使用 Spring profiles 功能的方式很可能不是实现的初衷。
有鉴于此,我们来看看第二种更强大的包含多个 YAML 文件的方法。
- 使用
@PropertySources
{#3-使用-propertysources}
通过使用 @PropertySources
注解配合 @PropertySource
来加载 YAML 文件,我们可以指定多个 YAML 配置文件。
3.1、Application {#31application}
让我们再以相同的应用进行测试:
@SpringBootApplication
public class MultipleYamlApplication implements CommandLineRunner {
@Autowired
private MultipleYamlConfiguration config;
public static void main(String[] args) {
SpringApplication.run(MultipleYamlApplication.class);
}
public void run(String... args) throws Exception {
System.out.println("Students: " + config.getStudents());
System.out.println("Teachers: " + config.getTeachers());
}
}
注意,在本例中,我们并没有设置 Spring profiles。
3.2、Configuration
和 PropertySourceFactory
{#32configuration-和-propertysourcefactory}
现在,让我们来实现配置类:
@Configuration
@ConfigurationProperties
@PropertySources({
@PropertySource(value = "classpath:application-teachers.yml", factory = MultipleYamlPropertySourceFactory.class),
@PropertySource(value = "classpath:application-students.yml", factory = MultipleYamlPropertySourceFactory.class)})
public class MultipleYamlConfiguration {
List<String> teachers;
List<String> students;
// 省略 get/set 方法
}
@PropertySources
注解包含了每个我们想在应用程序中使用的 YAML 文件的 @PropertySource
注解。factory
是一个自定义的 PropertySourceFactory
,可以加载 YAML 文件。
public class MultipleYamlPropertySourceFactory 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);
}
}
运行 MultipleYamlApplication
,我们可以看到预期的输出结果如下:
Students: [Jane, Michael]
Teachers: [Margo, Javier]
4、总结 {#4总结}
在本文中,我们学习了在 Spring Boot 应用程序中加载多个 YAML 配置文件的两种方法。
原文:https://www.baeldung.com/spring-boot-load-multiple-yaml-configuration-files