当前位置: 首页 > news >正文

解读spring中@Value 如何将配置转自定义的bean

实现方式

着急寻求解决方式的猿友先看这块

定义配置转化类

public class UserConverter implements Converter<String, List<User>> {@Overridepublic List<User> convert(String config) {if (StringUtils.isEmpty(config)) {return Collections.emptyList();}return JsonUtil.fromJson(config, new TypeReference<List<User>>() {});}}

将转化类放入转化工厂


@Configuration
public class ConverterConfiguration {@Beanpublic ConversionServiceFactoryBean conversionService() {ConversionServiceFactoryBean factoryBean = new ConversionServiceFactoryBean();factoryBean.setConverters(Sets.newHashSet(new UserConverter()));return factoryBean;}
}

属性注入

@Service
public class UserService{@Value("${userConfig:[]}")
private List<User> users;
}

spring在bean生命周期的属性赋值中,会根据属性的类型,匹配相应的转化类,执行转化,进而赋值。

代码改进

不难看出,这些转化类仅执行转化逻辑,不存在线程安全问题,可以将其放入spring的IOC中,关闭对ConverterConfiguration的修改。代码简化如下:


@Configuration
public class ConverterConfiguration {// 收集自定义的配置解析工具类@Resourceprivate Set<Converter> converters;@Beanpublic ConversionServiceFactoryBean conversionService() {ConversionServiceFactoryBean factoryBean = new ConversionServiceFactoryBean();factoryBean.setConverters(converters);return factoryBean;}
}@Component
public class UserConverter implements Converter<String, List<User>> {@Overridepublic List<User> convert(String config) {if (StringUtils.isEmpty(config)) {return Collections.emptyList();}return JsonUtil.fromJson(config, new TypeReference<List<User>>() {});}}

按需拓展定义各式各样的Converter即可

下面谈下具体spring是怎么做的

熟悉springbean生命周期的猿友应该明白,红框中的方法栈都是bean生命周期的执行路径(这里不做阐述,感兴趣的猿友可以翻阅我往期博客,里面有做源码解读介绍),我们从生命周期的属性赋值开始剖析源码。

1.找寻需要依赖注入的属性元素列表

  2.属性元素依次转化

3.获取自定义的转化器

 4.匹配合适的解析器

 5.根据返回类型(保护泛型)匹配解析器

 6.执行解析逻辑,进行属性赋值

 

 

 

相关文章:

解读spring中@Value 如何将配置转自定义的bean

