Spring Profile与PropertyPlaceholderConfigurer实现项目多环境配置切换

最近考虑项目在不同环境下配置的切换,使用profile注解搭配PropertyPlaceholderConfigurer实现对配置文件的切换,简单写了个demo记录下实现。

基本知识介绍

@Profile

@Profile通过对bean进行修饰,来限定spring在bean管理时的初始化情况,只有环境中激活的profile状态和修饰的value值对应时,该bean才会被顺利加载并管理。

PropertyPlaceholderConfigurer

PropertyPlaceholderConfigurer是PlaceholderConfigurerSupport的实现类,是spring提供的一个解析yml或properties配置文件并将对应的值进行映射,通过${}形式进行调用的配置读取类。举例来说,配置文件中akb.num=48,那么在bean或配置文件中使用${akb.num}即可获取配置的值48。

简单实现

profile修饰的bean实例在不同环境下的切换

首先定义bean接口与default、dev、prob三种情况下的bean。
接口 DeafultProfileBean

@Component
public interface DefaultProfileBean {String getInfo();
}

default bean ProfileBeanDefault

@Profile("default")
@Component
public class ProfileBeanDefault implements DefaultProfileBean{@Overridepublic String getInfo() {return "这是default状态下的bean";}
}

dev bean ProfileBeanDev

@Profile("dev")
@Component
public class ProfileBeanDev implements DefaultProfileBean{@Overridepublic String getInfo(){return "这是dev环境使用的bean";
}
}

dev bean ProfileBeanProd

@Profile("prod")
@Component
public class ProfileBeanProd implements DefaultProfileBean{@Overridepublic String getInfo() {return "这是prod环境使用的bean";
}
}

加载上下文并输出加载的bean结果

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();// 设置profile环境context.getEnvironment().setActiveProfiles("dev");context.scan("com.huiluczP");context.refresh();System.out.println("loading success");DefaultProfileBean bean = context.getBean(DefaultProfileBean.class);System.out.println(bean.getInfo());

切换profile环境后的不同输出结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
可以看出@Profile注解生效了。

配置类和配置文件

SpringConfigure配置类

@Configuration
public class SpringConfigure {@Bean@Profile("default")// 默认状态配置加载类public PropertyPlaceholderConfigurer defaultConfig(){PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();Resource resource = new ClassPathResource("config/default.properties");ppc.setLocation(resource);return ppc;}@Bean@Profile("dev")// dev状态配置加载类public PropertyPlaceholderConfigurer devConfig(){PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();Resource resource = new ClassPathResource("config/dev.properties");ppc.setLocation(resource);return ppc;}@Bean@Profile("prod")// prod状态配置加载类public PropertyPlaceholderConfigurer prodConfig(){PropertyPlaceholderConfigurer ppc = new PropertyPlaceholderConfigurer();Resource resource = new ClassPathResource("config/prod.properties");ppc.setLocation(resource);return ppc;}}

管理了三个PropertyPlaceholderConfigurer类型的配置读取类,分别对应不同的profile状态。通过ClassPathResource读取对应的配置文件,如果用xml配置文件进行PropertyPlaceholderConfigurer bean的管理,直接增加property location,将value设置为对应的配置文件地址即可。

三个不同的配置文件内容:

default.properties

config.info=default information

dev.properties

config.info=dev information

prod.properties

config.info=prod information

配置获取测试接口和bean类

public interface DefaultConfigBean {String getConfigInfo();
}
@Component
public class DifferentConfigBean implements DefaultConfigBean{@Value("${config.info}")private String config;@Overridepublic String getConfigInfo() {return "当前环境下的config信息为:" + config;}
}

通过${config.info}实现对配置文件的获取。

加载上下文进行处理

        AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext();// 设置profile环境context.getEnvironment().setActiveProfiles("prod");context.scan("com.huiluczP");context.refresh();DefaultConfigBean configBean = context.getBean(DefaultConfigBean.class);System.out.println(configBean.getConfigInfo());

切换环境输出结果:

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

profile激活

特别的,说明下对项目profile环境怎么进行设置以对profile进行激活。没有特别指定时,默认调用default修饰的bean。

