带实习生学Spring Boot 之 Spring Profiles
大家好,我是指北君。
最近公司新来了一个实习生,挺上进的,天天追着我问问题。指北君开启了带实习生打怪升级之路。吶,今天问了一个关于 Spring Profiles 的问题。
实习生:指北君,你知道 Spring Profiles 吗?
指北君:我知道啊,怎么了?有什么问题吗?
实习生:那你可以跟我讲讲嘛,Spring Profiles到底是什么?有什么用?
指北君:好的,Profiles 是 Spring 框架的核心特性,它允许我们在不同的 profiles 条件下,对 Spring bean 有不同的配置实现。 比如说,我们在生产环节用 prod 标记,那我们的 spring bean 构造出来之后就使用了 prod 的配置项。所以我们只要在启动的时候,设定好我们想要的 profile ,那我们就能获得不同的结果。
实习生:那这个 Spring Profile 在项目里怎么使用的呢?
指北君:好,我找个项目给你看下。
话音刚落,指北君打开了 IDEA,一顿操作,找到了一个配置类。
@Component
@Profile("dev")
public class DevDatasourceConfig
指北君:看到了吗? 我们项目里这个数据源配置类上面有个 @Profile 注解,里面写了 dev 。就是说这个配置类在 profile=dev 的时候,才能生效。
实习生:那这个挺简单的呀。
指北君:是的呀,使用起来很简单的,哦对了,这里有个小技巧。如果我们只是不想在特定环境下配置某个配置类的话,也有很简单的操作方式。
@Component
@Profile("!dev")
public class DevDatasourceConfig
你看出区别了吗?
实习生:就是 dev 之前加了一个 !(叹号)。其他没有变化。
指北君:是的,就是这样,这也是一个常用的技巧。
实习生:代码里虽然这样配置好了,那项目启动怎么知道启用了哪一个配置项呢?
指北君:启用哪一个配置,这边有很多种方式可以实现。
1、我们在项目中的 application.properties 文件里直接进行配置即可
spring.profiles.active=dev
2、通过硬编码实现 WebApplicationInitializer 接口,配置 ServletContext 来激活配置
@Configuration
public class MyWebApplicationInitializer
implements WebApplicationInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
servletContext.setInitParameter(
"spring.profiles.active", "dev");
}
}
3、直接在 ConfigurableEnvironment 中实现设置,使用 spring boot 的朋友应该都知道,系统所有的配置项都是来自于 ConfigurableEnvironment 。
@Autowired
private ConfigurableEnvironment env;
...
env.setActiveProfiles("dev");
4、命令行JVM启动参数
-Dspring.profiles.active=dev
5、通过 export 环境变量来实现
export spring_profiles_active=dev
嗯, 学会了这几种方法,你已经可以在绝大部分场景下,游刃有余地使用 profile 了。
实习生:那我还有个问题,既然这样配置的话,那我项目里有多个profile, 万一我手抖,没有用你说的这几种配置好呢? 那会怎么样?
指北君:这个你放心,spring boot 有兜底方法,你想啊,你在一些项目没有用到 profile 的时候,spring boot 是怎么启动的呢?spring boot 项目会自动使用默认配置
spring.profiles.default=none
也就是说,spring boot 启动了,但是没有加载任何被@Profile 等标记的配置类。只会加载没有被标记的配置类。
实习生:懂了,我看我们项目里,有很多类似 @Profile("db") @Profile("mysql") 之类的,那像这种多个的怎么使用的?
指北君:是的,我们项目中,不同的模块都分开配置了, 我给你举个例子怎么使用的。
-Dspring.profiles.active=dev,db,mysql
就像这样,直接逗号分割,拼接上去就行了。
实习生:那这样好像比较麻烦啊,万一搞漏掉了就给自己挖坑了。
指北君:对的,这就是要仔细了,以前一直要靠自己的。现在就不会有这个问题了,spring boot 团队也意识到这个问题了,在 Spring boot 2.4 开始已经支持分组了。
spring.profiles.group.production[0]=proddb
spring.profiles.group.production[1]=prodmq
我们平时启动的时候只要指定 spring.profiles.active=production 就行了, prodb 和 prodmq 同样就能成功配置进来。 Spring Profiles 的相关内容差不多都讲完了,你还有什么疑问吗?
实习生:现在基本没有了,等我遇到再来找你这大佬。
指北君:随时欢迎,现在是我在带你,不要给我丢脸就行。哈哈哈。
总结
本文讲述了 Spring Profiles 的配置使用,和如果在启动的时候,选择特定的 profile 。也讲述了一些使用过程中的一些小技巧,希望对你有帮助。
有任何问题可以在公众号后台留言,指北君会第一时间回复大家。欢迎关注公众号【Java技术指北】,第一时间获取更多精彩内容。
带实习生学Spring Boot 之 Spring Profiles的更多相关文章
- Spring boot与Spring cloud之间的关系
Spring boot 是 Spring 的一套快速配置脚手架,可以基于spring boot 快速开发单个微服务,Spring Boot,看名字就知道是Spring的引导,就是用于启动Spring的 ...
- maven 聚合工程 用spring boot 搭建 spring cloud 微服务 模块式开发项目
项目的简单介绍: 项目采用maven聚合工程 用spring boot 搭建 spring cloud的微服务 模块式开发 项目的截图: 搭建开始: 能上图 我少打字 1.首先搭建maven的聚合工程 ...
- Spring Boot(Spring的自动整合框架)
Spring Boot 是一套基于Spring框架的微服务框架,由于Spring是一个轻量级的企业开发框架,主要功能就是用于整合和管理其他框架,想法是将平时主流使用到的框架的整合配置预先写好,然后通过 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习
转载自:http://blog.csdn.net/enweitech/article/details/52582918 看了几周Spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习感 ...
- 基于Spring Boot和Spring Cloud实现微服务架构学习--转
原文地址:http://blog.csdn.net/enweitech/article/details/52582918 看了几周spring相关框架的书籍和官方demo,是时候开始总结下这中间的学习 ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用EhCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- SpringBoot系列:Spring Boot集成Spring Cache,使用RedisCache
前面的章节,讲解了Spring Boot集成Spring Cache,Spring Cache已经完成了多种Cache的实现,包括EhCache.RedisCache.ConcurrentMapCac ...
- Spring、SpringMVC、Spring Boot、Spring Cloud 概念、关系及区别
注:此文章转载于其他大神 一.正面解读: Spring主要是基于IOC反转Beans管理Bean类,主要依存于SSH框架(Struts+Spring+Hibernate)这个MVC框架,所以定位很明确 ...
- Spring Boot 整合Spring Data JPA
Spring Boot整合Spring Data JPA 1)加入依赖 <dependency> <groupId>org.springframework.boot</g ...
- Spring Boot -- 认识Spring Boot
在前面我们已经学习过Srping MVC框架,我们需要配置web.xml.spring mvc配置文件,tomcat,是不是感觉配置较为繁琐.那我们今天不妨来试试使用Spring Boot,Sprin ...
随机推荐
- Golang基础编程(一)-基本结构、数据类型、流程语句
一.Go语言简介 简洁,高效,并发 二.语言特性 ·简洁,只有25个关键字 ·函数多返回值 ·匿名函数和闭包 ·类型和接口 ·自动垃圾回收 ·编译迅速 ·并发编程 25个关键字: 三.Go程序基本结构 ...
- kotlin中的嵌套类与内部类
Java中的内部类和静态内部类在Java中内部类简言之就是在一个类的内部定义的另一个类.当然在如果这个内部类被static修饰符修饰,那就是一个静态内部类.关于内部类 和静态内部类除了修饰符的区别之外 ...
- 浅析PriorityBlockingQueue优先级队列原理
介绍 当你看本文时,需要具备以下知识点 二叉树.完全二叉树.二叉堆.二叉树的表示方法 如果上述内容不懂也没关系可以先看概念. PriorityBlockingQueue是一个无界的基于数组的优先级阻塞 ...
- 行者APP适配国外环境问题解决
(本文1151字,阅读约5分钟) 玩骑行的同伴都知道,长途骑行,第一需要好的硬件,如大腿发动机.车子.装备等:二是需要好的软件,如意志.有氧能力.骑行app等. 到雅加达后,才发现在国内用了几年的黑鸟 ...
- Go语言协程并发---互斥锁sync.Mutex
package main import ( "fmt" "sync" "time" ) /* mt.Lock() 抢锁 一次只能被一个协程锁 ...
- 使用shell脚本循环处理文本
公司是使用puppet来进行配置管理, 某天修改完puppet后领导回复: 我们有一个文档cabinet.txt记录了物理机器所在的机柜, 除了文档里的其他机器都是虚拟机或云服务器, 对虚拟机的pup ...
- mysql 高级和 索引优化,目的:查的好,查的快,性能好
1-事物隔离级别: 更新丢失, 并发情况下,对同一字段进行更新,就会出现更新丢失,采用乐观锁,比较版本号或时间戳可解决 读未提交 解决了更新丢失但是会引起脏读, 二个session.sessionA中 ...
- Java-数组拷贝
数组拷贝 首先了解深拷贝 浅拷贝数组的四种拷贝方式: 1.for循环拷贝 代码示例: import java.util.Arrays; public class TestDemo{ public st ...
- P5132 Cozy Glow之拯救小马国
题目描述 Cozy Glow偷偷摸摸的造了一个魔法阵,这个魔法阵在吸取小马国的魔力,所以你得赶紧把它毁掉. 这个魔法阵由若干个神器组成,每个神器都有一个法力值,每两个神器之间也都有一个关联值.你要依次 ...
- Centos acme.sh 申请 LetsEncrypt 通配证书
1. 安装 acme.sh 注意:如果需要使用 Standalone Mode请先安装socat# yum intall socat It is recommended to install soca ...