实现方式 着急寻求解决方式的猿友先看这块 定义配置转化类 public class UserConverter implements Converter<String, List<User>> {Overridepublic List<User> convert(String config) {if (StringUtils.isEmpty(config)) {return Collections.emptyLis…...

前端开发实习总结参考范文(合集)

▼前端开发实习总结篇一 今天就简单聊聊上面的StrutsSpringHibernate吧。 Struts 代表&#xff1a;表示层;Spring代表&#xff1a;业务逻辑层;Hibernate则代表持久层。他们是目前在Java Web编程开发中用得最多的框架&#xff0c;其实这样区分是为了适应软件开发过程中各个分工…...

♥ vue中$forceUpdate()

♥ vue中$forceUpdate() 1、认识 强制该组件重新渲染 鉴于 Vue 的全自动响应性系统&#xff0c;这个功能应该很少会被用到 $forceUpdate()迫使vue实例重新&#xff08;rander&#xff09;渲染虚拟DOM&#xff0c;注意并不是重新加载组件。 结合vue的生命周期&#xff0c;调用…...

Java一般用于postgis空间数据库通用的增删查改sql命令

目录 1 增加 2 删除 3 查询 4 更新 "public"."JGSQGW_Geo"为某模式下得表 一般postgrel有这样的设计模式 1 增加 #前端绘制出的数据插入 INSERT INTO "public"."JGSQGW_Geo" ( "geom","gridone","gridon…...

【C++类和对象】类有哪些默认成员函数呢?(上)

目录 1. 类的6个默认成员函数 2. 构造函数(*^▽^*) 2.1 概念 2.2 特性 3. 析构函数(*^▽^*) 3.1 概念 3.2 特性 4. 拷贝构造函数(*^▽^*) 4.1 概念 4.2 特性 5. 赋值运算符重载(*^▽^*) 5.1 运算符重载 5.2 赋值运算符重载 ヾ(๑╹◡╹)&#xff89;"人总要为…...

(docker)mysql镜像拉取-创建容器-容器的使用【个人笔记】

【容器的第一次创建】 容器的第一次创建&#xff0c;需要先下载镜像&#xff0c;从 镜像拉取 0、可以搜索镜像的版本 docker search mysql1、先拉取MySQL的镜像&#xff0c;默认拉取最新版&#xff0c;使用下面的命令拉取mysql镜像 docker pull mysql也可以指定mysql的版本…...

【时间格式引发的事故】

时间格式引发的事故 背景实战演示结论 背景 前不久写了一个删除数据接口&#xff0c;条件是根据时间删除时间后面的数据。入参是 时间字符串。后台的时间格式 是 yyyyMMdd。然后当时前端传参数的时候&#xff0c;随意的传了2023-07-31的时间&#xff0c;然后将该表的数据全部删…...

【数据结构】栈及其实现

目录 1.栈的概念及结构 2.栈的实现 2.1栈结构定义 2.2初始化及销毁 2.3插入数据 2.4删除数据 2.5访问栈顶数据 2.6判断是否为空栈 2.7计算栈的大小 3.8访问栈中所有数据 1.栈的概念及结构 栈&#xff1a;栈是一种特殊的线性表&#xff0c;其只允许在固定的一端进行插…...

Linux命令200例:mount将文件系统挂载到指定目录下(常用)

&#x1f3c6;作者简介&#xff0c;黑夜开发者&#xff0c;全栈领域新星创作者✌。CSDN专家博主&#xff0c;阿里云社区专家博主&#xff0c;2023年6月csdn上海赛道top4。 &#x1f3c6;数年电商行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &…...

互联网摸鱼日报(2023-08-11)

互联网摸鱼日报(2023-08-11) 36氪新闻 年景不稳&#xff0c;市场人活成创始人 石油巨头开始疯抢锂矿&#xff0c;美国也开始讲“锂”了&#xff1f; 公司监控员工键盘 49 天&#xff0c;18 年老员工被解雇&#xff1a;因为“打字不够”&#xff1f; 这不是危言耸听&#xf…...

第十五章、【Linux】例行性工作调度

15.1 什么是例行性工作调度 在不考虑硬件与服务器的链接状态下&#xff0c;Linux可以帮助提醒许多任务。Linux调度就是通过crontab与at这两个东西。 15.1.1 Linux工作调度的种类&#xff1a;at,cron 从上面的说明当中&#xff0c;我们可以很清楚的发现两种工作调度的方式&am…...

基于Promise.resolve实现Koa请求队列中间件

本文作者为360奇舞团前端工程师 前言 最近在做一个 AIGC 项目&#xff0c;后端基于 Koa2 实现。其中有一个需求就是调用兄弟业务线服务端 AIGC 能力生成图片。但由于目前兄弟业务线的 AIGC 项目也是处于测试阶段&#xff0c;能够提供的服务器资源有限&#xff0c;当并发请求资源…...

【结构型设计模式】C#设计模式之桥接模式

题目&#xff1a;设计一个桥接模式来实现图形和颜色之间的解耦。 解析&#xff1a; 桥接模式是一种结构型设计模式&#xff0c;它将抽象部分与实现部分分离&#xff0c;使它们可以独立变化。在这个例子中&#xff0c;抽象部分是图形&#xff08;如圆形、正方形&#xff09;&am…...

【12】Git工具 协同工作平台使用教程 Gitee使用指南 腾讯工蜂使用指南【Gitee】【腾讯工蜂】【Git】

tips&#xff1a;少量的git安装和使用教程&#xff0c;更多讲快速使用上手Gitee和工蜂平台 一、准备工作 1、下载git Git - Downloads (git-scm.com) 找到对应操作系统&#xff0c;对应版本&#xff0c;对应的位数 下载后根据需求自己安装&#xff0c;然后用git --version验…...

zookeeper增加IP白名单-安全设置

简介&#xff1a; zookeeper未授权访问漏洞&#xff0c;处理这个漏洞最简单&#xff0c;常用的应该就是给zookeeper添加用户名、密码验证&#xff0c;如果项目比较急&#xff0c;且代码不支持zookeeper的用户名、密码验证&#xff0c;那采用ip白名单过滤&#xff0c;无疑是最快…...

Mac 调试 ios safar

1. 打开Mac的 Safari 浏览器的“开发”菜单 运行 Safari 浏览器&#xff0c;然后依次选取“Safari 浏览器”>“偏好设置”&#xff0c;点按“高级”面板&#xff0c;然后勾选“在菜单栏中显示开发菜单”。 2. 开启IPhone的Safari调试模式 启用 Web 检查 功能&#xff0c;打…...

Linu网络服务NFS

linux网络服务NFS 一.NFS简介二.NFS原理三.NFS优势四.配置文件五.NFS共享存储服务的操作步骤 一.NFS简介 NFS&#xff08;网络文件服务&#xff09; NFS是一种基于tcp/ip传输的网络文件系统协议&#xff0c;最初由sun公司开放通过使用NFS协议&#xff0c;客户机可以像访问本地…...

24届近5年同济大学自动化考研院校分析

今天给大家带来的是同济大学控制考研分析 满满干货&#xff5e;还不快快点赞收藏 一、同济大学 学校简介 同济大学历史悠久、声誉卓著&#xff0c;是中国最早的国立大学之一&#xff0c;是教育部直属并与上海市共建的全国重点大学。经过115年的发展&#xff0c;同济大学已经…...

多源BFS

多源 超级源点和汇点最短距离[超级汇点]昂贵的聘礼 多源BFS矩阵距离 超级源点和汇点 超级源点跟超级汇点是模拟出来的虚拟点&#xff0c;多用于图中&#xff1a; <1>同时有多个汇点和一个源点&#xff0c;建立超级汇点 1、2、3、6分别到达4或者5或者7的最短路径&#xf…...

自制电子农历

水文大师上线。今天一水电子农历牌。 首先讲讲电子配件&#xff0c;一来是电子小屏幕的选择&#xff0c;遇到文字比较多的&#xff0c;尤其是汉字&#xff0c;不要选传统那款128x64 oled&#xff0c;绝对放不下(找到最牛的超小免费字体至少要在8pixel以上才能看清楚)。我选了i…...

Xshell远程连接Kali(默认 | 私钥)Note版

前言:xshell远程连接&#xff0c;私钥连接和常规默认连接 任务一 开启ssh服务 service ssh status //查看ssh服务状态 service ssh start //开启ssh服务 update-rc.d ssh enable //开启自启动ssh服务 任务二 修改配置文件 vi /etc/ssh/ssh_config //第一…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

java调用dll出现unsatisfiedLinkError以及JNA和JNI的区别

UnsatisfiedLinkError 在对接硬件设备中&#xff0c;我们会遇到使用 java 调用 dll文件 的情况&#xff0c;此时大概率出现UnsatisfiedLinkError链接错误&#xff0c;原因可能有如下几种 类名错误包名错误方法名参数错误使用 JNI 协议调用&#xff0c;结果 dll 未实现 JNI 协…...

376. Wiggle Subsequence

376. Wiggle Subsequence 代码 class Solution { public:int wiggleMaxLength(vector<int>& nums) {int n nums.size();int res 1;int prediff 0;int curdiff 0;for(int i 0;i < n-1;i){curdiff nums[i1] - nums[i];if( (prediff > 0 && curdif…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...

代理篇12|深入理解 Vite中的Proxy接口代理配置

在前端开发中,常常会遇到 跨域请求接口 的情况。为了解决这个问题,Vite 和 Webpack 都提供了 proxy 代理功能,用于将本地开发请求转发到后端服务器。 什么是代理(proxy)? 代理是在开发过程中,前端项目通过开发服务器,将指定的请求“转发”到真实的后端服务器,从而绕…...

CVE-2020-17519源码分析与漏洞复现(Flink 任意文件读取)

漏洞概览 漏洞名称&#xff1a;Apache Flink REST API 任意文件读取漏洞CVE编号&#xff1a;CVE-2020-17519CVSS评分&#xff1a;7.5影响版本&#xff1a;Apache Flink 1.11.0、1.11.1、1.11.2修复版本&#xff1a;≥ 1.11.3 或 ≥ 1.12.0漏洞类型&#xff1a;路径遍历&#x…...

C++:多态机制详解

目录 一. 多态的概念 1.静态多态&#xff08;编译时多态&#xff09; 二.动态多态的定义及实现 1.多态的构成条件 2.虚函数 3.虚函数的重写/覆盖 4.虚函数重写的一些其他问题 1&#xff09;.协变 2&#xff09;.析构函数的重写 5.override 和 final关键字 1&#…...

STM32HAL库USART源代码解析及应用

STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...

第7篇:中间件全链路监控与 SQL 性能分析实践

7.1 章节导读 在构建数据库中间件的过程中&#xff0c;可观测性 和 性能分析 是保障系统稳定性与可维护性的核心能力。 特别是在复杂分布式场景中&#xff0c;必须做到&#xff1a; &#x1f50d; 追踪每一条 SQL 的生命周期&#xff08;从入口到数据库执行&#xff09;&#…...