SpringBoot之多Profile配置
近来在利用闲暇时间巩固下SpringBoot的基本知识,然后自己也做一些笔记,整理下当时所学知识,后面就干脆写到这里来了。
多Profile配置文件
在SpringBoot主配置文件编写的时候,文件名可以是application-{profile}.properties/yml。
默认使用的是application.properties配置文件的配置。
1 applicaiton.properties 2 application-dev.properties 3 application-test.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启动会扫描以下位置的application.properties/yml文件作为spring boot的默认配置文件:
file:./config/ file:./ classpath:/config/ classpath:/
以上是按照优先级从高到低的顺序,所有位置的文件都会被加载,高优先级配置内容会覆盖低优先级配置的内容,并形成互补配置;当然,我们也可以通过spring.config.location来改变默认配置。
上面的:
- file: 指当前项目根目录
- classpath: 指当前项目的resources目录
给出一个图例:
注意:maven打包是不能把src外面的两个application.properties文件打到jar包里的。
在项目打包好之后,我们可以通过命令行参数的形式,启动项目的时候来指定配置文件的新位置,指定配置文件和默认加载的这些配置文件会共同生效,并形成互补配置。
这在运维的时候很有用,因为可以通过命令行的方式指定生效的配置文件,较为灵活。
外部配置
SpringBoot还支持多种外部配置方式,生效优先级从高到低,高优先级的配置覆盖低优先级的配置,所有的配置形成互补配置。
- 命令行参数
- 来自java:comp/env的JNDI属性
- Java系统属性(System.getProperties())
- 操作系统环境变量
- RandomValuePropertySource配置的ramdom.*属性值
- jar包外部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包内部的application-{profile}.properties或application.yml(带spring.profile)配置文件
- jar包外部的application.properties或application.yml(不带spring.profile)配置文件
- jar包内部的application.properties或application.yml(不带spring.profile)配置文件
- @Configuration注解类上的@PropertySource
- 通过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/