更多Spring文章,欢迎点击 一灰灰Blog-Spring专题java
前面一篇主要介绍的是如何获取配置信息,接下来则是另一个很是很是基础和必要的知识点了,应用如何根据不一样的环境来选择对应的配置,即配置的多环境选择问题git
<!-- more -->github
配置区分环境,最直观的如测试环境和生产环境的DB不一样,测试环境的应用要求链接测试DB;生成环境的应用要求连生成DB;对于应用自己来讲,业务代码啥的都是同样,无非就是DB的配置不一样,若是在代码中写死环境判断,而后进行选择配置话,就不太优雅了;spring
SpringBoot自己就支持多环境配置文件,应用的配置,除了 application.yml
文件以外,还会有环境相关的配置,以下一个实例app
application.yml application-dev.yml application-pro.yml
配置文件,通常要求是以 application
开头,能够是yml文件也能够是properties文件dom
如何肯定哪一个配置配置文件(application-dev.yml 与 application-pro.yml)生效呢?spring-boot
spring.profile.active
来指定须要加载的配置文件一般这个配置信息会放在 applicatin.yml
文件中,以下工具
spring: profiles: active: dev
上面这个表示,当前的配置信息,会从 application.yml
和 application-dev.yml
文件中获取;且-dev
文件中定义的配置信息,会覆盖前面的配置信息学习
注意开发工具
配置文件内容以下
application.yml
# 端口号 server: port: 8081 spring: profiles: active: dev,biz biz: total: application
application-dev.yml
biz: env: dev-environment profile: dev-profile
application-pro.yml
biz: env: pro-environment profile: pro-profile
application-biz.yml
biz: whitelist: a,b,c,d,e,f,g ratelimit: 1,2,3 total: application-biz profile: biz-profile
经过前面的规则进行分析,当前选中生效的配置文件为
application
的配置代码验证以下
package com.git.hui.boot.properties; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.core.env.Environment; /** * Created by @author yihui in 09:17 18/9/20. */ @SpringBootApplication public class Application { public Application(Environment environment) { String env = environment.getProperty("biz.env"); String whitelist = environment.getProperty("biz.whitelist"); String ratelimit = environment.getProperty("biz.ratelimit"); String total = environment.getProperty("biz.total"); String profile = environment.getProperty("biz.profile"); // application.yml文件中的配置 spring.profile.active指定具体选中的配置文件,为 application-dev 和 application-biz // read from application-dev.yml System.out.println("env: " + env); // read from application-biz.yml System.out.println("whitelist: " + whitelist); System.out.println("ratelimit: " + ratelimit); // 当配置文件 application.yml, application-dev.yml, application-biz.yml 三个文件都存在时,覆盖规则为 // biz > dev > application.yml (其中 biz>dev的原则是根据 spring.profile.active 中定义的顺序来的,最右边的优先级最高) // read from application-biz.yml System.out.println("total: " + total); // read from application-biz.yml System.out.println("profile: " + profile); } public static void main(String[] args) { SpringApplication.run(Application.class); } }
输出结果为
env: dev-environment whitelist: a,b,c,d,e,f,g ratelimit: 1,2,3 total: application-biz profile: biz-profile
上面虽然看是实现了多环境的配置问题,但看完以后有一个明显的疑问,选择环境的配置信息写死在application.yml
文件中,难道说部署到测试和生产环境时,还得记得手动改这个配置的值么?
若是是这样的话,也太容易出问题了吧。。。
那么如何解决这个问题呢,常见的一种方式是经过启动脚本,传入当前环境的参数,来覆盖选中的环境
默认的配置文件是放在 src/main/resources
目录下,固然也是能够放其余位置的
/config
子目录中上面的优先级是从高到低来的,即外置的改与内置的;config下面的高于根目录下的
之内置的两个进行对比,实测结果以下
前面一篇中,遗留了一个问题,就是在配置文件中配置了属性 user.name = 一灰灰blog
, 可是实际取出的倒是 user
(我我的的电脑用户名),也就是说,Environment中读取的配置信息,不只仅是从配置文件中获取,还要其余的一些配置信息来源
根据优先级对属性来源进行排序,以下
看了上面的配置信息来源,咱们能够如何优雅的实现不一样环境选择不一样的配置文件呢?有下面两个容易想到和实现的方式了
这种实现思路就是在启动脚本中,传入当前环境,而后覆盖掉属性 --spring.profiles.active
,对业务来讲,就不须要作任何的改动了,只要启动脚本自己区分环境便可,惟一的要求就是遵循统一的规范,一个简单的实现以下
假定命令行的第一个参数就是环境,取出这个参数,传入便可
public static void main(String[] args) { if (args.length > 0) { SpringApplication.run(Application.class, "--spring.profiles.active=" + args[0] + ",biz"); } else { SpringApplication.run(Application.class); } }
实测结果,注意下面红框内的pro,覆盖了配置文件中的dev
说明
固然能够直接传入完整的命令行参数--spring.profiles.active=pro,biz
,这样代码内部就不须要进行特殊处理
当程序以独立的jar运行时,我我的的感受是外置的配置文件是优于内置的配置文件的;由于修改配置的话,不须要从新打包部署,直接改便可
这种实现方式也没啥好多说的,至关于把配置文件拉出来放在外面而已,再根据环境写具体的spring.profiles.active
的值
spring.profiles.active
来指定spring.profiles.active
参数指定多个配置文件时,右边的优于左边的--key=value
一灰灰的我的博客,记录全部学习和工做中的博文,欢迎你们前去逛逛
尽信书则不如,已上内容,纯属一家之言,因我的能力有限,不免有疏漏和错误之处,如发现bug或者有更好的建议,欢迎批评指正,不吝感激
一灰灰blog
知识星球