51工具盒子

依楼听风雨
笑看云卷云舒,淡观潮起潮落

在 Spring Boot 中加载多个 YAML 配置文件

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 文件的方法。

  1. 使用 @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、ConfigurationPropertySourceFactory {#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

赞(1)
未经允许不得转载:工具盒子 » 在 Spring Boot 中加载多个 YAML 配置文件