赞
踩
Spring Boot配置文件优先级加载机制
SpringBoot项目启动会扫描以下位置的application.properties或者application.yml作为默认的配置文件.
file:./config/
file:./config/*/
file:./
classpath:/config/
classpath:/
加载的优先级顺序是从上向下加载,并且所有的文件都会被加载,
高优先级的内容会覆盖低优先级的内容,形成互补配置
源码:ConfigFileApplicationListener
项目结构:
注意:当是多模块项目时,最外层的/config文件夹下的配置,在打包时,功能模块并不会用到,而是用模块内的配置文件,一般情况下,类似微服务的多模块,每个模块都有对应的配置文件,并且配置文件放在模块的/resource文件下。这种/config最高优先级的一般是适用单体项目
1、命令行参数
如:java -jar XXXX-0.0.1-SNAPSHOT.jar --spring.profiles.active=test
2、来自java:comp/env的JNDI属性
3、Java系统属性(System.getProperties())
4、操作系统环境变量
5、RandomValuePropertySource配置的random.*属性值
备注:由jar包外向jar包内进行寻找,优先加载带profile的,再加载不带profile的
6、jar包外部的application-{profile}.properties或application.yml(带spring.profile)配- 置文件
7、jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
8、jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9、jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10、@Configuration注解类上的@PropertySource
12、通过SpringApplication.setDefaultProperties指定的默认属性
注:同一目录下,properties配置文件优先级 > yml/yaml配置文件优先级。
因此在jar包启动时如果带上properties写法的配置可以覆盖配置。
yaml/yml配置文件写法冒号后要加空格
@Value("${name}")
String name;
@Component
@ConfigurationProperties(prefix = "redis") //
class RedisConfig {
private String host; // 属性名称跟application.yml中定义的一致
private String port;
}
注: 该注解用于从配置文件中取值,支持复杂的数据类型,但是不支持SPEL表达式。
prefix属性:指定获配置的前缀,毕竟配置文件中的属性很多,也有很多重名的,必须用一个前缀来区分下。
该注解可以标注在类上也可以标注在方法上,这里就可以看出它有两种获取值的方式。
注:@ConfigurationProperties这个注解仅仅是支持从SpringBoot的默认配置文件中取值,也就是application.properties、application.yml、application.yaml,那我们如何从自定义配置文件取值呢???
别着急,有解决办法,那就是再加一个注解:@PropertySource(value=“classpath:custom-profile.properties”),
@Component
@PropertySource("classpath:website.properties")
@Data
class WebSite {
@Value("${url}")
private String url;
}
@Component
@PropertySource("classpath:custom.properties")
@Data
class WebSite {
@Value("${url}")
private String url;
}
注:
@PropertySource注解属性
value:是一个数组,可以指定多个配置文件同时引入。
value是数组那么问题就来了:如果同时加载多个配置文件,并且不同配置文件中对同一个属性设置了不同的值,Spring加载顺序为从左到右顺序加载,后加载的会覆盖先加载的属性值。
注:
@PropertySource默认加载xxx.properties类型的配置文件,不能加载YML格式的配置文件,要加载yaml配置,需指定factory属性来加载YML格式的配置文件。同时加载多个配置
SpringBoot还提供了@ImportResource注解加载外部配置文件,
只不过@ImportResource通常用于加载Spring的xml配置文件
@ImportResource使用
SpringBoot提出零xml的配置,因此SpringBoot默认情况下是不会主动识别项目中Spring的xml配置文件。
为了能够加载xml的配置文件,Spring Boot提供了@ImportResource注解,
该注解可以加载Spring的xml配置文件,通常加于启动类上
@SpringBootApplication
@ImportResource(value = {"classpath:config/beans.xml"})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。