SpringBoot框架自定义解析配置项占位符(${})获取配置

一、前言

在最近项目开发中,有一个需求,针对自定义注解中字符串属性值的设置需要支持使用”${xx}“占位符获取在SpringBoot框架配置文件中配置项对应的属性值,而且支持多个”${xx}“标识的配置任意拼接。

二、功能实现

从实现思路上说还是很简单的,可以通过正则表达式,匹配出包含“${xx}”的字符串,然后将占位符"${}“去掉,用配置项从spring容器环境变量中获取对应属性值替换即可。

1. 参考实现代码

定义获取Spring Boot配置项内容工具类:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.core.env.Environment;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;import javax.annotation.PostConstruct;
import java.util.regex.Matcher;
import java.util.regex.Pattern;@Component
public class SpringEnvUtils {/*** * 注入spring框架环境变量*/@Autowiredprivate Environment environment;public static SpringEnvUtils springEnvUtils;/*** * 通过@PostConstruct的特性,将当期对象赋予静态变量*/@PostConstructpublic void init() {springEnvUtils = this;}private static Pattern VAR_COMPILE;static {// 定义需要解析的正则表达式String pattern = "\\$\\{.+?\\}";VAR_COMPILE = Pattern.compile(pattern);}/*** * 环境变量占位符前缀*/private static final String VAR_FLAG_PREFIX = "${";/*** * 环境变量占位符后缀*/private static final String VAR_FLAG_SUFFIX = "}";/*** * 通过解析占位符key获取对应的Spring容器环境变量属性值,如${server.port}* @param key* @return* */public static String getPropertyWithVarFlag(String key) {if (StringUtils.hasLength(key)) {// if (key.contains(VAR_FLAG_PREFIX)) { // 判断是否包含占位符信息Matcher matcher = VAR_COMPILE.matcher(key);while (matcher.find()) {//如果匹配到了,则进行替换String varKey = matcher.group();String value = getProperty(varKey.replace(VAR_FLAG_PREFIX, "").replace(VAR_FLAG_SUFFIX, ""));key = key.replace(varKey, value);}// }return key;}return key;}/*** * 通过key获取对应的Spring容器环境变量属性值* @param key* @return*/public static String getProperty(String key) {return springEnvUtils.environment.getProperty(key);}
}

2. 功能测试

  • 测试代码
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;/**
* 程序启动入口
*/
@SpringBootApplication
public class Main {public static void main(String[] args) throws Exception {SpringApplication.run(Main.class, args);// 表达式中存在${}标识的占位符String withVarFlag = SpringEnvUtils.getPropertyWithVarFlag("application port is : ${server.port}");System.out.println("表达式中存在${}标识的占位符:" + withVarFlag);// 普通字符串String noVarFlag = SpringEnvUtils.getPropertyWithVarFlag("hello, spring boot.");System.out.println("\n普通字符串:" + noVarFlag);}
}

测试结果:
在这里插入图片描述

由此就可以实现SpringBoot框架自定义解析配置项占位符(${})获取配置的功能了,以上实现只作为参考,实际开发中可进行进一步优化。

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

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

相关文章

rust跟我学二:模块编写与使用

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info中模块的使用。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址:[我的Rust库更新]g…

iphone 5s的充电时序原理图纸,iPAD充电讲解

上一篇写了iphone 5的时序。那是电池供电的开机时序。iphone 5s也是差不多的过程,不说了。现在看iphone5s手机充电时候的时序。iphone5s充电比iphone5充电简单了很多。 首先是usb接口接到手机上,usb线连接到J7接口上。J7接口不只是接usb,还能…

05-python之函数-函数的定义/函数的参数/函数返回值/函数说明文档/函数的嵌套使用/函数变量的作用域

01-函数的介绍 """ 演示:快速体验函数的开发及应用 ​ """ #需求,统计字符串的长度,不使用内置函数len() str1 "itheima" str2 "itcast" str3 "python" ​ #定义一个技术的变…

2-认识小程序项目

基本结构 myapp├─miniprogram┊ └──pages┊ ┊ └──index┊ ┊ ┊ ├──index.json┊ ┊ ┊ ├──index.ts┊ ┊ ┊ ├──index.wxml┊ ┊ ┊ └──index.wxss┊ ┊ └──logs┊ ┊ ├──index.json┊ ┊ ├──index.ts┊ ┊ ├…

学习JavaEE的日子 day13 封装 static private this 类加载机制

Day13 1. private – 私有化 理解:private是访问修饰符的一种,访问修饰符规定了访问权限. 作用: ​ 1.private修饰属性:该属性只能在类的内部使用 ​ 2.private修饰方法:该方法只能在类的内部使用 应用场景&#xff1…

ArcGIS Pro 拓扑编辑和常见一些拓扑错误处理

7.4 拓扑编辑 拓扑编辑也叫共享编辑,多个数据修改时,一块修改,如使用数据:chp7\拓扑检查.gdb,数据集DS下JZX、JZD和DK,加载地图框中,在“地图”选项卡下选择“地图拓扑”或“ds_Topology(地理数据库)”&…

如何将github copilot当gpt4用

现在写代码已经离不开ai辅助了我用的是github copilot,一方面是因为它和vscode结合得比较好,另一方面就是copilot chat了。可以在不切换工具的情况下,问它问题,在copilot chat还在内测阶段的时候我就申请使用了(现在已…

HCIA——12题目-1章选择

学习目标: 计算机网络 1.掌握计算机网络的基本概念、基本原理和基本方法。 2.掌握计算机网络的体系结构和典型网络协议,了解典型网络设备的组成和特点,理解典型网络设备的工作原理。 3.能够运用计算机网络的基本概念、基本原理和基本方法进行…

go语言(一)----声明常量

package mainimport ("fmt""time" )func main() {fmt.Print("hello go!")time.Sleep(1 * time.Second)}运行后,结果如下: 1、golang表达式中,加;和不加;都可以 2、函数的{和函数名一…

三种引入CSS的方式

文章目录 CSS基础知识概述CSS的注释CSS的格式 三种引入CSS的方式内嵌式外链式行内式优先级 CSS基础知识 概述 Cascading Style Sheet 层叠样式表 前端三大基础之一(Html结构 CSS样式 JS动作) 最早由网景公司(Netscape)提出,在1996年受到w…

vivado Revision Control

2020.2 只需要git 管理 prj.xpr 和 prj.srcs/ https://china.xilinx.com/video/hardware/ip-revision-control.html Using Vivado Design Suite with Revision Control https://www.xilinx.com/video/hardware/vivado-design-suite-revision-control.html http://www.xi…

行为型设计模式——中介者模式

中介者模式 中介者模式主要是将关联关系由一个中介者类统一管理维护,一般来说,同事类之间的关系是比较复杂的,多个同事类之间互相关联时,他们之间的关系会呈现为复杂的网状结构,这是一种过度耦合的架构,即…