Spring Boot加载多个YAML配置文件

2023/05/12

1. 概述

在设计Spring Boot应用程序时,我们通常希望使用外部配置来定义我们的应用程序属性。这让我们可以在不同的环境中使用相同的代码。在某些情况下,我们可能希望跨多个YAML配置文件定义我们的属性,即使对于同一环境也是如此。

在本教程中,我们将学习两种在Spring Boot应用程序中加载多个YAML配置文件的方法

2. 使用Spring Profile

在应用程序中包含多个YAML配置文件的一种方法是使用Spring Profile

这种方法利用了Spring自动加载与应用程序配置文件关联的YAML配置文件的优势。

接下来,我们来看一个包含两个.yml文件的示例。

2.1 YAML设置

我们的第一个文件列出了学生。我们将其命名为application-students.yml并将其放在我们的./src/main/resources目录中:

students:
    - Jane
    - Michael

让我们将第二个文件命名为application-teachers.yml并放在同一个./src/main/resources目录中:

teachers:
    - Margo
    - Javier

2.2 应用程序

现在,让我们设置示例应用程序。我们将在应用程序中使用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

这两种方法都可以设置配置文件,并且在应用程序启动期间,Spring会按照模式application-{profile}.yml加载任何YAML配置文件。

2.3 配置

为了完成我们的示例,让我们创建我们的配置类。这将从YAML文件加载属性:

@Configuration
@ConfigurationProperties
public class MultipleYamlConfiguration {

    List<String> teachers;
    List<String> students;

    // standard setters and getters
}

让我们在运行我们的应用程序后检查日志:

c.t.t.p.m.MultipleYamlApplication : The following 2 profiles are active: "teachers", "students"

这是输出:

Students: [Jane, Michael]
Teachers: [Margo, Javier]

虽然此方法有效,但缺点是它以一种很可能不是实现意图的方式使用Spring Profile功能

鉴于此,让我们看一下包含多个YAML文件的第二种更强大的方法。

3. 使用@PropertySources

我们可以通过@PropertySources注解结合使用@PropertySource加载YAML来指定多个YAML配置文件。

3.1 应用程序

@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 Profile

3.2 配置和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;

    // standard setters and getters
}

@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配置文件的两种可能方法。

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

Show Disqus Comments

Post Directory

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