Springboot profile多环境配置
1. 前言
profile用于多环境的激活和配置,用来切换生产,测试,本地等多套不通环境的配置。如果每次去更改配置就非常麻烦,profile就是用来切换多环境配置的。
2. 配置方法
三种方式。
2.1 多profile文件方式
在resource目录下新增三个配置文件,分别用于开发环境、测试环境、生产环境:
- application-dev.properties
- application-test.properties
- application-prod.properties
注意这里如果使用yml配置文件也是一样的思路: - application-dev.yml
- application-test.yml
- application-prod.yml
在主配置文件中就可以指定当前使用哪个配置文件,具体例如:
#控制激活指定后缀的文件,此时
#application-prod.properties文件会被激活
spring.profiles.active=prod
这样就激活了生产环境的配置,实际就会使用application-prod.properties(或application-prod.yml)下的配置。(注:yml和properties可以互通,application.properties可以激活yml后缀的配置文件,同样application.yml也可以激活application.properties文件)
2.2 yml多文档方式
上面是通过创建三个配置文件分离了不同环境下的配置,然后指定哪个就用哪个。而yml多文档实际上就是在一个yml配置文件下同时放了三个配置,用三个横杠分割不同的配置,这在yml中,就叫做多文档。本质上和方式一思路是一样的。
在每个块下指定自己的配置名称spring.profiles。然后再在最后设置spring.profiles.active以选择激活的配置。
#多文档配置方式
spring:profiles: test
server:port: 9081
--- #分割必须是三个横线,不能多不能少
spring:profiles: dev
server:port: 9082
--- #分割必须是三个横线,不能多不能少
spring:profiles: prod
server:port: 9083
--- #分割必须是三个横线,不能多不能少
spring:profiles:active: prod #激活使用spring.profiles=prod的配置块
2.3 注解方式
在Spring中,可以使用配置文件的方式来指定不同环境下所需要的配置信息。但有时候,我们不通过配置文件,而是通过配置类的方式来指定不同环境下的配置信息,
此时就需要用到@Profile注解。
例如我们封装一个数据库的配置:
1)创建用来封装数据库信息的entity
import lombok.Builder;
import lombok.Data;@Builder
@Data
public class DBInfoEntity {private String url;private String port;private String userName;private String password;
}
2)创建个配置接口:
public interface Config {// 获取数据库信息DBInfoEntity getDBInfo();// 获取系统URLString getSystemUrl();
}
3)@Profile注解作用于实现的配置类上:
- 我们使用@Profile注解分别作用于如下所示的两个配置类上,分别指定dev和product环境下才能起作用。
- 我们通过@Configuration注解指定两个配置类的Bean名称都是MyConfig,一般情况下会报错,因为Spring的IOC容器中,Bean的名称是唯一的,但是我们使用了@Profile注解指定了开发环境,不满足指定开发环境的配置类不会被添加到Bean中,所以不会报错。
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;@Configuration("MyConfig")
// 指定开发环境为dev
@Profile("dev")
public class MyConfig1 implements Config {@Overridepublic DBInfoEntity getDBInfo() {return DBInfoEntity.builder().url("https://127.0.0.1").port("8080").userName("devUser").password("110120").build();}@Overridepublic String getSystemUrl() {return "https://www.dev.com";}
}
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.Profile;@Configuration("MyConfig")
// 指定开发环境为product
@Profile("product")
public class MyConfig2 implements Config {@Overridepublic DBInfoEntity getDBInfo() {return DBInfoEntity.builder().url("https://127.0.0.2").port("8089").userName("prodUser").password("999000").build();}@Overridepublic String getSystemUrl() {return "https://www.prod.com";}
}
4)测试:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;@Component
public class Test32Controller implements CommandLineRunner {// 注入接口,会自动从IOC容器中获取该接口的实现类@Autowiredprivate Config config;@Overridepublic void run(String... args) throws Exception {DBInfoEntity dbInfo = config.getDBInfo();System.out.println(dbInfo);String systemUrl = config.getSystemUrl();System.out.println(systemUrl);}
}
5)效果
-
dev环境:
-
product环境:
3. 激活方式
激活方式有以下三种。激活顺序优先级:命令行参数 > 虚拟机参数 > 配置文件
3.1 配置文件内指定激活
就是前面说的,在配置文件中通过设置spring.profiles.active,选择使用哪个配置文件。
3.2 虚拟机参数VM options
在IDEA中设置
-Dspring.profiles.active=test
3.3 命令行参数(program arguments)
在IDEA中设置
--spring.profiles.active=dev
这样就相当于在启动这个jar包时,自动在命令行注入了我们的参数spring.profiles.active=dev
当然也可以我们在生产环境中启动jar包时自己在命令行输入参数。具体如下:
1)打包项目mvn package
2)运行项目(以下三个命令之一即可)
#打包的配置文件里的默认激活方式
java -jar .\springboot-profile04-0.0.1-SNAPSHOT.jar
#激活dev配置文件运行项目(项目参数)
java -jar .\springboot-profile04-0.0.1-SNAPSHOT.jar --spring.profiles.active=dev
#激活test配置文件运行项目(虚拟机参数)
java -jar -Dspring.profiles.active=test .\springboot-profile04-0.0.1-SNAPSHOT.jar
相关文章:
Springboot profile多环境配置
1. 前言 profile用于多环境的激活和配置,用来切换生产,测试,本地等多套不通环境的配置。如果每次去更改配置就非常麻烦,profile就是用来切换多环境配置的。 2. 配置方法 三种方式。 2.1 多profile文件方式 在resource目录下新…...
(1)进程与线程区别
1.什么是线程、进程 进程:操作系统资源分配的基本单位线程:处理器任务调度和执行的基本单位。 一个进程至少有一个线程,线程是进程的一部分,所以线程也被称为轻权进程或者轻量级进程。 2.并行与并发 一个基本的事实前提&#x…...
学习JAVA打卡第四十天
对象的字符串表示 在此类中我们讲过,所有的类都默认是java.lang包中object类的子类或间接子类。 Object类有一个public String toString()方法,一个对象通过调用该方法可以获得该对象的字符串表示。一个对象调用toString法(&…...
【跟小嘉学 Rust 编程】十四、关于 Cargo 和 Crates.io
系列文章目录 【跟小嘉学 Rust 编程】一、Rust 编程基础 【跟小嘉学 Rust 编程】二、Rust 包管理工具使用 【跟小嘉学 Rust 编程】三、Rust 的基本程序概念 【跟小嘉学 Rust 编程】四、理解 Rust 的所有权概念 【跟小嘉学 Rust 编程】五、使用结构体关联结构化数据 【跟小嘉学…...
防关联指纹浏览器:高效地管理你的Facebook账户
Facebook,作为全球最受欢迎社交平台的第一名已经成为我们日常和工作中不可或缺的一部分了。不管是用于日常分享、媒体营销、还是店铺运营,Facebook都占据着重要的位置。多个Facebook账户的优势非常明显,然而,当你需要同时管理他们…...
前端学习记录~2023.8.15~JavaScript重难点实例精讲~第7章 ES6(1)
第 7 章 ES6 前言7.1 let关键字和const关键字7.1.1 let关键字(1)let关键字的特性(2)使用let关键字的好处 7.1.2 const关键字(1)const关键字的特性 7.2 解构赋值7.2.1 数组的解构赋值(1ÿ…...
WebSocket详解以及应用
😜作 者:是江迪呀✒️本文关键词:websocket、网络、长连接、前端☀️每日 一言:任何一个你不喜欢而又离不开的地方,任何一种你不喜欢而又无法摆脱的生活,都是监狱! 一、前言 我们在…...
如何评估开源项目的活跃度和可持续性?
🌷🍁 博主猫头虎 带您 Go to New World.✨🍁 🦄 博客首页——猫头虎的博客🎐 🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺 &a…...
远程Linux/ubuntu服务器后台不间断运行py文件/sh脚本
通常我们在生产环境中运行一些项目时需要将程序不间断的运行在服务器上,并且将日志文件打印到某个文件中,直到程序运行结束,下面介绍了在Linux服务器上不间断运行py文件的方式,以及如何保存相应的日志信息。 对于 .py 文件&#x…...
记录一个诡异的bug
将对接oa跳转到会议转写的项目oa/meetingtranslate项目发布到天宫,结果跳转到successPage后报错 这一看就是successPage接口名没对上啊,查了一下代码,没问题啊。 小心起见,我就把successPage的方法请求方式从Post改为Get和POST都…...
Xamarin.Android中的Fragment
目录 1、Activity中使用Fragment2、Fragment与Activity通信3、Fragment与其他的Fragment通信 1、Activity中使用Fragment 一般而言,会在activity中添加一个加载fragment的方法。通过点击菜单的按钮,加载不同的fragment。其样子一般是这样的:…...
portainer初体验
官方文档 安装 docker 这里采用的的是国内汉化的一个镜像,版本号2.16.2。 地址 docker run -d --restartalways --name"portainer" -p 9000:9000 -v /var/run/docker.sock:/var/run/docker.sock 6053537/portainer-ce体验 访问9000端口。 尝试&#x…...
4G数传方案(合宙cat1模块)
一. 合宙Cat1简介 合宙 Air724 模组推出的低功耗,超小体积,高性能嵌入式 4G Cat1 核心版,标准的 2.54 排针、最小成本的进项 2G、4G Cat4 切换;主要功能如下: 实际测试工作环境为-35℃-75℃; 支持 5-12V 供电或者 3.7…...
ElasticSearch - 海量数据索引拆分的一些思考
文章目录 困难解决方案初始方案及存在的问题segment merge引入预排序 拆分方案设计考量点如何去除冗余数据按什么维度拆分,拆多少个最终的索引拆分模型演进历程整体迁移流程全量迁移流程流量回放比对验证异步转同步多索引联查优化效果 总结与思考参考 困难 索引数据…...
【SA8295P 源码分析】83 - SA8295P HQNX + Android 完整源代码下载方法介绍
【SA8295P 源码分析】83 - SA8295P HQNX + Android 完整源代码下载方法介绍 一、高通官网 Chipcode 下载步骤介绍1.1 高通Chipcode 下载步骤1.2 高通 ReleaseNote 下载方法二、高通 HQX 代码介绍2.1 完整的 HQX 代码结构:sa8295p-hqx-4-2-4-0_hlos_dev_qnx.tar.gz2.2 sa8295p-…...
【设计模式--原型模式(Prototype Pattern)
一、什么是原型模式 原型模式(Prototype Pattern)是一种创建型设计模式,它的主要目的是通过复制现有对象来创建新的对象,而无需显式地使用构造函数或工厂方法。这种模式允许我们创建一个可定制的原型对象,然后通过复制…...
初识 Redis
初识 Redis 1 认识NoSQL1.1 结构化与非结构化1.2 关联和非关联1.3 查询方式1.4. 事务1.5 总结 2 Redis 概述2.1 应用场景2.2 特性 3 Resis 全局命令4 Redis 基本数据类型4.1 String4.1.1 常用命令4.1.2 命令的时间复杂度4.1.3 使用场景 4.2 Hash4.2.1 常用命令4.2.2 命令的时间…...
php灵异事件,啥都没干数据变了?
这篇文章也可以在我的博客查看 搞WordPress,难免跟php打交道 然而这弱类型语言实在坑有点多 这不今儿又踩了个大坑直接时间-1😅 问题 话不多说直接上代码 <?php $items [1,2];foreach ($items as &$item) {/*empty loop*/} print_r($items)…...
【ffmpeg】基于需要使用videocapture的opencv编译配置(C++)
目录 配置简介ffmpeg源码编译方法记录gstreamer命令行安装方法opencv的编译项记录 配置简介 opencv使用videocapture读取视频流时,需要借助底层的ffmpeg库。如果不能正确编译,会报错,现记录正确编译配置方法。 ffmpeg源码编译方法记录 ope…...
Redisson分布式锁 原理源码 分析
# 基于setnx实现的分布式锁存在的问题: # 为了解决上面的问题,可以用Redisson # Redisson入门 # Redisson可重入锁原理 获取锁的Lua脚本: 释放锁的Lua脚本: # 锁重试原理分析 tryLock()底层代码分析 tim…...
Cocos独立游戏开发框架中的事件管理器
引言 本系列是《8年主程手把手打造Cocos独立游戏开发框架》,欢迎大家关注分享收藏订阅。在独立游戏开发中,事件管理器是一个不可或缺的组件。它为开发者提供了一种灵活的方式来处理游戏内部各种状态变化和用户交互,实现模块之间的解耦和通信…...
keepalived+haproxy 搭建高可用高负载高性能rabbitmq集群
一、环境准备 1. 我这里准备了三台centos7 虚拟机 主机名主机地址软件node-01192.168.157.133rabbitmq、erlang、haproxy、keepalivednode-02192.168.157.134rabbitmq、erlang、haproxy、keepalivednode-03192.168.157.135rabbitmq、erlang 2. 关闭三台机器的防火墙 # 关闭…...
网络安全(黑客)零基础自学
网络安全是什么? 网络安全,顾名思义,网络上的信息安全。 随着信息技术的飞速发展和网络边界的逐渐模糊,关键信息基础设施、重要数据和个人隐私都面临新的威胁和风险。 网络安全工程师要做的,就是保护网络上的信息安…...
如何把本地项目上传github
一、在gitHub上创建新项目 【1】点击添加()-->New repository 【2】填写新项目的配置项 Repository name:项目名称 Description :项目的描述 Choose a license:license 【3】点击确定,项目已在githu…...
跳跃游戏【贪心算法】
跳跃游戏 给你一个非负整数数组 nums ,你最初位于数组的 第一个下标 。数组中的每个元素代表你在该位置可以跳跃的最大长度。 判断你是否能够到达最后一个下标,如果可以,返回 true ;否则,返回 false 。在这里插入图片…...
vue2+element-ui 实现下拉框滚动加载
一、自定义滚动指令。 VUE.directive( el-select-loadmore: { bind(el, binding) { const SELECTWRAP_DOM el.querySelector(.el-select-dropdown .el-select-dropdown__wrap) SELECTWRAP_DOM.addEventListener(scroll, function () { /*…...
探索AIGC人工智能(Midjourney篇)(二)
文章目录 利用Midjourney进行LOGO设计 用ChatGPT和Midjourney的AI绘画,制作儿童绘本故事 探索Midjourney换脸艺术 添加InsightFaceSwap机器人 Midjourney打造专属动漫头像 ChatGPT Midjourney画一幅水墨画 Midjourney包装设计之美 Midjourney24节气海报插画…...
01-Flask-简介及环境准备
Flask-简介及环境准备 前言简介特点Flask 与 Django 的比较环境准备 前言 本篇来介绍下Python的web框架–Flask。 简介 Flask 是一个轻量级的 Web 框架,使用 Python 语言编写,较其他同类型框架更为灵活、轻便且容易上手,小型团队在短时间内…...
【Git游戏】远程分支
origin/<branch> 远程分支在本地以 origin/<branch>格式存在,他指向上次和远程分支通过时的记录 git checkout origin/<branch> 会出现HEAD分离的情况 与远程通讯 git fetch —— 从远端获取数据(实际上将本地仓库中的远程分支更新…...
Day07-ElementUI
Day02-ElementUI 一 菜单设计 1 静态菜单 a 在components文件夹中新建一个组件Menu.vue <template><div class="menu-wrap"><el-menuclass="el-menu-vertical-demo"background-color="#031627"text-color="#fff"ac…...
高品质的网站设计制作/销售外包公司
什么是小文件?在生产中,我们往往将Spark SQL作为Hive的替代方案,以获得SQL on Hadoop更出色的性能。因此,本文所讲的是指存储于HDFS中小文件,即指文件的大小远小于HDFS上块(dfs.block.size)大小…...
wordpress顶部工具栏/江门网站定制多少钱
转载于:https://www.cnblogs.com/tokpick/p/9525751.html...
成都网站建设与开发/南京关键词优化服务
在传统的asp.net开发中,数据的验证一直是个火热的话题,无论是客户端进行验证还是服务器进行验证,通常我们都会为了一个简单的业务而要去写非常复杂的验证方法。在MVC中,MVC为我们提供了各种数据注解和数据验证的特性,很…...
网站进行规划与设计/免费建网站哪家好
研究GSON花费了我一天的时间,期间出现了各种问题,第一次可以理解嘛,不过还好在安卓开发交流22群几位大神的帮助和我极大的耐心一下终于搞出来了,多谢几位大神,这里体现出了技术交流的重要性,一个人不可能所…...
兰州移动端网站建设/数据分析师一般一个月多少钱
数据电路:在线路式信道上加信号变换设备后形成的二进制比特流通路,由传输信道及两端的数据电路终端设备DCE组成。 数据链路:在数据电路已建成的基础上,通过发送方和接收方之间的交换握手信号使双方确认后方可开始传输数据的两个或…...
建设银行大学华东学院网站/seo数据是什么
经过一年的积淀,感觉自己A题目的能力下降了,没别的,就是挑战一下自己,看看自己能够做出多少题目。当我第一眼看到题目的时候感觉傻眼了,一个也没有产生思路,但是静下心来时候就会慢慢会点了。第一个是字符串…...