开发者学堂课程【SpringBoot快速掌握 - 核心技术:外部配置加载顺序】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/612/detail/9230
外部配置加载顺序
目录
一、外部加载配置顺序
二、外部配置方式
三、命令行参数举例
四、由jar包外向jar包内进行寻找
五、总结
一、外部加载配置顺序
Spring Boot 的另一个特点:外部配置加载顺序。也就是 Spring Boot 要写一些配置,不止可以写在应用的配置文件里 application.properties 放在内路径下,还可以从下面11个位置里加载配置,要把配置写在这些位置也是可以的,这里有列举11个,核心在红颜色标识处。详细能写在哪里在官方文档里列举。
二、外部配置方式
SpringBoot 也可以从以下位置加载配置﹔优先级从高到低﹔高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置。
1. 命令行参数
java-jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087
2. 来自 java:comp/env
的 JNDI 属性
3. Java 系统属性(System.getProperties())
4. 操作系统环境变量
5. RandomValuePropertySource 配置的 random.*属性值
由 jar 包外向 jar 包内进行寻找
优先加载带 profile
6. jar 包外部的 application-{profile}.properties 或 application.yml
(带spring.profile)配置文件
7. jar 包内部的 application-{profile}.properties 或 application.yml
(带spring.profile)配置文件
再来加载不带 profile
8. jar 包外部的 application.properties 或 application.yml
(不带spring.profile)配置文件
9. jar 包内部的 application.properties
或
application.yml
(不带 spring.profile)配置文件
10. @Configuration 注解类上的 @PropertySource
11. 通过 SpringApplication.setDefaultProperties 指定的默认属性
三、命令行参数举例
将 application.properties 应用打包,打包完成以后访问项目,关键打包时候只能识别 main、java 以及 resources 目录下的东西再打包,剩下的 src 和 config 是不能打包的。
接下来打开控制台访问 target 目录,输入java-jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar
包,如果默认执行就会找到 config 文件夹下的application.properties
,找到8082端口执行,所以以 Tomcat started on port(s): 8082 (http)
即8082端口启动,并且和 server.context-path=/boot02
形成互补配置。输入locallhost:8082/boot02/hello
访问boot02,可以看到没有问题。
但是如果想改变服务器端口号,那么得写一个配置文件才能改。在执行命令的时候,可以用命令行参数修改Spring Boot的默认配置。在 target 目录下输入
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087
回车启动,可以看到是以 Tomcat started on port(s): 8087 (http)即以8087为端口启动的。
也就是说命令行加载的是优先级别,当然里面的配置文件还配了访问名,它们同时生效8087
也就是说可以用命令行来修改 Spring Boot 里面的所有默认配置。
四、由 jar 包外向 jar 包内进行寻找
以应用打包为例,将打包好的应用复制到新建的 hello文件夹里,如果现在启动应用,因为已经打包好,这里用360浏览器打开,它只能将内路径下的文件打包,最终高优先级是server.port=8082
端口,但是整合的访问路径一起生效,所以可以看到配置文件是server.port=8082
,包括默认的也配置了 boot02 访问路径。输入 cmd 打开控制台,用 java-jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar
命令启动,启动的是8082端口并且boot02也生效。
将 application.properties 按照要求放在 jar 包外部,这里改 成 server.port=8088
端口,server.context-path=boot
,放在外部启动。输入cmd 进入控制台,输入java-jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar
,不输入任何参数启动,启动就会加载外部配置。可以看到端口是8088,那么访问路径也一定按照外部是 boot。输入locallhost:8088/boot/hello
也是可以的。
这就是优先级加载的问题,可以给各个位置比如第一个命令行参数,这是非常重要的,第二个可以从 jar 外部来加载,当然这里还分带 profile 和不带 profile。
五、总结
所有支持的配置加载来源详细就看官方文档:[参考官方文档](https:/ldocs.spring.io/spring-boot/docs/1.5.9.RELEASE/reference/htmlsingle/#boot-features-external-config)
以上就是所有配置来源,但是要记住:Spring Boot 可以从这些位置来加载配置,优先级从高到低;高优先级覆盖低优先级,所有合起来形成互补配置。