  1. 直接上下文设定,也就是上文中使用的,对enviroment中的activeProfile进行设置即可。
  2. web项目中可以在web.xml中设置全局的变量:
<context-param><param-name>spring.profiles.alive</param-name><param-value>dev</param-value>
</context-param>
  1. 如果是springMVC管理,可以在DispatcherServlet的配置中增加init-param:
<init-param><param-name>spring.profiles.alive</param-name><param-value>dev</param-value>
</init-param>
  1. 可以在jvm的运行属性中设置,tomcat等服务器的启动option也可设置jvm属性。
-Dspring.profiles.active=dev
  1. 对测试类使用注解@ActiveProfiles进行修饰,value设置为对应的环境。

总结

简单记录了一下spring profile和PropertyPlaceholderConfigurers类实现不同环境下的不同配置文件加载的方法,在分支中进行快速切换还是挺方便的,而且PropertyPlaceholderConfigurer映射的配置在spring读取其他的配置文件时也可以通过${}进行读取,这样不同的环境配置文件只需要一份,并将其中需要变动的部分用PropertyPlaceholderConfigurer进行管理即可。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/86624.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[NOIP2003 普及组] 栈

题目背景 栈是计算机中经典的数据结构&#xff0c;简单的说&#xff0c;栈就是限制在一端进行插入删除操作的线性表。 栈有两种最重要的操作&#xff0c;即 pop&#xff08;从栈顶弹出一个元素&#xff09;和 push&#xff08;将一个元素进栈&#xff09;。 栈的重要性不言自…

三、MySql表的操作

文章目录 一、创建表&#xff08;一&#xff09;语法&#xff1a;&#xff08;二&#xff09;说明&#xff1a; 二、创建表案例&#xff08;一&#xff09;代码&#xff1a;&#xff08;二&#xff09;说明&#xff1a; 三、查看表结构&#xff08;一&#xff09;语法&#xff…

C#随机法 双峰函数 求极值 避免落入局部最优解

避免落入局部最优解&#xff0c;只要让步长够长即可。 x1 resultX1 random1.NextDouble()*100; 如果后面不乘以100&#xff0c;则很大概率落入负数的最大值 Random random1 new Random(DateTime.Now.Millisecond);double x1 0, resultX10,max-999999,maxTemp0;for (int i …

【二分+贪心】CF1622 C

Problem - 1622C - Codeforces 题意&#xff1a; 思路&#xff1a; 首先&#xff0c;观察样例可知&#xff0c;肯定是把原本的最小值减到某个值&#xff0c;然后再复制几次 复制的时候肯定是从大到小复制 那把最小值减到哪个值是不确定的&#xff0c;考虑枚举这个值&#x…

【React学习】—类式组件(六)

【React学习】—类式组件&#xff08;六&#xff09; <script type"text/babel">//创建类式组件class MyComponent extends React.Component{render() {// render是放在哪里的&#xff1f;MyComponent的原型对象上&#xff0c;供实例使用// render中的this是谁…

构建Docker容器监控系统(2)(Cadvisor +Prometheus+Grafana)

Cadvisor产品简介 Cadvisor是Google开源的一款用于展示和分析容器运行状态的可视化工具。通过在主机上运行Cadvisor用户可以轻松的获取到当前主机上容器的运行统计信息&#xff0c;并以图表的形式向用户展示。 接着上一篇来继续 部署Cadvisor 被监控主机上部署Cadvisor容器…

Flink多流处理之Broadcast(广播变量)

写过Spark批处理的应该都知道,有一个广播变量broadcast这样的一个算子,可以优化我们计算的过程,有效的提高效率;同样在Flink中也有broadcast,简单来说和Spark中的类似,但是有所区别,首先Spark中的broadcast是静态的数据,而Flink中的broadcast是动态的,也就是源源不断的数据流.在…

Docker 安装和架构说明

Docker 并非是一个通用的容器工具&#xff0c;它依赖于已存在并运行的Linux内核环境。 Docker实质上是在已经运行的Liunx下制造了一个隔离的文件环境&#xff0c;因此他的执行效率几乎等同于所部署的linux主机。因此Docker必须部署在Linux内核系统上。如果其他系统想部署Docke…

阿里云服务器部署Drupal网站教程基于CentOS系统

阿里云百科分享如何在CentOS 7操作系统的ECS实例上搭建Drupal电子商务网站。Drupal是使用PHP语言编写的开源内容管理框架&#xff08;CMF&#xff09;&#xff0c;它由内容管理系统&#xff08;CMS&#xff09;和PHP开发框架&#xff08;Framework&#xff09;共同构成。它用于…

LeetCode 206.反转链表

文章目录 &#x1f4a1;题目分析&#x1f4a1;解题思路&#x1f6a9;方法1: 反转指针指向&#x1f514;接口源码&#xff1a;&#x1f6a9;方法2:取节点头插&#x1f514;接口源码&#xff1a; 题目链接&#x1f449;LeetCode 206.反转链表&#x1f448; &#x1f4a1;题目分析…

2023网络安全常用工具汇总(附学习资料+工具安装包)

几十年来&#xff0c;攻击方、白帽和安全从业者的工具不断演进&#xff0c;成为网络安全长河中最具技术特色的灯塔&#xff0c;并在一定程度上左右着网络安全产业发展和演进的方向&#xff0c;成为不可或缺的关键要素之一。 话不多说&#xff0c;网络安全10款常用工具如下 1、…

【PostgreSQL内核学习(十一)—— OpenGauss源码学习(CopyTo)】

可优化语句执行 概述什么是列存储&#xff1f;列存的优势 相关函数CopyToCStoreCopyToCopyStatetupleDescCStoreScanDesc CStoreBeginScanRelationSnapshotProjectionInfo GetCStoreNextBatchRunScanFillVecBatchCStoreIsEndScan CStoreEndScan 声明&#xff1a;本文的部分内容…

Centos 从0搭建grafana和Prometheus 服务以及问题解决

下载 虚拟机下载 https://customerconnect.vmware.com/en/downloads/info/slug/desktop_end_user_computing/vmware_workstation_player/17_0 cenos 镜像下载 https://www.centos.org/download/ grafana 服务下载 https://grafana.com/grafana/download/7.4.0?platformlinux …

【C语言】结构体详解

现实生活中一个事物&#xff0c;会有许多属性连接起来。而C语言引入一种构造数据类型——结构体 将属于一个事物的多个数据组织起来以体现其内部联系。 一、结构体类型的定义 结构体类型 是一种 构造类型&#xff0c;它是由若干成员组成的&#xff0c;每个成员可以是一个基本…

springBoot集成caffeine,自定义缓存配置 CacheManager

目录 springboot集成caffeine Maven依赖 配置信息&#xff1a;properties文件 config配置 使用案例 Caffeine定制化配置多个cachemanager springboot集成redis并且定制化配置cachemanager springboot集成caffeine Caffeine是一种基于服务器内存的缓存库。它将数据存储在…

零拷贝详解

1、在没有DMA技术之前的I/O过程是这样的&#xff1a; CPU发出对应的指令给磁盘控制器&#xff0c;然后返回磁盘控制器收到指令后&#xff0c;于是就开始准备数据&#xff0c;会把数据放入到磁盘控制器的内部缓冲区&#xff0c;然后产生中断CPU收到中断信号后&#xff0c;停下手…

springBoot的日志文件

日志是程序的重要组成部分&#xff0c;主要可以用来定位和排查问题。除此之外&#xff0c;还可以用来&#xff1a; 1. 记录用户的登录日志&#xff0c;方便分析用户是正常登录还是恶意破解&#xff1b; 2. 记录系统的操作日志&#xff0c;方便数据恢复和定位操作人&#xff1b;…

过滤器,监听器与拦截器的区别

过滤器&#xff0c;监听器与拦截器的区别 ​ 过滤器和监听器不是Spring MVC中的组件&#xff0c;而是Servlet的组件&#xff0c;由Servlet容器来管理。拦截器是Spring MVC中的组件&#xff0c;由Spring容器来管理 ​ Servlet过滤器与Spring MVC 拦截器在Web应用中所处的层次如…

javaWeb项目--二级评论完整思路

先来看前端需要什么吧&#xff1a; 通过博客id&#xff0c;首先需要显示所有一级评论&#xff0c;包括评论者的头像&#xff0c;昵称&#xff0c;评论时间&#xff0c;评论内容 然后要显示每个一级评论下面的二级评论&#xff0c;包括&#xff0c;评论者的头像&#xff0c;昵称…

【Spring】-Spring中Bean对象的存取

作者&#xff1a;学Java的冬瓜 博客主页&#xff1a;☀冬瓜的主页&#x1f319; 专栏&#xff1a;【Framework】 主要内容&#xff1a;往spring中存储Bean对象的三大方式&#xff1a;XML方式(Bean标签)&#xff1b;五大类注解&#xff1b;方法注解。从spring中取对象的两种方式…