在 Spring Boot 中加载多个 YAML 配置文件
1、概览
在设计 Spring Boot 应用程序时,我们通常希望使用外部配置来定义 application properties。这样,我们就可以在不同的环境中使用相同的代码。在某些情况下,即使是同一个环境,我们可能希望将属性定义在多个 YAML 配置文件中。
在本教程中,我们将学习在 Spring Boot 应用中加载多个 YAML 配置文件的两种方法。
2、使用 Spring Profiles
在应用程序中包含多个 YAML 配置文件的一种方法是使用 Spring profiles。
这种方法利用了 “Spring 自动加载与 profiles 相关联的 YAML 配置文件” 的功能。
接下来,让我们以两个 .yml
文件为例进行说明。
2.1、YAML 配置
我们的第一个文件列出了 student 列表。我们将其命名为 application-students.yml
,并将其放在 ./src/main/resources
目录中:
students:
- Jane
- Michael
我们将第二个文件命名为 application-teachers.yml
,并放置在相同的 ./src/main/resources
目录中:
teachers:
- Margo
- Javier
2.2. 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
为了完成示例,让我们创建配置类。这将从 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 文件的方法。
3. 使用 @PropertySources
通过使用 @PropertySources
注解配合 @PropertySource
来加载 YAML 文件,我们可以指定多个 YAML 配置文件。
3.1、Application
让我们再以相同的应用进行测试:
@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
现在,让我们来实现配置类:
@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、总结
在本文中,我们学习了在 Spring Boot 应用程序中加载多个 YAML 配置文件的两种方法。
原文:https://www.baeldung.com/spring-boot-load-multiple-yaml-configuration-files