在 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、ConfigurationPropertySourceFactory

现在,让我们来实现配置类:

@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