SpringBoot引入额外的YAML配置文件的代码实现

 更新时间:2024年09月23日 16:18:49   作者:Season-0209  
在SpringBoot项目中,有时需要引入除application.yml之外的配置文件(例如在开发公共组件时),使用@PropertySource注解可以实现这一需求,但有一些细节点需要注意,在此记录,感兴趣的小伙伴跟着小编一起来看看吧

背景

在SpringBoot项目中,有时需要引入除application.yml之外的配置文件(例如在开发公共组件时)。使用@PropertySource注解可以实现这一需求,但有一些细节点需要注意,在此记录。

代码实现

假设有一份名为extra.yml的配置文件:

# extra.yml
extra:
  name: 张三
  order: 3

对应的配置bean为:

@Data
@ConfigurationProperties("extra")
public class ExtraProperties {

    private String name;

    private Integer order;
}

在配置类上添加相关注解,将extra.yml配置文件添加到Spring环境中:

@Configuration
@EnableConfigurationProperties(ExtraProperties.class)
@PropertySource(
        // 配置文件路径
        value = "classpath:/extra.yml",
        // 当配置文件不存在时,是忽略还是报错
        ignoreResourceNotFound = true,
        // 配置文件编码
        encoding = "UTF-8",
        // 配置文件加载工厂
        factory = YamlPropertySourceFactory.class)
public class ExtraConfig {
}

由于@PropertySource默认支持的是.properties格式的配置文件,而我们一般使用的是YAML格式的,因此这里自定义了配置文件加载工厂,支持YAML,并解决ignoreResourceNotFound不生效的问题:

/**
 * YAML配置文件加载工厂
 */
public class YamlPropertySourceFactory implements PropertySourceFactory {

    @Override
    public PropertySource<?> createPropertySource(String name, EncodedResource resource) throws IOException {
        try {
            return new YamlPropertySourceLoader()
                    .load(resource.getResource().getFilename(), resource.getResource())
                    .get(0);
        } catch (IllegalStateException e) {
            // 如果YAML配置文件不存在,希望能忽略该文件,而不是引发异常导致Spring容器启动失败
            // 需要往外抛FileNotFoundException,Spring捕捉到后会忽略该异常(当 ignoreResourceNotFound = true 时)
            if (e.getCause() instanceof FileNotFoundException) {
                throw (FileNotFoundException) e.getCause();
            } else {
                throw e;
            }
        }
    }
}

这样,ExtraProperties配置bean里的属性值, 就与extra.yml里的配置值绑定在一起了。

补充说明

标准配置文件application.yml的生效优先级高于额外引入的配置文件。如果application.yml中指定了相同的配置项,则它会覆盖extra.yml中对应的配置项:

# application.yml,会覆盖extra.yml中的相同配置项
extra:
  name: 李四
  order: 4

当然,如果使用了环境配置文件application-{profile}.yml,则它的生效优先级又会高于application.yml。

另外,@PropertySource支持引入多个配置文件。例如,在引入extra.yml的同时,引入对应的环境配置文件extra-{profile}.yml:

@Configuration
@EnableConfigurationProperties(ExtraProperties.class)
@PropertySource(
        value = {"classpath:/extra.yml", "classpath:/extra-${spring.profiles.active}.yml"},
        ignoreResourceNotFound = true,
        encoding = "UTF-8",
        // 配置文件加载工厂
        factory = YamlPropertySourceFactory.class)
public class ExtraConfig {
}

这里,Spring会将占位符${spring.profiles.active}解析为对应的值。例如,在application.yml中指定spring.profiles.active=dev,那么配置文件extra-dev.yml会被引入(如有),它的生效优先级高于extra.yml,但低于application.yml。

# extra-dev.yml,会覆盖extra.yml中的相同配置项
extra:
  name: 王五
  order: 5

总结

  • @PropertySource用于引入额外的配置文件。
  • 通过自定义配置文件加载工厂,可支持YAML文件解析,并支持ignoreResourceNotFound。
  • 配置文件生效的优先级顺序为:application-{profile}.yml>application.yml>extra-{profile}.yml>extra.yml。

以上就是SpringBoot引入额外的YAML配置文件的代码实现的详细内容,更多关于SpringBoot引入额外YAML文件的资料请关注脚本之家其它相关文章!

相关文章

  • 利用MyBatis-Plus灵活处理JSON字段的技巧与最佳实践

    利用MyBatis-Plus灵活处理JSON字段的技巧与最佳实践

    这篇文章主要给大家介绍了关于利用MyBatis-Plus灵活处理JSON字段的技巧与最佳实践,Mybatis-Plus可以很方便地处理JSON字段,在实体类中可以使用@JSONField注解来标记JSON字段,需要的朋友可以参考下
    2024-07-07
  • Java实现计算器的代码

    Java实现计算器的代码

    这篇文章主要为大家介绍了Java实现计算器的详细代码,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-06-06
  • spring缓存cache的使用详解

    spring缓存cache的使用详解

    这篇文章主要介绍了spring缓存cache的使用详解,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-10-10
  • nacos在mac上部署提示找不到或无法加载主类的解决

    nacos在mac上部署提示找不到或无法加载主类的解决

    这篇文章主要介绍了nacos在mac上部署提示找不到或无法加载主类的解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2024-06-06
  • Spring Boot 配置和使用多线程池的实现

    Spring Boot 配置和使用多线程池的实现

    这篇文章主要介绍了Spring Boot 配置和使用多线程池的实现,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2018-06-06
  • Java时间类Date类和Calendar类的使用详解

    Java时间类Date类和Calendar类的使用详解

    这篇文章主要介绍了Java时间类Date类和Calendar类的使用详解,需要的朋友可以参考下
    2017-08-08
  • IDEA感觉不香了AI智能编程工具Cursor使用图文教程

    IDEA感觉不香了AI智能编程工具Cursor使用图文教程

    这篇文章主要介绍了IDEA感觉不香了AI智能编程工具Cursor使用,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2023-05-05
  • Nacos源码之注册中心的实现详解

    Nacos源码之注册中心的实现详解

    这篇文章主要为大家介绍了Nacos源码之注册中心的实现详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-02-02
  • Spring Cloud Stream实现数据流处理

    Spring Cloud Stream实现数据流处理

    Spring Cloud Stream的核心是Stream,准确来讲Spring Cloud Stream提供了一整套数据流走向(流向)的API, 它的最终目的是使我们不关心数据的流入和写出,而只关心对数据的业务处理,本文给大家介绍了Spring Cloud Stream实现数据流处理,需要的朋友可以参考下
    2024-11-11
  • Springboot拦截器如何获取@RequestBody参数

    Springboot拦截器如何获取@RequestBody参数

    这篇文章主要介绍了Springboot拦截器如何获取@RequestBody参数的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2021-06-06

最新评论