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

news2024/11/28 23:18:27

一、前言

在最近项目开发中,有一个需求,针对自定义注解中字符串属性值的设置需要支持使用”${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框架环境变量
     */
    @Autowired
    private Environment environment;
    
    public static SpringEnvUtils springEnvUtils;

    /*** 
     * 通过@PostConstruct的特性,将当期对象赋予静态变量
      */
    @PostConstruct
    public 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.coloradmin.cn/o/1392475.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nas-群晖docker查询注册表失败解决办法(平替:使用SSH命令拉取ddns-go)

一、遇到问题 群晖里面的docker图形化界面现在不能直接查询需要下载的东西,原因可能就是被墙了,那么换一种方式使用SSH命令下载也是可以的,文章这里以在docker里面下载ddns-go为例子。 二、操作步骤 (一)打开群晖系统…

STM32 TIM输出比较、PWM波形

单片机学习! 目录 一、输出比较简介 二、PWM简介 三、输出比较通道 3.1通用定时器的输出比较部分电路 3.2高级定时器的输出比较部分电路 四、输出模式控制器 五、PWM基本结构 六、PWM参数计算 总结 前言 文章讲述STM32定时器的输出比较功能,它主…

【C++】explicit的作用 --- 2024.1.17

目录 explicit的作用结束语 explicit的作用 先看示例代码: class Maker { public:Maker(int n){} }; int main() {Maker m 10; }在上述代码中,main函数里我们实例化对象名称为m,并且赋值为10,作为有参构造函数的参数。但是实际…

libzmq XPUB/XSUB模型

libzmq XPUB/XSUB模型 与PUB/SUB功能类似,但是使用场景不一样.普通用法我就不说了,XPUB/XSUB典型的应用是作代理.PUB/SUB的问题 如图:最下面每个长方形框框是一个进程,他们都或多或少的需要关注PUB1-3的消息,所以最终的连接是全链接,很复杂,如果再多几个进程,连线就密密麻麻了…

SpringBoot整合MyBatis项目进行CRUD操作项目示例

文章目录 SpringBoot整合MyBatis项目进行CRUD操作项目示例1.1.需求分析1.2.创建工程1.3.pom.xml1.4.application.properties1.5.启动类 2.添加用户2.1.数据表设计2.2.pojo2.3.mapper2.4.service2.5.junit2.6.controller2.7.thymeleaf2.8.测试 3.查询用户3.1.mapper3.2.service3…

Microsoft Word 设置底纹

Microsoft Word 设置底纹 References 打开文档页面,选中特定段落或全部文档 在“段落”中单击“边框”下三角按钮 在列表中选择“边框和底纹”选项 在“边框和底纹”对话框中单击“底纹”选项卡 在图案样式和图案颜色列表中设置合适颜色的底纹,单击“确…

软件测试中的白盒测试,这些技巧你知道吗?

对于很多刚开始学习软件测试的小伙伴来说,如果能尽早将黑盒、白盒测试弄明白,掌握两种测试的结论和基本原理,将对自己后期的学习有较好的帮助。今天,我们就来聊聊黑盒、白盒测试的相关话题。 1、黑盒测试的方法和小结 最常见黑盒…

10 微信小程序开发

知识点回顾 1.项目回顾1.2 小程序1.3 API1.4 后台管理 2.后台管理celery2.1 基本后台管理2.1.1 专场2.1.2 拍品列表 3.逻辑开发4.部署 各位小伙伴想要博客相关资料的话关注公众号:chuanyeTry即可领取相关资料! 1.项目回顾 此项目是由【小程序】【API】【…

Java21 + SpringBoot3集成Spring Data JPA

Java21 SpringBoot3集成Spring Data JPA 文章目录 Java21 SpringBoot3集成Spring Data JPA前言相关技术简介ORM(Object-Relational Mapping,对象-关系映射)JPA(Java Persistence API,Java持久层API)Hiber…

HFSS笔记/信号完整性分析(一)——常用快捷键+建模技巧

文章目录 1、常用快捷键2、常用建模技巧2.1 如何由一个无厚度的sheet生成一个有厚度的2.2 如何绘制T形截面的传输线?2.3 自动建立辐射边界法一、法二、 仅做笔记整理与分享。 1、常用快捷键 快捷键功能CtrlDfit it all 以合适的尺寸至于窗口中间CtrlH隐藏object或者…

Docker网络配置网络模式

前言 Docker 的网络模式是一种定义容器如何在网络中通信的方式。Docker 提供了多种网络模式,每种模式都适用于不同的使用场景 一.网络相关概念 1.子网掩码 互联网是由许多小型网络构成的,每个网络上都有许多主机,这样便构成了一个有层次的结…

【昕宝爸爸小模块】图文源码详解什么是线程池、线程池的底层到底是如何实现的

➡️博客首页 https://blog.csdn.net/Java_Yangxiaoyuan 欢迎优秀的你👍点赞、🗂️收藏、加❤️关注哦。 本文章CSDN首发,欢迎转载,要注明出处哦! 先感谢优秀的你能认真的看完本文&…

【送书活动七期】CMeet系列 技术生态沙龙:技术人职业交流会·杭州场-转鸿蒙 对应用开发来说是否是职业发展新机会

CSDN致力于促进城市区域内尖端新兴技术开发者交流,提供开放自由的切磋平台。在近期热议的话题中,“华为鸿蒙系统不再兼容安卓应用”的消息成了程序员们广泛关注并引发思考的问题。 因此便有了我们此次的活动探讨议题! 目录 题外话开场简单介绍活动主办方介绍活动话题讨论升职加…

Intewell-Win_V2.0.1_release版本正式发布

Intewell-Win_V2.0.1_release版本 版本号:V2.0.1 版本发布类型:release正式版本 版本特点 1.优化虚拟网卡使用 2.实时性优化 运行环境推荐 Intewell developer可以运行在windows7及windows10 64位 支持硬件列表

小程序系列--7.页面配置以及网络数据请求

一. 页面配置 1.页面配置文件的作用 小程序中,每个页面都有自己的 .json 配置文件,用来对当前页面的窗口外观、页面效果等进行配置。 2. 页面配置和全局配置的关系 3. 页面配置中常用的配置项 二、网络数据请求 1. 小程序中网络数据请求的限制 2. 配…

2024年美赛数学建模思路 - 案例:ID3-决策树分类算法

文章目录 0 赛题思路1 算法介绍2 FP树表示法3 构建FP树4 实现代码 建模资料 0 赛题思路 (赛题出来以后第一时间在CSDN分享) https://blog.csdn.net/dc_sinor?typeblog 1 算法介绍 FP-Tree算法全称是FrequentPattern Tree算法,就是频繁模…

rust跟我学三:文件时间属性获得方法

图为RUST吉祥物 大家好,我是get_local_info作者带剑书生,这里用一篇文章讲解get_local_info是怎样获得杀毒软件的病毒库时间的。 首先,先要了解get_local_info是什么? get_local_info是一个获取linux系统信息的rust三方库,并提供一些常用功能,目前版本0.2.4。详细介绍地址…

AI大模型学习笔记之二:什么是 AI 大模型的训练和推理?

在人工智能(AI)的领域中,我们经常听到训练(Training) 和 推理(Inference) 这两个词汇,它们是构建强大 AI 模型的关键步骤。我们通过类比人类的学习过程来理解这两个概念,可以更加自然而生动地理…

详解React与Vue的性能对比

React 和 Vue 是当前最流行的前端开发框架之一。它们都具有高度的灵活性和可扩展性,但在某些方面有所不同。在本篇文章中,我将详细介绍 React 和 Vue 这两个技术,并比较它们的优点和缺点。 目录 1. React: 1.1 优点: …

杨中科 .NETCORE EFCORE第七部分 一对一,多对多

一对一 一对一关系配置 1、builder.HasOne(o >o.Delivery).WithOne(d>d.Order).HasForeignKey(d>dOrderId); 2、测试插入和获取数据 示例 新建 Order 新建 Delivery DeliveryConfig OrderConfig 执行 迁移命令 查看数据库 测试数据插入 运行查看数据 多对多…