Spring Boot是一个非常流行的Java Web开发框架,让开发者能够快速构建和部署自己的应用程序。在实际开发中,我们会用到大量的配置文件来配置应用的各个方面,如数据库连接、日志记录、缓存配置等。然而,当有多个配置文件存在时,开发者很容易混淆配置加载的顺序,从而导致应用无法正确启动。本文将从多个角度来探讨Spring Boot配置加载顺序,帮助开发者更好地理解Spring Boot应用的配置文件加载机制。
1.配置文件优先级
在Spring Boot中,配置文件的优先级是非常重要的。Spring Boot的配置文件可以分为两种:应用默认的配置文件和自定义的配置文件。应用默认的配置文件是Spring Boot框架内部提供的,位于classpath:/META-INF/spring-boot-defaults.properties文件中,用于对Spring Boot应用的一些默认配置进行设置。自定义的配置文件则是应用开发者自己编写的,可以放置在classpath的根目录下,或者放置在外部的文件系统中。当存在多个自定义的配置文件时,Spring Boot会按照以下顺序进行加载:
1. 优先加载带有“正式”或“生产”后缀的配置文件,如application-prod.yml或application-prod.properties。
2. 其次加载带有“测试”或“开发”后缀的配置文件,如application-dev.yml或application-dev.properties。
3. 最后加载没有后缀的配置文件,即application.yml或application.properties。
如果存在多个同名的配置文件,如有两个application.yml文件,Spring Boot会以classpath的优先级为准,即先加载本地classpath的配置文件,再加载外部文件系统中的配置文件。
2.不同配置文件的作用
Spring Boot应用的配置文件主要有两种类型:properties和YAML。二者的功能和使用方法非常相似,使用哪种也只是个人喜好。在配置文件中,可以设置数据库连接、web请求、缓存和日志等。下面是一个示例配置文件,以YAML格式为例:
```
# Page Config
page:
# 分页大小
pageSize: 20
# DataSource Config
spring:
# 数据源基本配置
datasource:
url: jdbc:mysql://localhost:3306/test
username: root
password: 123456
driver-class-name: com.mysql.jdbc.Driver
# Logging Config
logging:
# 设置日志级别
level:
com.example: INFO
```
其中,page和logging是自定义的配置项,与Spring Boot框架无关。而spring.datasource则是Spring Boot框架内部默认支持的配置项,用于设置数据源的连接信息。在实际开发中,我们通常会将所有的配置项都放在一个或多个配置文件中,以便于管理和维护。
3. 配置文件引入
在实际开发中,一个应用的配置往往需要包含多个配置文件,以实现不同功能的配置。此时,可以在配置文件中通过`spring.config.import`属性来引入其他的配置文件,它可以引入外部的配置文件,也可以引入应用内部的其他配置文件。例如:
```
spring:
config:
import: classpath:/config/*.yml
```
以上配置项将会引入classpath:/config目录下的所有YAML类型的文件。相对路径和绝对路径也都是支持的。
4. 配置项的优先级
在Spring Boot应用中,配置项有着不同的优先级,当一个配置项被多次定义时,Spring Boot会根据其优先级来确定哪个属性值才是最终生效的。其优先级依次为:
1. 命令行参数:命令行参数的优先级最高,它们会覆盖任何其他的属性。
2. SPEl表达式:Spring里面的表达式语言,可以在运行时计算出属性的值。
3. 系统属性:通过命令行参数传入或通过操作系统环境变量设置的属性。
4. 应用内部的配置文件:例如application.yml和application.properties。
5. 外部的配置文件:例如application.yml和application.properties。
6. 代码中的@PropertySource注解:通过该注解来加载外部的属性文件。其优先级最低,它被称为“落地配置”,意味着它是最终阶段才被加载的属性。
综上所述,当多个配置文件中存在同名的属性时,Spring Boot会根据优先级的顺序来选择哪个属性值生效。
扫码咨询 领取资料