1、SpringBoot项目加载配置文件顺序
Spring Boot会从多个位置加载配置文件,这些位置按照优先级从高到低的顺序排列如下:
file:./config/
:项目根目录下的config目录。file:./
:项目根目录。classpath:/config/
:类路径下的config目录(通常是src/main/resources/config)。classpath:/
:类路径的根目录(通常是src/main/resources)。
Spring Boot会从这四个位置全部加载主配置文件(application.properties或application.yml),并且还能产生互相配置的效果。如果同一个配置项在这四个位置中的多个位置都有定义,那么高优先级的配置会覆盖低优先级的配置。
此外,对于多环境的配置文件(如application-dev.properties、application-prod.yml等),Spring Boot也会根据激活的profile来加载相应的配置文件。这些profile-specific文件的加载优先级会高于通用的配置文件(如application.properties或application.yml)。
在Spring Boot中,配置文件的覆盖机制遵循以下原则:
- 高优先级覆盖低优先级:如前面所述,按照加载顺序,高优先级的配置文件中的配置项会覆盖低优先级的配置文件中的相同配置项。
- properties文件优先于yml文件:在同一个目录下,如果存在application.properties和application.yml两个文件,Spring Boot会优先加载properties文件中的内容,并且会忽略yml文件中相同的配置项(如果properties文件中已经定义了该配置项)。但是,两个文件中的内容会进行互补操作,即Spring Boot会读取两份文件中的所有内容,汇成一个总的配置。
- 命令行参数优先:所有的配置都可以在命令行上进行指定,命令行参数具有最高的优先级,会覆盖所有其他位置的配置文件中的相同配置项。
注意事项:
- 合理规划配置文件的加载顺序:确保后面加载的配置文件能够覆盖前面加载的配置文件中相同的配置项,以避免配置冲突。
- 使用不同的profile-specific文件:根据环境需求使用不同的profile-specific文件来适应不同的环境配置,确保配置的正确性。
- 避免配置冗余:尽量避免在多个配置文件中定义相同的配置项,以减少配置的复杂性和出错的可能性。
2、jar包加载配置文件顺序
当Spring Boot项目被打成jar包运行时,如果外部也存在配置文件,Spring Boot 提供了几种方式来处理这些外部配置文件,确保它们能够被正确加载和覆盖。以下是一些常见的方法:
- 使用
--spring.config.location
参数来指定外部配置文件的路径。例如:
这种方式会告知Spring Boot去加载指定的外部配置文件,而不是默认的类路径下的配置文件。需要注意的是,使用这种方式时,指定的配置文件会覆盖所有其他位置的配置文件(包括jar包内部的配置文件)。java -jar your-spring-boot-app.jar --spring.config.location=file:/path/to/external/application.yml
- 使用
--spring.profiles.active
或--spring.profiles.include
参数
这将会加载java -jar your-spring-boot-app.jar --spring.profiles.active=prod
application-prod.yml
(或application-prod.properties
)配置文件,该配置文件通常位于类路径下,但也可以放在外部并通过--spring.config.location
参数指定。 - 在jar包同级目录下放置配置文件
如果不使用命令行参数指定配置文件位置,Spring Boot 还会按照前面提到的优先级顺序在外部目录中查找配置文件。因此,你可以将配置文件放在jar包同级目录下的config文件夹中,或者直接放在jar包同级目录下。这样,Spring Boot 在启动时会自动加载这些外部配置文件。 - 使用
@PropertySource
注解
对于自定义的配置文件(如config.properties
),你可以在Spring Boot的启动类或配置类上使用@PropertySource
注解来指定配置文件的路径。例如:
然而,需要注意的是,@PropertySource注解主要用于加载自定义的配置文件,并且当指定多个路径时,它们会按照数组中的顺序进行加载(先加载前面的路径,如果找不到再加载后面的路径)。此外,ignoreResourceNotFound属性设置为true时,如果指定的配置文件不存在,Spring Boot 不会抛出异常。@PropertySource(value = {"classpath:config.properties", "file:/path/to/external/config.properties"}, ignoreResourceNotFound = true) @ConfigurationProperties(prefix = "some.prefix") public class ConfigBean { // 配置属性 }
当外部配置文件和jar包内部的配置文件存在相同的配置项时,外部配置文件中的配置项会覆盖jar包内部的配置文件中的相同配置项。这是Spring Boot配置加载机制中的一个重要特性,它允许你在不同的环境中使用不同的配置文件来适应不同的需求。
具体来说,Spring Boot配置文件的加载顺序和优先级大致如下(从高到低):
- 命令行参数(如
--spring.config.location
指定的配置文件)。 SPRING_CONFIG_LOCATION
环境变量指定的配置文件。- 在执行
java -jar
命令同级目录下的config文件夹中的配置文件(如果命令不是在jar包同级目录执行,则此位置不生效)。 - jar包内部通过
spring.config.location
指定的配置文件(但注意,这种方式在打包成jar后通常不常用,因为此时已经无法修改jar包内部的内容)。 - jar包同级的 properties 文件。
- classpath下 的 config 文件夹中的配置文件。
- classpath 根目录下的properties文件。