学透Spring Boot — 007. 七种配置方式及优先级
Spring Boot 提供很多种方式来加载配置,本文我们会用Tomcat的端口号作为例子,演示Spring Boot 常见的配置方式。
几种配置方式
使用默认配置
新建一个项目什么都不配置,Spring Boot会自动配置Tomcat端口号。
启动日志
TomcatWebServer : Tomcat initialized with port 8080 (http)
TODO:以后会写一篇关于如何自动配置Tomcat的文章。
通过SpringApplication类
我们可以稍微修改一下我们的启动类
@SpringBootApplication
public class JoeLabApplication {public static void main(String[] args) {SpringApplication app = new SpringApplication(JoeLabApplication.class);app.setDefaultProperties(Map.of("server.port", 9001));app.run(args);}
}
启动后,通过日志可以看到端口号已经变成9001.
TomcatWebServer : Tomcat started on port 9001 (http) with context path '/'
通过配置文件application.yaml
我们在application.yaml中配置,这也是我们比较常用的方式
server:port: 9002
重启服务,可以看到端口已经变成了9002了
TomcatWebServer : Tomcat started on port 9002 (http) with context path '/'
通过application.properties
有些开发比较习惯在属性配置文件中配置SpringBoot,也是可以的
server.port=9003
重启服务,可以看到端口号已经变成了9003
TomcatWebServer : Tomcat started on port 9003 (http) with context path '/'
通过系统环境变量
启动参数中配置环境变量,也是比较常见的一种方式
重启服务,可以看到端口号已经变成了9004
TomcatWebServer : Tomcat started on port 9004 (http) with context path '/'
通过JVM参数
我们可以配置VM参数(用-D开头)
重启服务,可以看到端口号已经变成了9005
TomcatWebServer : Tomcat started on port 9005 (http) with context path '/'
通过命令行参数
我们用java
命令启动jar时,也可以传递参数,在IDEA中我们是这么设置的
重启服务,可以看到端口号已经变成了9006
TomcatWebServer : Tomcat started on port 9006 (http) with context path '/'
配置优先级顺序
前面我们了解了几种最常用的配置方式,那如果同时配置了几种,那么那些优先级会更高呢?
我们从低到高对它们进行排序:
- 默认配置
- 通过SpringApplication类
- 通过配置文件application.yaml
- 通过配置文件application.properties
- 通过系统环境变量
- 通过JVM参数
- 通过命令行参数
也就是说命令行的参数配置是优先级是最高的,只要它配置了,Spring Boot就用它覆盖其它配置。默认配置优先级是最低的,只有其它几种都没有配置时,才会使用默认配置。
特别说明:虽然application.yaml和application.properties都可以配置,但不建议项目中同时用两种。因为有时我们忘记了优先级,导致可能遇到意想不到的问题。
profile 配置文件
除了application.properties和application.yaml这两种配置,有时后我们需要对不同的环境设置不同的配置,这时候我们要用profile来单独定制某套环境。
比如我们新增一套配置 application-dev.properties
server.port=9007
然后application.properties的配置如下
server.port=9003
spring.profiles.active=dev
重启服务,我们可以看到用的是9007,表示profile的优先级更高!
TomcatWebServer : Tomcat started on port 9007 (http) with context path '/'
JSON 格式的配置
刚才我们在环境变量中设置的是key-value结构,类似properties
我们能不能在环境变量中使用json格式呢?答案当然是可以
默认加载路径
我们都知道,SpringBoot会在resources目录下找application.properties, 这是它的默认行为。其实它还会项目根目录下的config文件夹,也是它默认的搜索路径。
我们测试一下
resources/application.properties
server.port=9003
spring.profiles.active=dev
然后在根目录下的config/application-dev.properties
server.port=9007
启动应用,发现用的是9007。这也验证了config目录也是默认的加载路径。
如果你不喜欢application.properties,你也可以修改主配置文件名。
resources/hello.properties
server.port=9003
spring.profiles.active=dev
config/hello-dev.properties
server.port=9010
不过一般没人吃饱饭了去这么干!