一文掌握 Spring Boot Profiles

Spring Boot Profiles 简介
Profile 的概念其实很早在 Spring Framework 就有了,在 Spring Framework 3.1 版本引入了注解 @Profile 和 Environment 环境配置的抽象,只是在 Spring Boot 框架里再进一步将 Profiles 功能进行扩展,使它也成为了 Spring Boot 特性之一,为此单独在 官方文档 25. Profiles 一节里介绍,文档里把 Spring Boot Profiles 也叫做 Spring Profiles。
那么什么又是 Spring Profiles,为什么需要它呢?我们先来看一个熟悉的场景:我们平常项目开发,经常需要根据不同的环境进行配置的修改,比如在本地开发会加载本机的配置和开发环境数据库,在测试服务器上部署时就需要加载测试环境配置和数据库,同样地,当项目发布生产环境时就需要设置为生产环境配置和数据库。这样一来,不同的环境部署都需要额外的处理来调整环境的配置,维护起来十分繁琐,还容易出错。
为了解决不同环境需要的配置切换问题,Spring Profiles 提供了一种方式允许我们指定在特定环境下只加载对应的程序配置,每一种环境配置对应一个 Profile,只有当前 Profile 处于激活状态时,才会将该 Profile 所对应的配置和 Bean 加载到 Spring 程序中。
Spring Profiles 就是针对应用程序,不同环境需要不同配置加载的一种解决方案。
当然 Spring 允许多个 Profile 处于激活状态,比如将应用配置进行细分成数据库配置,消息中间件配置,缓存配置等,都为各自在不同环境定义不同的 Profile 名称,在需要激活环境对应配置时,指定多个 Profile。
Spring Profiles 实战
在 Spring 程序中有两种方式使用 Profiles:XML 配置和注解 @Profile。
XML 配置定义 Profile
虽然现在 XML 配置方式使用越来越少,还是简单介绍下,通常我们在 XML 文件定义的 Bean 时都有根元素 <beans>,在 beans 元素上多了一个属性 profile 可以指定环境,比如说把开发环境的 profile 定义为 dev,生产环境的 profile 为:prod。

需要注意的是:必须要使用 Spring XML Beans Schema 版本为 4.0 以上才支持 profile 属性。在 XML 文件定义之后我们只需要激活指定的 Profile 名称就可以加载对应的 Bean 对象了,在 Spring 程序中激活的方式主要两种:
Java API 方式,获取当前 Spring 容器的环境 Bean,设置
activeProfiles属性,然后启动容器
采用启动参数方式指定,固定格式:
-Dspring.profiles.active=dev
注解 @Profiles 定义Profile
使用注解定义 Profile 也比较简单,引入一个新的注解 @Profiles,通常 @Profiles 配合 @Component 或者 @Configuration 使用,如下示例:

激活 Profile 的方式都是一样的,只要指定 Profile 被激活,其对应的 Bean 才会加载。在 Spring 程序中 Profile 默认为 default,当前我们可以通过 spring.profiles.default 配置方式或者 org.springframework.core.env.AbstractEnvironment#setDefaultProfiles API 方式修改。
Spring Boot Profile 实战
好了,现在我们再来看下在 Spring Boot 程序中如何使用 Profile。通常一个 Spring Boot 程序的配置文件为 yml 或者 properties 格式,由于 yml 格式文件的结构简洁已读,备受官方推崇,我们可以看下如何在 application.yml 定义 Profile 和对应的配置。

与yml格式文件不同,正对不同的 Profile,无法在一个 properties 文件设置,官方采用命名形式为 applications-${profile}.properties 格式来达成一样的效果。为了看到指定 Profile 激活后的效果,我们可以通过下方的一个例子实践下,通过激活不同 Profile 启动程序,来请求 /enviroment 接口来获取当前的环境配置变量。

这里我们介绍如何在配置文件中激活 Profile 的方式:在 application.yml 顶部添加如下配置,表明当前所激活的 Profile 为 prod,当然也可以前文介绍的启动参数方式激活:

然后启动程序,curl 方式访问 http://localhost:9000/enviroment 可以得到如下输出结果:

同样如果上述的 active 属性值指定为 dev,将输出内容: current app enviroment is prod。
Spring Boot API 方式激活 Profile
在 Spring Boot 程序除了上述的方法来激活 Profile 外,还可以使用 Spring Boot API 方式激活:
SpringApplication.setAdditionalProfiles(…)
SpringApplicationBuilder.profiles(...)
但需要注意的是使用 Spring Boot API 的话需要在程序启动前设置,也就是 SpringApplication.run(...) 方法执行前,否则没有效果。 采用 Spring Boot API 方式添加的Profile 是属于额外激活的 Profile,也就是说覆盖掉外部传入的 spring.profiles.activie 指定的 Profile。
总结
在Spring Boot 程序中,我们通常定义不同 Profiles 的配置文件,如 application-{profile}.properties,在默认配置文件 application.properties 中设置 spring.profiles.active=dev ,用于平常开发使用,当需要打包上传服务器时,通过启动参数方式 jar -Dspring.profiles.active=prod xxx.jar 指定对应环境的 Profile 启动程序来加载对应环境的配置,到这里我们学习如何通过 Spring Boot Profiles 特性来应对程序中不同环境配置的切换,希望对工作中的小伙伴有所帮助,也欢迎小伙伴留言分享应对项目环境配置区分加载的实践心得。若有错误或者不当之处,还请大家批评指正,一起学习交流。
下篇文章将通过解读源码的方式具体讲解 Spring Boot Profiles 实现原理,敬请关注期待。

