一、配置文件的简单介绍
springboot 的配置文件的自动载入规则可以从pom里的<artifactId>spring-boot-starter-parent</artifactId>里找到
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.7.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
显然易见,yml, yaml, properties的优先级是不一样的,后者会把前者的配置给覆盖掉。yaml和yml是一样的语法,简单说就是键值对的语法,这里不再过多赘述。properties的语法比较简单,server.port=8081这样通过等于号赋值。
二、几种配置参数
springboot保留配置的key,有自动配置
配置文件里可以配置很多springboot的web项目本身需要的一些参数,例如启动端口 server.port,如果不显式配置,其实springboot依然会有默认配置。
有关自动载入的配置可以通过以下方式找到
然后去找这个依赖包
这个json文件里就表明了springboot的一些可以配置的参数以及默认值,我们可以搜索一下server.port
说到这,你应该对整个自动配置的流程差不多了解了
springboot保留配置的key,没有自动配置
像数据库的配置,很容易理解,这个不会有默认值,就不会自动配置
不是springboot保留配置的key,没有自动配置
三、配置参数的使用
在项目中可以通过@ConfigurationProperties 和 @Value注解来使用,具体的操作可自行百度,
但值得注意的是:@ConfigurationProperties告诉springboot将本类中的所有属性和配置文件中的相关配置进行绑定,与prefix="xxxx",对应的其下属性一一映射。
使用@ConfigurationProperties时,需要通过添加 @Component 注解。因为只有这个组件是容器中的组件,才能使用容器提供的@ConfigurationProperties功能
@ConfigurationProperties | @Value | |
功能 | 批量注入 | 挨个指定 |
松散绑定 | 支持 | 不支持 |
SpEL | 不支持 | 支持 |
JSR303数据校验 | 支持(@Validated) | 不支持 |
复杂类型封装(例如:map) | 支持 | 不支持 |
上边是加载全局的配置文件,如果想要把一些配置从全局的配置文件中提取出来,例如在类路径下放一个person.properties。要加载的话 就要使用@PropertySource
四、配置文件占位符
RandomValuePropertySource
系统中用到随机数的地方,例如:
my.secret=${random.value}
my.number=${random.int}
my.bignumber=${random.long}
my.number.less.than.ten=${random.int(10)}
my.number.in.range=${random.int[1024,65536]}
属性配置占位符
my.name=MyApp
my.description=${my.name} is cool
可以在配置文件中引用前边配置过的属性(优先级前边配置过的这里都可以使用)
${my.name:默认值}来指定找不到属性时候的默认值
五、Profile
一个应用为了在不同的环境下工作,常常会有不同的配置,代码逻辑处理。Spring Boot 对此提供了简便的支持。
区分环境的配置(不激活 profile默认是default环境)
properties 配置
假设,一个应用的工作环境有:dev、test、prod
那么,我们可以添加 4 个配置文件:
applcation.properties
- 公共配置application-dev.properties
- 开发环境配置application-test.properties
- 测试环境配置application-prod.properties
- 生产环境配置
在 applcation.properties
文件中可以通过以下配置来激活 profile:
spring.profiles.active = test
yml 配置
与 properties 文件类似,我们也可以添加 4 个配置文件:
applcation.yml
- 公共配置application-dev.yml
- 开发环境配置application-test.yml
- 测试环境配置application-prod.yml
- 生产环境配置
在 applcation.yml
文件中可以通过以下配置来激活 profile:
spring:
profiles:
active: prod
此外,yml 文件也可以在一个文件中完成所有 profile 的配置:(多文档块)
# 激活 prod
spring:
profiles:
active: prod
# 也可以同时激活多个 profile
# spring.profiles.active: prod,proddb,prodlog
---
# dev 配置
spring:
profiles: dev
# 略去配置
---
spring:
profiles: test
# 略去配置
---
spring.profiles: prod
spring.profiles.include:
- proddb
- prodlog
---
spring:
profiles: proddb
# 略去配置
---
spring:
profiles: prodlog
# 略去配置
注意:不同 profile 之间通过 ---
分割
激活 profile
上文提到的配置文件激活 profile
spring.profiles.active = test
命令行激活 profile
Java -jar xxxx.jar --spring.profiles.active=prod
虚拟机参数 激活 profile
-Dspring.profiles.active=prod
在 Java 代码中激活 profile
直接指定环境变量来激活 profile:
System.setProperty("spring.profiles.active", "test");
…………等
六、配置参数的载入
配置文件加载位置
SpringBoot配置文件可以放置在多种路径下,不同路径下的配置优先级有所不同。
可放置目录(优先级从高到低)
./config/ (当前项目路径config目录下);
./ (当前项目路径下);
classpath:/config/ (类路径config目录下);
classpath:/ (类路径config下).
优先级由高到底,高优先级的配置会覆盖低优先级的配置;
SpringBoot会从这四个位置全部加载配置文件并互补配置;
我们可以从ConfigFileApplicationListener这类便可看出,其中DEFAULT_SEARCH_LOCATIONS属性设置了加载的目录:
private static final String DEFAULT_SEARCH_LOCATIONS = "classpath:/,classpath:/config/,file:./,file:./config/";
多种目录配置同时存在情况接下来还是以端口配置为例
在resources/目录下配置文件设置端口为8888;
在resources/config目录下配置文件设置端口为9999;
在项目路径下配置文件设置端口为6666;
在项目路径config目录下配置文件设置端口为7777;
最终运行结果:
Tomcat started on port(s): 7777 (http) with context path '/'
通过控制变量法得以论证其优先级由高到底,高优先级的配置会覆盖低优先级的配置
我们还可以通过spring.config.location来改变默认的配置文件加载位置,项目打包好之后,可以通过命令行参数,在启动项目的时候指定配置文件的加载位置,指定的配置文件和上述默认的配置文件共同起作用,形成互补配置
外部配置加载顺序
SpringBoot也可以从以下位置加载配置; 优先级从高到低;高优先级的配置覆盖低优先级的配置,所有的配置会形成互补配置
1.命令行参数
所有的配置都可以在命令行上进行指定
java -jar spring-boot-02-config-02-0.0.1-SNAPSHOT.jar --server.port=8087 --server.context-path=/abc
多个配置用空格分开; --配置项=值
2.来自java:comp/env的JNDI属性
3.Java系统属性(System.getProperties())
4.操作系统环境变量
5.RandomValuePropertySource配置的random.*属性值
由jar包外向jar包内进行寻找;
优先加载带profile
6.jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
7.jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
再来加载不带profile
8.jar包外部的application.properties或application.yml(不带spring.profile)配置文件
9.jar包内部的application.properties或application.yml(不带spring.profile)配置文件
10.@Configuration注解类上的@PropertySource
11.通过SpringApplication.setDefaultProperties指定的默认属性
所有支持的配置加载来源;