SpringBoot Profiles 多环境配置及切换
前言
大部分情况下,我们开发的产品应用都会根据不同的目的,支持运行在不同的环境(Profile)下,比如:
- 开发环境(dev)
- 测试环境(test)
- 预览环境(pre)
- 生产环境(prod)
这里的 环境 实际上是一个统称,不同的环境可能代表着
- 使用的域名、端口、实例数目是不同的;
- 连接的数据库地址、端口、名称是不同的;
- 使用的日志输出格式、级别、保存时间是不同的;
以数据库为例,应用在开发环境下运行时,连接的是开发环境对应的数据库;应用在生产环境下运行时,连接的是生产环境对应的数据库。
我们不是要为不同的运行环境开发多个不同的应用,而是要使应用可以运行在多个不同的环境中,怎么做到?
通过配置,更准备地说,是通过配置属性。配置属性本质就是键值对。
以数据库为例,应用连接数据库时,需要提供如下连接信息:
- 地址
- 端口
- 名称
- 用户名
- 密码
这些信息不会 硬编码 到应用代码中,而是以配置属性(键值对)的形式存储到配置文件中;应用运行时通过读取该配置文件中的配置属性,进而完成数据库的连接。
应用 = 程序代码 + 配置文件
这个配置文件中连接信息指向测试使用的数据库,我们就说应用运行在测试环境;连接信息指向生产使用的数据库,我们就说应用运行在生产环境;应用需要使用的其它服务(如:Redis、Kafka等)也是同样的原理。
也说是说,我们可以通过为应用运行时指定不同的配置文件(不同的配置文件配置着不同的配置属性),就可以使得应用可以运行在不同的环境中。SpringBoot 实际上也是通过类似的原理实现多环境的配置及切换的。
注:配置属性可能有多种存储方式,这里仅以配置文件为例。
默认环境配置
多环境配置及切换并不是每个应用所必须的,SpringBoot 也为我们考虑到了这一点,它提供了默认的配置文件和运行环境,即:如果没有特别指定,SpringBoot 使用默认的配置文件,运行于默认环境中。
默认配置文件
SpringBoot 默认配置文件:application.yml,默认位于类路径下。其中,application 代表 SpringBoot 配置文件名称,yml 代表配置文件格式(后缀)。
默认配置文件实际也可以不提供,或者内容为空。这是为什么呢?
SpringBoot 是一个功能十分丰富的技术框架,自身内置了很多的配置属性,用以控制 Spring 容器的初始化行为;同时,SpringBoot 也支持通过外置配置文件的方式引入其它的配置属性,application.yml 就是会被 SpringBoot 默认加载的外置配置文件之一。
SpringBoot 配置属性 = 内置配置属性 + 外置配置文件属性(application.yml)
如果 application.yml 不存在或者内容为空,SpringBoot 仅使用内置配置属性初始化容器环境;如果 application.yml 存在且内容不为空,SpringBoot 使用内置配置属性和 application.yml 配置属性的合集初始化容器环境。
如果 application.yml 中的配置属性名称和内置属性相同,那么这个配置属性值最终以 application.yml 中的配置值为准(覆盖)。相当于,application.yml 的配置文件属性优先级高于默认的内置属性。
注:SpringBoot 也支持 properties 后缀的配置文件格式,本文以 yml 为例。
默认运行环境
SpringBoot 默认运行环境:default,default 为运行环境名称。
默认运行环境的名称是哪里来的呢?
如前文所述,SpringBoot 是有内置属性的,默认的运行环境名称即来自于内置属性:
spring.profiles.active=default
也就是说,内置配置属性 spring.profiles.active 指定 SpringBoot 的运行环境名称为 default,我们可以将其指定为其它值,进行改变运行环境名称。
多环境配置
因为 application.yml 配置属性的优先级高于默认的内置属性,我们可以通过在 application.yml 中指定配置属性 spring.profiles.active 的值为 dev,将 SpringBoot 运行环境的名称修改为 dev:
application.yml
spring:
profiles:
active: dev
仅仅是修改运行环境名称么?SpringBoot 帮我们做的还有更多,它会自动搜索名称为 application-dev.yml 的配置文件并加载其中的配置属性。
配置文件名称是有固定模式的:
application-{profile}.yml
其中,{profile} 为我们通过配置属性 spring.profiles.active 指定的运行环境名称。
也就是说,如果我们指定运行环境名称为 dev,SpringBoot 会为我们自动搜索加载配置文件名称为 application-dev.yml 中的配置属性;如果我们指定运行环境名称为 test,SpringBoot 会为我们自动搜索加载配置文件名称为 application-test.yml 中的配置属性;其它运行环境名称同理。
SpringBoot 配置属性 = 内置属性 + application.yml 配置属性 + application-{profile}.yml 配置属性
SpringBoot 配置属性优先级:application-{profile}.yml 配置属性 > application.yml 配置属性 > 内置属性
也就是说,我们可以通过指定不同的运行环境名称,以及相应名称的配置文件,从而实现多环境之间的切换。
注:如果找不到相应环境(profile)的配置文件,则会忽略。
多环境切换
以开发环境(dev)、测试环境(test)、预览环境(pre)、生产环境(prod)为例,我们可以预先在项目中创建相应环境的配置文件:
application-dev.yml
application-test.yml
application-pre.yml
application-prod.yml
每一个环境的配置文件中配置相应环境对应的属性,如:数据库连接信息等;然后在 application.yml 中通过指定配置属性 spring.profiles.active 为不同的值实现多环境切换,如:
spring:
profiles:
active: prod
代表 SpringBoot 的运行环境名称为 prod,它将会加载 application-prod.yml 中的配置属性。
还可以在 SpringBoot 启动时,通过命令行参数的方式指定配置属性:
java -jar myproject.jar --spring.profiles.active=prod
SpringBoot 配置属性优先级:命令行参数配置属性 > application-{profile}.yml 配置属性 > application.yml 配置属性 > 内置属性
推荐的方式是通过 application.yml/spring.profiles.active 指定 SpringBoot 应用默认的运行环境,应用启动时通过命令行参数指定具体的运行环境;如果启用启动时没有指定,则应用使用默认的运行环境运行。
小结
SpringBoot 多环境配置及切换,本质就是通过预先设定好多个运行环境名称及相应的配置文件;应用启动时通过指定运行环境名称,进而加载对应名称的配置文件实现的。
实际使用时,我们还可以充分利用配置属性加载的优先级合理地规划应用的配置属性,比如:
- 通用配置(与运行环境无关的)属性可以放到 application.yml 中;
- 运行环境(profile)相关的配置属性可以放到相应的 application-{profile}.yml 中;
- 启动时需要临时指定的配置属性可以通过命令行参数设置;
- 2 和 3 中配置属性也可以放到 application.yml 中一份,作为默认配置。

