springboot属性注入增强(一)背景/需求
一 背景
springboot 在启动时候会将系统的环境变量、项目的启动时设置的属性 、application.yml文件(或application.properties文件)、@PropertySource定义的配置文件中的属性加载到Environment对象中,分布式配置中心框架也会把配置加载到Environment中。而springboot的属性注入即@Value、@ConfigurationProperties、xml文件的${.....},就是从Environment拿的数据,再进行解析的,我们要做的就是对Environment的数据源添加自定义的数据和解析过程中执行我们自定义的解析代码。
二 详细需求
1 根据配置中的内容,动态的添加自定义的配置
如配置文件中只配置了一个用户的id,启动时根据这个id去获取用户信息,并把获取到的信息添加到springboot的配置中,也就是定制我们自己获取属性的方式。这样启动后就能直接用到这个id对应的用户姓名、性别等数据(不可变的数据,可变的数据就涉及到配置动态刷新了,后面再讲),无需再手动调用接口获取。效果如下
1.1 application.yml文件中配置用户id
user:id: 123
1.2 通过这个用户id “123”来使用这个用户的相关信息
1.2.1 @Value
@Value("${user.123.name}")private String user123Name;@Value("${user.123.sex}")private String user123Age;
1.2.2 @ConfigurationProperties
@Data
@Component
@ConfigurationProperties(prefix = "user.123")
public class UserConfiguration {/*** 姓名*/private String name;/*** 性别*/private String sex;
}
@Autowiredprivate UserConfiguration userConfiguration;
1.2.3 Environment
@Autowiredprivate Environment environment;public void configTest() {String user123Age = environment.getProperty("user.123.sex");String user123Name = environment.getProperty("user.123.name");}
2 自定义属性解析方法
如希望对一个配置文件中的属性执行我们自定义的方法,让实际使用这个属性的时候,用的是这个方法转换后的属性,如我配置了一个加密的属性,想通过一个方法解密,使得使用时就是明文
spring:redis:password: decode(abc123)
这个decode就是我们自定义的方法,方法的入参是一个密文,通过这个abc123可以获取到实际的密码。
具体的使用场景如下
1. 在不改变属性名的情况下,对已有的配置做一个增强比如上述说的解密或者追加、替换一些字符,如整合redis的时候需要的密码,不想直接暴漏到项目中,因为属性名是肯定不能变的(redis根据属性名来找属性的),那么就可以自定义一个解密方法来将他的属性值进行解密。
2.将属性值改为之前不存在的属性,如上述1.2中动态新增的属性,当然可以直接这样用
spring:redis:password: ${user.123.name}
,但如果是在执行org.springframework.context.support.PropertySourcesPlaceholderConfigurer#postProcessBeanFactory后添加进去的,那么springboot会找不到这个user.123.name属性,是会直接报错的(ignoreUnresolvablePlaceholders = false时,默认就是false),所以可以自定义一个函数先越过这个校验,在后面再进行真正的赋值。
spring:redis:password: getPassword(user.123.name)
不过这个场景比较鸡肋,因为只要我们控制好动态新增属性的时机那么就完全可以直接用${...}来替换
相关文章:
springboot属性注入增强(一)背景/需求
一 背景 springboot 在启动时候会将系统的环境变量、项目的启动时设置的属性 、application.yml文件(或application.properties文件)、PropertySource定义的配置文件中的属性加载到Environment对象中,分布式配置中心框架也会把配置加载到Env…...
《PWA实战:如何为你的网站增加离线功能和推送通知》
🌷🍁 博主猫头虎(🐅🐾)带您 Go to New World✨🍁 🦄 博客首页——🐅🐾猫头虎的博客🎐 🐳 《面试题大全专栏》 🦕 文章图文…...
sqli-labs关卡之一(两种做法)
目录 一、布尔盲注(bool注入) 二、时间盲注(sleep注入) 一、布尔盲注(bool注入) 页面没有报错和回显信息,只会返回正常或者不正常的信息,这时候就可以用布尔盲注 布尔盲注原理是先将你查询结果的第一个字符转换为ascii码,再与后面的数字比较…...
Visual Studio 线性表的链式存储节点输出引发异常:读取访问权限冲突
问题: 写了一个线性表的链式存储想要输出,能够输出,但是会报错:读取访问权限冲突 分析: 当我们输出到最后倒数第二个节点时,p指向倒数第二个节点并输出; 下一轮循环:p指向倒数第二…...
[通用]计算机经典面试题基础篇Day3
[通用]计算机经典面试题基础篇Day3 1、请说明mysql的两种主要引擎 MySQL有多种存储引擎,但最常见的两种主要引擎是InnoDB和MyISAM。 2、说一下mysql这两种引擎的使用场景 MySQL的两种主要引擎,InnoDB和MyISAM,各自适用于不同的使用场景&…...
(Golang) 牛客 在线编程 Go语言入门
文章目录 前言Go的学习资料链接 AC代码01 输出打印GP1 go的第一个程序 02 变量GP2 小明信息GP3 个人信息 03 常量GP4 国家名称 04 指针GP5 值和指针 05 字符串GP6 拼接字符串GP7 字符数量GP8 回文数 06 类型转换GP9 格式化字符串GP10 字符求和 07 运算符GP11 长方形的周长GP12 …...
2.6 PE结构:导出表详细解析
导出表(Export Table)是Windows可执行文件中的一个结构,记录了可执行文件中某些函数或变量的名称和地址,这些名称和地址可以供其他程序调用或使用。当PE文件执行时Windows装载器将文件装入内存并将导入表中登记的DLL文件一并装入&…...
SpringMvc进阶
SpringMvc进阶 SpringMVC引言一、常用注解二、参数传递三、返回值 SpringMVC引言 在Web应用程序开发中,Spring MVC是一种常用的框架,它基于MVC(Model-View-Controller)模式,提供了一种结构化的方式来构建可维护和可扩…...
SpringCloud Alibaba 入门到精通 - Nacos
SpringCloud Alibaba 常用组件 一、基础结构搭建1.父工程创建2.子工程创建 二、Nacos:注册中心1.服务端搭建2.注册中心-客户端搭建3.注册中心-管理页面4.注册中心-常用配置5.注册中心-核心功能总结 三、Nacos注册中心集成Load Balancer 、OpenFeign1.Nacos客户端集成…...
new/delete, malloc/free
区别: 首先new/delete是运算符,malloc/free是库函数。malloc/free只开辟内存不初始化;new/delete及开辟内存也初始化。抛出异常的方式:new/delete开辟失败使用抛出bad_alloc;malloc/free通过返回值判断。malloc和new区…...
oracle将一个用户的表复制到另一个用户
注:scott用户和scott用户下的源表(EMP)本身就有,无需另行创建。 GRANT SELECT ON SCOTT.emp TO BI_ODSCREATE TABLE ODS_EMP AS SELECT * FROM SCOTT.emphttp://www.bxcqd.com/news/77615.html SQL语句查询要修改密码的用户…...
C#知识点、常见面试题
相关源码 https://github.com/JackYan666/CSharpCode/blob/main/CSharpCode.cs 0.简要概括 1.For循环删除集合元素可能漏删:从后面往前删除 2.Foreach不能直接修改集合元素:用递归的思想,删除完了的集合重新遍历 3.闭包问题:for循环存在闭包,可以通过使用临时变量解决…...
【STM32】锁存器
问题背景 在学习FSMC控制外部NOR存储器时,看到在NOR复用接口模式下,AD信号[15:0]是复用的。也就是说,若不使用锁存器:当NADV为低时,ADx(x0…15)上出现地址信号Ax,当NADV变高时,ADx上出现数据信号Dx。若使用…...
DGIOT-Modbus-RTU控制指令05、06的配置与下发
[小 迪 导 读]:伴随工业物联网在实际应用中普及,Modbus-RTU作为行业内的标准化通讯协议。在为物联网起到采集作用的同时,设备的控制也是一个密不可分的环节。 场景解析:在使用Modbus对设备进行采集后,可以通过自动控制…...
机器学习实战-系列教程8:SVM分类实战3非线性SVM(鸢尾花数据集/软间隔/线性SVM/非线性SVM/scikit-learn框架)项目实战、代码解读
🌈🌈🌈机器学习 实战系列 总目录 本篇文章的代码运行界面均在Pycharm中进行 本篇文章配套的代码资源已经上传 SVM分类实战1之简单SVM分类 SVM分类实战2线性SVM SVM分类实战3非线性SVM 4、非线性SVM 4.1 创建非线性数据 from sklearn.data…...
计算机网络-谢希任第八版学习笔记总结
一.计算机网络概述 21世纪三个特点 数字化 信息化 智能化,其中主要是围绕智能化。 网络的常见分类: 电话网络 有线电视网络 计算机网络 互联网:Internet 由数量极大的计算机网络相连接 特点: 共享性 连通性 互联网&…...
手写Spring:第5章-注入属性和依赖对象
文章目录 一、目标:注入属性和依赖对象二、设计:注入属性和依赖对象三、实现:注入属性和依赖对象3.0 引入依赖3.1 工程结构3.2 注入属性和依赖对象类图3.3 定义属性值和属性集合3.3.1 定义属性值3.3.2 定义属性集合 3.4 Bean定义补全3.5 Bean…...
初识集合框架 -Java
目录 一、集合框架的概念 二、集合框架的重要性 三、涉及的数据结构和算法 3.1 什么是数据结构 3.2 集合框架(容器)背后对应的数据结构 3.3 相关的Java知识 3.4 什么是算法 3.5 如何学好数据结构和算法 一、集合框架的概念 Java 集合框架,…...
目标检测笔记(十五): 使用YOLOX完成对图像的目标检测任务(从数据准备到训练测试部署的完整流程)
文章目录 一、目标检测介绍二、YOLOX介绍三、源码获取四、环境搭建4.1 环境检测 五、数据集准备六、模型训练七、模型验证八、模型测试 一、目标检测介绍 目标检测(Object Detection)是计算机视觉领域的一项重要技术,旨在识别图像或视频中的…...
深眸科技自研轻辙视觉引擎,以AI机器视觉赋能杆号牌识别与分拣
电线杆号牌作为电力行业标识的一种,相当于电线杆的“身份证”,担负着宣传电力知识、安全警示的作用,用于户外使用标记输电线路电压等级、线路名称、杆塔编号等,能够清晰地记录电力线路杆的信息,并为电力线路的更改以及…...
VR消防安全学习机,数字化消防培训新选择
在城市建设不断加快、公共空间日益复杂的背景下,消防安全教育的重要性愈发凸显。传统的消防宣传多以展板、手册、讲座为主,信息传递单一,参与感不足,难以让体验者真正理解火灾风险与应急处置要点。VR消防安全学习机正是在这样的需…...
OpenClaw 重大漏洞全复盘:63% 系统裸奔的 AI 智能体安全危机与防护全指南
前言:从漏洞原理、在野攻击链到行业前瞻,附个人 / 企业全场景落地解决方案 2026年开年以来,全球AI圈最火爆的风潮,莫过于“养龙虾”。 这款名为OpenClaw、被开发者亲切称为“龙虾”的开源AI智能体框架,凭借全场景自动化…...
【架构实战】六边形架构与整洁架构实战
一、架构演进概述 随着业务复杂度增加,软件架构也在不断演进: 架构演进历程: 分层架构 → 六边形架构 → 整洁架构 → 微服务架构核心目标:实现高内聚、低耦合 架构质量评估: 独立性:框架、数据库、UI的可替…...
Vue2.0 + ElementUI登录页开发避坑指南:我踩过的5个坑(路由守卫、样式冲突、表单验证)
Vue2.0 ElementUI登录页开发避坑指南:我踩过的5个坑 去年接手公司后台管理系统重构时,我负责的第一个模块就是登录页。本以为照着ElementUI文档复制粘贴就能搞定,结果从路由守卫到样式污染,踩的坑比写的代码还多。今天就把这些&q…...
告别‘一视同仁’:聊聊CVPR 2022新作Focals Conv如何让3D检测网络学会‘看重点’
动态感知的艺术:Focal Sparse Convolution如何重塑3D物体检测的注意力机制 当激光雷达扫描一辆行驶中的汽车时,系统需要快速判断哪些点云数据真正构成了车辆轮廓,哪些只是路边的护栏或飘落的树叶。传统3D检测网络对所有数据"一视同仁&qu…...
面试真题集(八):多GPU编程与通信
引言 单卡优化是基础,多卡并行才是工业界常态。本专题精选20道面试真题,聚焦多GPU编程、NCCL通信、拓扑感知、分布式训练优化等核心内容,助你攻克多卡编程的难关。 一、选择题(6题) 1.1 关于多GPU编程,下列说法错误的是?(⭐⭐) A. 不同GPU的显存空间彼此独立,不能直…...
Claude Opus 4.7 发布:更像一个真正能干活的模型了
Claude Opus 4.7 发布:更像一个真正能干活的模型了Opus 4.7终于发布了。官方把它定位为“目前能力最强的通用可用模型”,重点强化了 编码、Agent 长程任务、视觉、多步复杂工作流、记忆相关任务。虽然这一次模型升级了,但是价格很公道。新版本…...
Pandas数据处理实战:从基础到高级技巧
1. 从零开始掌握Pandas数据处理作为一名长期使用Python处理数据的开发者,我深刻体会到Pandas在数据操作中的核心地位。这个强大的库不仅能高效处理结构化数据,更能让复杂的数据操作变得直观简单。今天我将通过一个真实的环境污染数据集,带你系…...
大语言模型训练五大误区与实战解决方案
1. 大语言模型训练中的五大常见误区作为一名经历过多次大语言模型训练实战的从业者,我见过太多项目因为相同的错误而陷入困境。训练一个高质量的LLM就像在丛林中开辟道路——即使有最先进的工具,稍有不慎就会偏离方向。今天我要分享的这五个关键误区&…...
用友U8 ERP系统管理员必备:5个数据库清理锁定的SQL脚本(附详细操作步骤)
用友U8 ERP系统数据库锁定的深度解析与实战解决方案 作为企业核心业务支撑平台,用友U8 ERP系统在长期运行过程中难免会遇到各种数据锁定问题。这些锁定不仅影响日常业务流程,还可能造成关键操作中断,给企业运营带来不便。本文将深入剖析U8系统…...
