spring通过@Profile解决环境变量的问题
时间:2022-07-25
本文章向大家介绍spring通过@Profile解决环境变量的问题,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
背景
在profile推出之前,通过不同系统的环境变量切换,通过一些手动或者写死的方法进行切换非常费时费力,而且有些系统来回几套系统在切换的时候经常性出现各种问题...
spring @profile解决什么问题?
spring profile是Spring Framework 3.1以后推出一个解决切换环境变量的注解。主要解决一个环境问题切换的问题,其原理就是通过spring di在注入的时候通过环境变量来判断注入相应的环变量,以达到减少配置问题引起的各种麻烦。
个人理解:就是通过环境变量中的不同值来判断是正式环境、测试环境、开发环境、本地环境等。
源码实现:
/**
* @Auther: csh
* @Date: 2020/7/10 15:18
* @Description:系统环境
*/
public class SystemConfig {
private String systemInfo;
public SystemConfig(String systemInfo) {
this.systemInfo = systemInfo;
}
public String getSystemInfo() {
return systemInfo;
}
public void setSystemInfo(String systemInfo) {
this.systemInfo = systemInfo;
}
}
/**
* @Auther: csh
* @Date: 2020/7/10 15:20
* @Description:环境配置
*/
@Configuration
public class EnvironmentConfig {
@Profile("dev")
@Bean
public SystemConfig getTest(){
return new SystemConfig("dev222222");
}
@Profile("idc")
@Bean
public SystemConfig getIDC(){
return new SystemConfig("idc2222222222");
}
}
/**
* @Auther: csh
* @Date: 2020/7/10 10:43
* @Description:
*/
public class ProfileTest {
public static void main(String[] args) {
//从类路径的xm文件载入上下文定义的信息
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
System.out.println("context 已启动!");
context.getEnvironment().setActiveProfiles("idc");
//注册主配置类
context.register(EnvironmentConfig.class);
context.refresh();
SystemConfig bean = context.getBean(SystemConfig.class);
System.out.println(bean.getSystemInfo());
AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext();
context2.getEnvironment().setActiveProfiles("dev");
//注册主配置类
context2.register(EnvironmentConfig.class);
context2.refresh();
SystemConfig bean2 = context2.getBean(SystemConfig.class);
System.out.println(bean2.getSystemInfo());
}
}
context 已启动!
七月 10, 2020 3:24:13 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Fri Jul 10 15:24:13 CST 2020]; root of context hierarchy
idc
七月 10, 2020 3:24:14 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7dc222ae: startup date [Fri Jul 10 15:24:14 CST 2020]; root of context hierarchy
dev
context 已启动!
七月 10, 2020 3:25:04 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Fri Jul 10 15:25:04 CST 2020]; root of context hierarchy
idc2222222222
七月 10, 2020 3:25:04 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@7dc222ae: startup date [Fri Jul 10 15:25:04 CST 2020]; root of context hierarchy
dev222222
当然也可以通过jvm来进行配置
/**
* @Auther: csh
* @Date: 2020/7/10 10:43
* @Description:profile测试
*/
public class ProfileTest {
public static void main(String[] args) {
//从类路径的xm文件载入上下文定义的信息
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();
System.out.println("context 已启动!");
// context.getEnvironment().setActiveProfiles("idc");
//注册主配置类
context.register(EnvironmentConfig.class);
context.refresh();
SystemConfig bean = context.getBean(SystemConfig.class);
System.out.println(bean.getSystemInfo());
AnnotationConfigApplicationContext context2 = new AnnotationConfigApplicationContext();
// context2.getEnvironment().setActiveProfiles("dev");
//注册主配置类
context2.register(EnvironmentConfig.class);
context2.refresh();
SystemConfig bean2 = context2.getBean(SystemConfig.class);
System.out.println(bean2.getSystemInfo());
}
}
context 已启动!
七月 10, 2020 3:30:44 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@37bba400: startup date [Fri Jul 10 15:30:44 CST 2020]; root of context hierarchy
idc2222222222
七月 10, 2020 3:30:44 下午 org.springframework.context.annotation.AnnotationConfigApplicationContext prepareRefresh
信息: Refreshing org.springframework.context.annotation.AnnotationConfigApplicationContext@6483f5ae: startup date [Fri Jul 10 15:30:44 CST 2020]; root of context hierarchy
idc2222222222
注:
org.springframework.core.env.ConfigurableEnvironment#setActiveProfiles的等级优于VM options
代码下载:https://gitee.com/hong99/spring/issues/I1N1DF
参考文章:
https://spring.io/blog/2011/02/14/spring-3-1-m1-introducing-profile
https://blog.csdn.net/weixin_43950568/article/details/104256427?ops_request_misc=&request_id=&biz_id=102&utm_term=@Profile&utm_medium=distribute.pc_search_result.none-task-blog-2~all~sobaiduweb~default-3-104256427
- 除法取模与逆元/费马小定理
- [快学Python3]类基础
- 邻接矩阵存储有向图(详解)
- [快学Python3]二分查找[策略优化版本]
- 使用 zipfile 解压含有中文文件名的 zip 文件
- qsc oj 22 哗啦啦村的刁难(3)(随机数,神题)
- [快学Python3]数据结构与算法-二分查找
- [快学Python3]数据结构-队列
- 51Nod 1090 3个数和为0(暴力)
- qscoj 128 喵哈哈村的魔法源泉(2)(模仿快速幂,好题)
- POJ 3624 Charm Bracelet(01背包裸题)
- 2015 计蒜之道 初赛(4)爱奇艺的自制节目(枚举 贪心)
- Codeforces 810C Do you want a date?(数学,前缀和)
- [快学Python3]数据结构-堆栈
- java教程
- Java快速入门
- Java 开发环境配置
- Java基本语法
- Java 对象和类
- Java 基本数据类型
- Java 变量类型
- Java 修饰符
- Java 运算符
- Java 循环结构
- Java 分支结构
- Java Number类
- Java Character类
- Java String类
- Java StringBuffer和StringBuilder类
- Java 数组
- Java 日期时间
- Java 正则表达式
- Java 方法
- Java 流(Stream)、文件(File)和IO
- Java 异常处理
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- Java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java 序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
- Docker Dockerfile 指令详解与实战案例
- flume kafka和sparkstreaming整合
- Docker如何搭建私有registry镜像仓库
- Harbor介绍与企业级私有Docker镜像仓库搭建
- 如何查看docker run启动参数命令
- YAML 语言教程与使用案例
- 计算等压面要素场的基本检验指标
- Kubernetes K8S之SSL证书有效期修改
- Kubernetes K8S之通过yaml文件创建Pod与Pod常用字段详解
- Kubernetes K8S之kubectl命令详解及常用示例
- Kubernetes K8S之Pod 生命周期与init container初始化容器详解
- Kubernetes K8S之Pod生命周期与探针检测
- Kubernetes K8S之Pod 生命周期与postStart、preStop事件
- Kubernetes K8S之资源控制器RC、RS、Deployment详解
- python教程 | 最标准的地图调用方式(国家测绘局提供数据)