当前位置: 代码网 > it编程>编程语言>Java > SpringBoot引入额外的YAML配置文件的代码实现

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

2024年09月23日 Java 我要评论
背景在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文件的资料请关注代码网其它相关文章!

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com