SpringBoot Profiles 多环境配置及切换的更多相关文章
- maven profiles多环境配置
maven profiles多环境配置 转载. https://blog.csdn.net/runbat/article/details/81747874 今天做了一个小项目,需要配置开发.测试.预发 ...
- SpringBoot实现多环境配置
1.为什么需要配置多环境配置 在实际的开发中,我们往往需要在不同的环境中使用不同的数据库.缓存配置,如果使用同一套配置文件,在不同环境部署的时候手动去修改配置文件,会使部署变得很繁琐.使用多环境配置文 ...
- Maven之profile实现多环境配置动态切换
一般的软件项目,在开发.测试及生产等环境下配置文件中参数是不同的.传统的做法是在项目部署的时候,手动修改或者替换这个配置文件.这样太麻烦了,我们可以用Maven的profile来解决这 ...
- Spring boot 的profile功能如何实现多环境配置自动切换
通常服务端应用开发需要经过以下几个流程: 开发 -> 测试 -> RC验证 -> 上线 这就涉及到四个不同的环境,开发环境.测试环境.RC环境以及生产环境,为了避免不同环境之间相互干 ...
- (十一)Maven之profile实现多环境配置动态切换
原文链接:https://www.cnblogs.com/zeng1994/p/a442108012ffd6a97b22c63055b48fe9.html 一.多环境配置文件的放置 将不同环境下的配 ...
- Springboot 实现多环境配置
多环境配置 我们在开发Spring Boot应用时,通常同一套程序会被应用和安装到几个不同的环境,比如:开发.测试.生产等.其中每个环境的数据库地址.服务器端口等等配置都会不同,如果在为不同环境打包时 ...
- 从源码研究如何不重启Springboot项目实现redis配置动态切换
上一篇Websocket的续篇暂时还没有动手写,这篇算是插播吧.今天讲讲不重启项目动态切换redis服务. 背景 多个项目或微服务场景下,各个项目都需要配置redis数据源.但是,每当运维搞事时(修改 ...
- springboot打包不同环境配置与shell脚本部署
本篇和大家分享的是springboot打包并结合shell脚本命令部署,重点在分享一个shell程序启动工具,希望能便利工作: profiles指定不同环境的配置 maven-assembly-plu ...
- 转 通过 spring 容器内建的 profile 功能实现开发环境、测试环境、生产环境配置自动切换
软件开发的一般流程为工程师开发 -> 测试 -> 上线,因此就涉及到三个不同的环境,开发环境.测试环境以及生产环境,通常 ...
随机推荐
- HTML+CSS基础(HTML篇)
引言 在日常开发Android中,很多时候会遇到和WebView打交道,对CSS HTML JS不是很清楚的话是完不成一些功能的,本篇开始学习HTML,文章的主要内容是总结了慕课网中,HTML+CSS ...
- python网站(持续更新)
python官网: https://www.python.org/ python文档:中文 https://docs.python.org/zh-cn/3/ pypi网站: https://pypi. ...
- JAVA笔记13__创建线程/线程休眠/等待线程终止/线程中断/守护线程
/** * 线程:是进程的一个执行路径,共享一个内存空间,线程之间可以自由切换,并发执行,一个进程最少有一个进程(单线程程序) * 多线程两种实现方法:1.继承Thread类 2.实现Runnable ...
- 百亿级小文件存储,JuiceFS 在自动驾驶行业的最佳实践
自动驾驶是最近几年的热门领域,专注于自动驾驶技术的创业公司.新造车企业.传统车厂都在这个领域投入了大量的资源,推动着 L4.L5 级别自动驾驶体验能尽早进入我们的日常生活. 自动驾驶技术实现的核心环节 ...
- 问题解决:补充安装c语言的库函数和系统调用man手册
问题解决:补充安装c语言的库函数和系统调用man手册 今日份麻麻~上课时大家的Ubuntu都可以通过man查到关于stat的库函数,但是我的Kali查出来是这样: 询问老师之后得知需要去安装相 ...
- SpringCloud config native 配置
1.概述 最近项目使用springCloud 框架,使用config搭建git作为配置中心. 在私有化部署中,出现很多比较麻烦的和鸡肋的设计. 每次部署都需要安装gitlab 有些环境安装完gitla ...
- @Autowired注解注入失败,提示could not autowire的解决办法
autowire异常主要由三个情况发生的 像上面的情况是BrandDao没有注入, 1.你的BrandServiceImpl必须以@Service或@Component注解才行. 2.自动写入的时候把 ...
- not noly go —— 运行轨迹[一]
前言 学习一下go 语言,也不完全是go,几乎是所以语言通用的部分,主要在于巩固一下基础,几乎不会涉及到语法相关的东西. 正文 前置内容 说起语言,很多人喜欢谈论解释型语言和编译型语言,其实对语言谈论 ...
- java框架面试高频问题(SpringMVC)
1.SpringMVC是什么? 请说出你对它的理解? SpringMVC是Spring将Web层基于MVC封装后的框架. 在没有SpringMVC之前,Web层的Servlet负责的事情很多,很杂. ...
- 大爽Python入门教程 2-1 认识容器
大爽Python入门公开课教案 点击查看教程总目录 1 什么是容器 先思考这样一个场景: 有五个学生,姓名分别为: Alan, Bruce, Carlos, David, Emma. 需要给他们都打一 ...