SpringBoot之多Profile配置

2019-08-09 00:00:00 配置 springboot 之多

近来在利用闲暇时间巩固下SpringBoot的基本知识,然后自己也做一些笔记,整理下当时所学知识,后面就干脆写到这里来了。

多Profile配置文件

在SpringBoot主配置文件编写的时候,文件名可以是application-{profile}.properties/yml。

默认使用的是application.properties配置文件的配置。

 1 applicaiton.properties 2 applicationdev.properties 3 applicationtest.properties 4 application-prod.properties 

激活指定配置文件

1、主配置文件中指定激活的profile

如果是properties格式的配置文件,那么可以在主配置文件中这样指定激活的profile:

spring.profiles.active = dev

如果是yml格式的配置文件,你可以用“—”来划分文档块,每个文档块都被看作是一个profile,你可以在主文档块中指定生效的profile:

 1 server:
 2   prot: 8081
 3 spring:
 4   profiles:
 5     active: dev # 指定激活哪个配置文件
 6 
 7 # yml格式配置文件中,用三个横线来区分文档块
 8 # 第一个文档块表示主文档块,并同时指定后续生效的是哪个文档块
 9 
10 ---
11 # 第二个文档块
12 server:
13   port: 8082
14 spring:
15   profiles: dev # 声明文档块类型
16 
17 ---
18 # 第三个文档块
19 server:
20   port: 8083
21 spring:
22   profiles: dev

2、命令行激活

在实际生产环境中直接使用命令行启动项目,启动的同时可以指定激活的profile:

java -jar --spring.profiles.active=dev my-spring-boot-app.1.0.0.jar

3、设置虚拟机参数激活

同样,你可以通过设置Java虚拟机参数的方式来激活指定profile:

[vm options:] -Dspring.profiles.action=dev

IDEA编辑器设置:

命令行指定的方式和虚拟机参数设置的方式指定,都可以在IDEA的运行设置中进行配置,如下图:

《SpringBoot之多Profile配置》

加载位置与顺序

SpringBoot启动会扫描以下位置的application.properties/yml文件作为spring boot的默认配置文件:

file:./config/
file:./
classpath:/config/
classpath:/

以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置的内容,并形成互补配置;当然,我们也可以通过spring.config.location来改变默认配置。

上面的:

  • file: 指当前项目根目录
  • classpath: 指当前项目的resources目录

给出一个图例:

《SpringBoot之多Profile配置》

注意:maven打包是不能把src外面的两个application.properties文件打到jar包里的。

在项目打包好之后,我们可以通过命令行参数的形式,启动项目的时候来指定配置文件的新位置,指定配置文件和默认加载的这些配置文件会共同生效,并形成互补配置。

《SpringBoot之多Profile配置》

这在运维的时候很有用,因为可以通过命令行的方式指定生效的配置文件,较为灵活。

外部配置

SpringBoot还支持多种外部配置方式,生效优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置形成互补配置

  1. 命令行参数
  2. 来自java:comp/env的JNDI属性
  3. Java系统属性(System.getProperties())
  4. 操作系统环境变量
  5. RandomValuePropertySource配置的ramdom.*属性值
  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
  11. 通过SpringApplication.setDefaultProperties指定的默认属性

其实在官网有17种这样的配置说明,可以从下面进入:

https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/boot-features-external-config.html

重点关注上面列举的1、6、7、8、9这几项,生效的配置文件,都是由jar包外向jar包内进行寻找的,优先加载带profile,再加载不带profile的。比如有个application.properties的配置文件和xxx.jar放置在同一个目录,那么项目启动时一定是先加载这个application.properties文件,再去加载xxx.jar里面的配置文件的。

参考资料

1、https://docs.spring.io/spring-boot/docs/2.1.6.RELEASE/reference/html/

相关文章