Spring Boot | 配置文件

Spring Boot | 配置文件,第1张

创建 Spring Boot 项目默认会在 src/main/resources 目录下生成一个全局配置文件 application.properties 。全局配置文件的作用是对一些默认配置进行修改。

Spring Boot 的参数配置除了使用 properties 文件之外,还可以使用 yml 文件。如果你喜欢用 yml 格式的配置文件可以将 application.properties 修改为 application.yml 。

Spring Boot 应用程序有多种设置途径。Spring Boot 能从多种属性源获得属性,包括如下几处:

这个列表按照优先级排序,也就是说,任何在高优先级属性源里设置的属性都会覆盖低优先级属性源里设置的相同属性。例如,命令行参数会覆盖其它属性源里的属性。

application.properties 和 application.yml 文件能放下如下四个位置:

同样,这个列表也是按照优先级排序。也就是说,/config 子目录里 application.properties 会覆盖应用程序 classpath 里的 application.properties 中的相同属性。

springboot 本身支持多种灵活的配置方式,为开发 springboot 程序带来了很大的灵活性和扩展性,但是同时由于太灵活,经常会导致明明配置了相关属性,却没有生效。

本文总结了 springboot 配置文件的原理以及多个配置文件生效的顺序。

springboot 配置文件支持灵活的路径,以及灵活的文件名,用一个变量表达式总结如下:

部分源码如下:

当满足上述变量表达式的配置文件有多个时,会有一个配置的优先级。假设

上面每个条件组合起来,则最多有配置文件如下,且顺序从上到下:

获取属性时,按从上到下的顺序遍历由上述文件生成的属性资源对象 PropertySource ,如果遇到匹配的key直接返回。

总结一下:就是如果同一个key的属性只出现一次,则直接取该值即可。如果同一个key的属性出现多次,则取顺序靠前的属性资源对象。另外其中每个文件都是可选的。

需要注意的一点是:如果在同一个 location 下配置了多个文件名一样的文件,则只会取一个,比如在 classpath:/ ,有如下两个文件 application.yml :

则只会根据 classloader 的 classpath 列表,选取第一个出现的文件。因为 springboot 加载配置文件时最底层是使用的下面的方法:

这两个方法只会获取 classloader 类的 ucp 属性里面第一个匹配到的值。如果对 springboot 自身的机制不满意,想获取所有的classpath:/路径下面的 applicaiton.yml 文件,可以使用下面的方法:

本文总结了 springboot 配置文件的原理以及多个配置文件生效的顺序。如果存在增加了配置文件或者在配置文件里面增加了属性却没有生效,可以参考上面的 springboot 配置文件表达式和配置文件生效顺序进行排查。

后面还会有一篇文章讨论基于 springboot 配置原理如何实现自定义的配置读取方式。

快速学会和掌握 SpringBoot 的 核心配置文件的使用。

SpringBoot 提供了丰富的 外部配置 ,常见的有:

其中核心配置文件我们并不陌生,主要以Key-Value的形式进行配置,其中属性Key主要分为两种:

在 application.properties 添加配置如下:

① 添加数据源信息

在 application.propertis 添加配置如下:

① 添加认证信息,其中 socks.indentity.* 是自定义的属性前缀。

② 添加随机值,其中spring.test.* 是自定义的属性前缀。

使用方法: @ConfigurationProperties(prefix = "spring.datasource")

使用说明:提供 Setter方法 和 标记组件 Component

如何验证是否成功读取配置?答:这里可以简单做个验证,注入 MyDataSource ,使用 Debug 模式可以看到如下信息:

使用方法: @Value("spring.datasource.*")

使用说明:提供 Setter方法 和 标记组件 Component

注意事项:@Value不支持注入静态变量,可间接通过Setter注入来实现。

关于两者的简单功能对比:

显然,前者支持松绑定的特性更强大,所以在实际开发中建议使用@ConfigurationProperties来读取自定义属性。

SpringBoot 默认会加载这些路径加载核心配置文件,按优先级从高到低进行排列:具体规则详见 ConfigFileApplicationListener

如果存在多个配置文件,则严格按照优先级进行覆盖,最高者胜出:

举个简单的例子,例如再上述位置都有一个application.properties ,并且每个文件都写入了server.port=xx (xx分别是9001,9002,9003,9004),在启动成功之后,最终应用的端口为:9004。图例:

如果想修改默认的加载路径 或者 调改默认的配置文件名,我们可以借助命令行参数进行指定,例如:

YAML是JSON的一个超集,是一种可轻松定义层次结构的数据格式。

答: 因为配置文件这东西,结构化越早接触越规范越好。这里推荐阅读阮一峰老师写的 YAML语言教程 ,写的很简单明了。

引入依赖: 在POM文件引入 snakeyaml 的依赖。

使用说明: 直接在类路径添加 application.yml 即可。

例如下面这两段配置是完全等价的:

① 在 application.yml 配置数据源:

② 在 application.properties 配置数据源:

在项目的实际开发中,我们往往需要根据不同的环境来加载不同的配置文件。例如生产环境,测试环境和开发环境等。此时,我们可以借助 Profiles 来指定加载哪些配置文件。例如:

温馨提示:如果spring.profiles.active指定了多个配置文件,则按顺序加载,其中最后的优先级最高,也就是最后的会覆盖前者。

使用方法:

使用Maven插件打包好项目,然后在当前路径,执行DOS命令: java -jar demo.jar --server.port=8081 ,在控制台可看到应用端口变成了8081。

实现原理:

默认情况下,SpringBoot会将这些命令行参数转化成一个 Property ,并将其添加到 Environment 上下文。

温馨提示:

由于命令行参数优先级非常之高,基本高于所有常见的外部配置,所以使用的时候要谨慎。详见 PropertySource 执行顺序 。

关闭方法:

如果想禁用命令行属性,可以设置如下 *** 作:springApplication.setAddCommandLineProperties(false)


欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/yw/8132281.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-13
下一篇2023-04-13

发表评论

登录后才能评论

评论列表(0条)

    保存