在Spring Boot中,application.yml
(或application.properties
)配置文件的加载顺序是由Spring Boot的Environment
抽象和ConfigFileApplicationListener
类共同管理的。这个加载过程涉及多个步骤,包括从多个位置搜索配置文件、合并配置属性以及应用优先级规则。
1、application.yml都可以放置在哪些位置
1.1 项目根目录下的config
文件夹中:/config/application.yml
1.2 项目根目录下:/application.yml
1.3 类路径(classpath)下的config
文件夹中:classpath:/config/application.yml
1.4 类路径(classpath)下:classpath:/application.yml
2、加载顺序和优先级
2.1 项目根目录下的config
文件夹中的application.yml
(/config/application.yml-最高优先级)。
2.2 项目根目录下的 /application.yml
。(优先级次之)
2.3 类路径(classpath)下的config
文件夹中的application.yml。
2.4 类路径(classpath)下的 /application.yml
(最低优先级)。
根据加载顺序和优先级,项目根目录下的config
文件夹中的application.yml
会被优先加载。如果在这个位置存在配置文件,Spring Boot会首先加载它,并且如果其中有与其他位置的配置文件相同的配置项,它会覆盖其他位置的配置。
3、相关代码解析
3.1 ConfigFileApplicationListener
的onApplicationEvent
方法:
--- 这个方法会在Spring Boot的ApplicationEnvironmentPreparedEvent
事件触发时被调用。它负责初始化配置文件加载过程。
3.2 配置文件位置搜索:
--- ConfigFileApplicationListener
会调用ConfigFileLocationResolver
来解析配置文件的位置。ConfigFileLocationResolver
会根据前面提到的搜索位置规则来生成可能的配置文件路径列表。
3.3 配置文件加载:
--- 一旦确定了配置文件的位置,ConfigFileApplicationListener
会使用PropertySourceLoader
来加载这些文件。对于YAML文件,会使用YamlPropertySourceLoader
。
3.4 属性合并:
--- 加载的配置文件会被转换成PropertySource
对象,并添加到Spring的Environment
中。Spring的Environment
是一个抽象,它允许你访问应用程序的属性,包括系统属性、环境变量、命令行参数以及配置文件中的属性。
3.5 优先级应用:
--- 在添加PropertySource
到Environment
时,后添加的PropertySource
会覆盖先前添加的同名属性。因此,根据加载顺序,优先级高的配置文件中的属性会覆盖优先级低的配置文件中的同名属性。
4、注意事项
3.1 如果在同一个目录下同时存在application.yml
和application.properties
文件,Spring Boot会默认先读取application.properties
文件。但是,建议在同一项目中尽量统一使用一种配置文件格式(yml
或properties
),以避免潜在的配置冲突和混淆。
3.2 可以通过命令行参数--spring.config.location
来指定额外的配置文件位置,这些指定的配置文件具有最高的优先级。但是,使用这种方式指定的配置文件不会与默认位置的配置文件形成互补配置;如果需要互补配置,可以使用--spring.config.additional-location
参数。
3.3 在Spring Boot 2.0及以上版本中,使用spring.config.location
参数时,Spring Boot只会加载指定的配置文件,而不会加载默认位置的配置文件。因此,在使用该参数时需要谨慎。