示例代码
本文示例代码可以通过下面仓库地址获取:
- springboot-actions-profiles:https://github.com/wrcj12138aaa/springboot-actions-profiles
环境支持:
- JDK 8
- SpringBoot 2.1.6
- Maven 3.6.0
参考资料
- How to use profiles in Spring Boot Application:http://1t.click/yUj
- Spring Boot Doc:http://1t.click/yUh
- Spring Doc:http://1t.click/yUg
- 全面解读 Spring Profile 的用法:https://mp.weixin.qq.com/s/0iWpGefYPqnkly4EmaPAug
推荐阅读
一文掌握 Spring Boot Profiles的更多相关文章
- 源码解读 Spring Boot Profiles
前言 上文<一文掌握 Spring Boot Profiles> 是对 Spring Boot Profiles 的介绍和使用,因此本文将从源码角度探究 Spring Boot Profi ...
- spring boot profiles 实现多环境下配置切换 docker版
1,前言 开发环境总需要调试,docker直接部署不需要调试,环境配置不一样,这里的目的只是,在docker文件环境与开发环境使用不同的配置文件,项目结构如下 2,设置项目配置文件 默认配置文件 ap ...
- 第2章 Spring Boot 文档
Spring Boot 文档 本节简要介绍了Spring Boot文档,是整个文档的参考指南. 您可以完整阅读本参考指南,或者如果您不感兴趣的话可以跳过该部分. 1. 关于文档 Spring Boot ...
- Spring Boot文档
本文来自于springboot官方文档 地址:https://docs.spring.io/spring-boot/docs/current/reference/html/ Spring Boot参考 ...
- Spring Boot:整合Swagger文档
综合概述 spring-boot作为当前最为流行的Java web开发脚手架,越来越多的开发者选择用其来构建企业级的RESTFul API接口.这些接口不但会服务于传统的web端(b/s),也会服务于 ...
- Spring Boot 2.x基础教程:Swagger静态文档的生成
前言 通过之前的两篇关于Swagger入门以及具体使用细节的介绍之后,我们已经能够轻松地为Spring MVC的Web项目自动构建出API文档了.如果您还不熟悉这块,可以先阅读: Spring Boo ...
- 将 Spring boot 项目打成可执行Jar包,及相关注意事项(main-class、缺少 xsd、重复打包依赖)
最近在看 spring boot 的东西,觉得很方便,很好用.对于一个简单的REST服务,都不要自己部署Tomcat了,直接在 IDE 里 run 一个包含 main 函数的主类就可以了. 但是,转念 ...
- Spring Boot中文文档(官方文档翻译 基于1.5.2.RELEASE)
作者:Phillip Webb, Dave Syer, Josh Long, Stéphane Nicoll, Rob Winch, Andy Wilkinson, Marcel Overdijk, ...
- Spring Boot:整合Spring Security
综合概述 Spring Security 是 Spring 社区的一个顶级项目,也是 Spring Boot 官方推荐使用的安全框架.除了常规的认证(Authentication)和授权(Author ...
随机推荐
- cookie 和 session 区别
二者的定义: 当你在浏览网站的时候,WEB 服务器会先送一小小资料放在你的计算机上,Cookie 会帮你在网站上所打的文字或是一些选择, 都纪录下来.当下次你再光临同一个网站,WEB 服务器会先看看有 ...
- Fabric1.4源码解析: 链码容器启动过程
想写点东西记录一下最近看的一些Fabric源码,本文使用的是fabric1.4的版本,所以对于其他版本的fabric,内容可能会有所不同. 本文想针对Fabric中链码容器的启动过程进行源码的解析.这 ...
- Spark学习之路(二)—— Spark开发环境搭建
一.安装Spark 1.1 下载并解压 官方下载地址:http://spark.apache.org/downloads.html ,选择Spark版本和对应的Hadoop版本后再下载: 解压安装包: ...
- Java基础篇01
01. 面向对象 --> 什么是面向对象 面向对象 面向对象程序设计,简称OOP(Object Oriented Programming). 对象: 指人们要研究的任何事物,不管是物理上具体的事 ...
- PCA(主成分分析)算法
设有\(m\)个指标,\(n\)个样本的原始数据 将原始数据按列组成矩阵 \(X _ { n \times m }\) 将\(X\) 的每一列进行中心化 求\(X\)的协方差矩阵\(\Sigma _ ...
- CentOs7.5安装FFmpeg
一.FFmpeg简介 FFmpeg是一个自由软件,可以运行音频和视频多种格式的录影.转换.流功能,包含了libavcodec ─这是一个用于多个项目中音频和视频的解码器库,以及libavformat— ...
- LightGBM,面试会问到的都在这了(附代码)!
1. LightGBM是什么东东 不久前微软DMTK(分布式机器学习工具包)团队在GitHub上开源了性能超越其他boosting工具的LightGBM,在三天之内GitHub上被star了1000次 ...
- c++学习书籍推荐《C标准库(英文版)》下载
<C标准库(英文版)>是由世界级C语言专家编写的C标准库经典著作,影响了几代程序员. <C标准库(英文版)>集中讨论了C标准库,全面介绍了ANSI/ISO C语言标准的所有库函 ...
- 百度云下载神器 速盘SpeedPan v1.9.7
速盘 – 不一样的度盘神器!SpeedPan 是一款由吾爱破解论坛会员"菩提叶"制作的度盘满速下载工具.这款百度网盘高速下载工具,免费小巧简单易用,采用了Aria2多线程下载,支持 ...
- web应用分页
1. 场景描述 目前大部分的应用程序中都会用到分页功能,以便减少前端浏览器及后台服务器的压力,以及其他方面的考虑. (1)分页从概念上可分为逻辑分页和物理分页,逻辑分页主要是通过应用程序(前端或者后端 ...