学透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 '/'

配置优先级顺序

前面我们了解了几种最常用的配置方式,那如果同时配置了几种,那么那些优先级会更高呢?
我们从低到高对它们进行排序:

  1. 默认配置
  2. 通过SpringApplication类
  3. 通过配置文件application.yaml
  4. 通过配置文件application.properties
  5. 通过系统环境变量
  6. 通过JVM参数
  7. 通过命令行参数

也就是说命令行的参数配置是优先级是最高的,只要它配置了,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

不过一般没人吃饱饭了去这么干!

Spring Boot 中,`spring.config.import`、`spring.config.additional-location` 和 `spring.config.location` 是用于加载外部配置文件的关键属性,它们的优先级和加载顺序如下: - `spring.config.import`:优先级最低,用于导入额外的配置文件,这些文件通常存储在类路径(classpath)或其他远程位置(如 Config Server)中。它主要用于扩展配置,而不是覆盖已有配置。 - `spring.config.additional-location`:优先级中等,用于添加额外的配置文件位置,这些位置中的配置文件会与默认位置中的配置合并。 - `spring.config.location`:优先级最高,用于指定配置文件的主加载位置,会覆盖默认路径中的同名配置文件[^1]。 此外,Spring Boot 在加载配置时,会按照以下顺序进行: 1. 从 `spring.config.import` 指定的位置加载配置文件。 2. 从 `spring.config.additional-location` 指定的位置加载配置文件。 3. 从 `spring.config.location` 指定的位置加载配置文件。 这意味着 `spring.config.location` 中的配置会覆盖 `spring.config.additional-location` 和 `spring.config.import` 中的相同属性,而 `spring.config.additional-location` 中的配置又会覆盖 `spring.config.import` 中的配置。 ### 与资源(resource)加载机制的对比 在 Spring Boot 中,资源加载机制通常指的是通过 `ResourceLoader` 或 `Resource` 接口来加载配置文件或静态资源。这种机制并不直接影响配置属性的优先级,而是决定了文件的查找路径和加载方式。例如: - 类路径资源(`classpath:`):用于加载打包在 JAR 文件或类路径下的配置文件。 - 文件系统资源(`file:`):用于加载本地文件系统中的配置文件。 - URL 资源(`http:`、`ftp:` 等):用于加载远程服务器上的配置文件。 这些资源加载方式通常与 `spring.config.location` 或 `spring.config.import` 一起使用,以指定配置文件的来源。例如,`spring.config.import` 可以指向一个远程的 `http://example.com/config.yaml`,此时 Spring Boot 会通过 URL 资源加载机制获取该配置文件[^1]。 ### 总结优先级关系 从优先级角度来看,`spring.config.location` 指定的配置具有最高优先级,其次是 `spring.config.additional-location`,最后是 `spring.config.import`。这种优先级机制确保了配置的灵活性和可覆盖性,允许开发者通过不同方式管理配置文件。 ### 示例代码 以下是一个典型的 `application.properties` 配置示例: ```properties spring.config.import=classpath:import-config.yaml spring.config.additional-location=classpath:/additional-config/ spring.config.location=classpath:/main-config/ ``` 上述配置中,`import-config.yaml` 是通过 `spring.config.import` 加载的,`additional-config` 是附加配置目录,而 `main-config` 是主配置目录,其配置将覆盖前两者中的相同属性[^1]。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值