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

news2024/11/24 14:10:43

实现方式

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

定义配置转化类

public class UserConverter implements Converter<String, List<User>> {

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

将转化类放入转化工厂


@Configuration
public class ConverterConfiguration {


    @Bean
    public 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 {

    // 收集自定义的配置解析工具类
    @Resource
    private Set<Converter> converters;


    @Bean
    public ConversionServiceFactoryBean conversionService() {
        ConversionServiceFactoryBean factoryBean = new ConversionServiceFactoryBean();
        factoryBean.setConverters(converters);
        return factoryBean;
    }
}


@Component
public class UserConverter implements Converter<String, List<User>> {

        @Override
        public 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.执行解析逻辑,进行属性赋值

 

 

 

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

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

相关文章

C++将函数声明放在头文件中的示例

C将函数声明放在头文件中的示例 C函数原型声明&#xff08;函数声明&#xff09;的位置可以有以下几种选择&#xff1a; 1.函数声明放在同一源文件中&#xff1a;这种情况通常适用较小的项目中&#xff0c;通常可以将函数的声明和定义放在同一个源文件中。先声明函数原型&…

教你如何将3D模型导入到可视化大屏系统中,并实现可交互效果

首先我们需要准备一款数字孪生软件&#xff0c;本文中使用的是山海鲸可视化&#xff0c;这是一款免费的零代码数字孪生大屏开发平台软件。 下载完成后打开山海鲸可视化&#xff0c;点击新建来创建一个大屏项目。 我们可以根据自己的需要来创建各种场景的项目或是套用模板项目&a…

React源码解析18(4)------ completeWork的工作流程【mount】

摘要 经过上一章&#xff0c;我们得到的FilberNode已经具有了child和return属性。一颗Filber树的结构已经展现出来了。 那我们最终是想在页面渲染真实的DOM。所以我们现在要在completeWork里&#xff0c;构建出一颗离屏的DOM树。 之前在说FilberNode的属性时&#xff0c;我们…

CAD文件打开错误中断怎么办?CAD文件打开错误中断的解决方法

CAD是一款计算机辅助设计软件&#xff0c;主要用于二维绘图、详细绘制、设计文档和基本三维设计&#xff0c;CAD已经是一款国内国外广为流行的绘图工具了&#xff0c;在土木建筑、装饰装潢、城市规划、园林设计、电子电路、机械设计、服装鞋帽、航空航天、轻工化工等行业应用非…

【UE4 RTS】08-Setting up Game Clock

前言 本篇实现的效果是在游戏运行后能够记录当前的游戏时间&#xff08;年月日时分秒&#xff09;&#xff0c;并且可以通过修改变量从而改变游戏时间进行的快慢。 效果 步骤 1. 在Blueprints文件夹中新建如下两个文件夹&#xff0c;分别命名为“GameSettings”、“Player”…

【docker】设置 docker 国内镜像报错,解决方案

一、报错&#xff1a; [rootlocalhost ~]# systemctl restart docker Job for docker.service failed because the control process exited with error code. See "systemctl status docker.service" and "journalctl -xe" for details.二、原因&#xf…

Excel---成绩相同者,名次并列排列,三步搞定

需求&#xff1a;一张成绩表&#xff0c;共341行(340条数据&#xff0c;第一条为标题)&#xff0c;根据成绩进行排序&#xff0c;成绩相同进行名次并列 一、选择生成结果的位置&#xff0c;我这里点击了一下E2单元格 二、公式—>插入–>rank函数 数值&#xff1a;D2 表示…

IDEA新建类时自动设置类注释信息,署名和日期

IDEA设置路径 File --> Settings --> Editor --> File and Code Templates --> Include --> File Header 官方模板 这里 ${USER} 会读取计算机的用户名 ${DATE}是日期 ${TIME}是时间 /*** Author ${USER}* Date ${DATE} ${TIME}* Version 1.0*/

成都优优聚拥有丰富美团代运营经验!

成都优优聚美团代运营是一家专业的电商运营服务机构&#xff0c;致力于帮助商家提升线上业绩&#xff0c;增加销售额。他们以优良的售后服务和卓越的业绩&#xff0c;赢得了众多商家的认可和信赖。 与成都优优聚美团代运营合作的好处是多方面的。首先&#xff0c;他们拥有一支经…

java spring cloud 企业工程管理系统源码+二次开发+定制化服务 em

Java版工程项目管理系统 Spring CloudSpring BootMybatisVueElementUI前后端分离 功能清单如下&#xff1a; 首页 工作台&#xff1a;待办工作、消息通知、预警信息&#xff0c;点击可进入相应的列表 项目进度图表&#xff1a;选择&#xff08;总体或单个&#xff09;项目显…

兰州https证书申请

https证书是由CA认证机构颁发的数字证书&#xff0c;可以为域名网站或者公网IP网站提供信息加密服务&#xff0c;正规CA认证机构签发的https证书可以兼容99%的主流浏览器和IOS、Windows系统&#xff0c;同样&#xff0c;现在流行的小程序也需要https证书。那么&#xff0c;该怎…

又一重磅数据将要来袭,今晚聚焦CPI

KlipC报道&#xff1a;北京时间周四20&#xff1a;30公布的美国7月消费者价格指数(CPI)报告。 KlipC的合伙人Andi D表示&#xff1a;“市场正在密切关注美国CPI数据&#xff0c;最新的消费者物价指数读数可能会改变人们对美联储今年是否再次加息的预期。 摩根大通的分析师表示&…

Java基础---自动装箱拆箱导致的NullPointerException问题

目录 问题描述 代码 简单分析 问题描述 在返回一个类型是boolean的方法中&#xff0c;将从map里面取出的Boolean类型的值直接返回&#xff0c;代码一运行&#xff0c;执行到这立即出现了空指针问题&#xff08;问题一&#xff09;于是就使用log分析&#xff0c;将字符和Bool…

Java之深入探究IO流操作与Lambda表达式

深入探究Java IO流操作与Lambda表达式的优雅结合 1. IO流1.1 IO流的概念1.2 IO流的分类1.3 常见的IO流操作1.3.1 字节流操作1.3.2 字符流操作1.3.3 缓冲流 2. Lambda表达式2.1 Lambda 表达式使用条件2.2 Lambda 表达式的分类2.3 Lambda 表达式在 IO 流操作中的应用2.4 常见的 I…

虹科新品 | 振动监测:提升风能行业效率与安全!

一、 CTC概览 服务于工业振动分析市场ISO 9001认证设计和测试以满足工业环境的实际需求无条件终身保修兼容所有主要数据采集器、分析仪和在线系统美国制造 二、风能行业&#xff1a;为什么要进行监测&#xff1f; 在风能行业&#xff0c;振动监测是一项至关重要的节约成本和安…

详解低代码和无代码的区别

低代码是近几年被炒的很热的一个概念&#xff0c;与之同样热议的还有无代码。那么针对这两个概念&#xff0c;背后的价值、面向的人群、发展的趋势是什么&#xff1f; 一、低代码 vs 无代码 低代码是什么&#xff1f; 低代码&#xff08;Low-Code&#xff09;这一概念是2014年一…

js 额外知识

加油&#xff0c;嘎嘎嘎 &#x1f923; &#x1f495;&#x1f495;&#x1f495; 文章目录 一、 with二、 eval 函数三、严格模式三、严格模式的限制 一、 with with语句 扩展一个语句的作用域链。 会形成一个自己的作用域不建议使用with语句&#xff0c;因为它可能是混淆错误…

Centos7.9_解决每次重启机器配置的java环境变量都需要重新source /etc/profile才生效的问题---Linux工作笔记060

这种情况需要把环境变量,java的环境变量在/root/.bashrc文件中也放一份,注意这个文件是隐藏的,默认是,需要进行ls -a才能显示. #jdk export JAVA_HOME/lib/jvm export JRE_HOME${JAVA_HOME}/jre export CLASSPATH.:${JAVA_HOME}/lib:${JRE_HOME}/lib export PATH${JAVA_HOME}/b…

STM32F105RCT6 -- ST-Link ITM Trace printf 打印日志

1. STM32 可以配置UASRT&#xff0c;使用串口来打印日志&#xff0c;还有另外一种方式&#xff0c;使用ITM 调试功能来打印日志&#xff0c; 主要使用到的三个函数 core_cm3.h 1.1 发送函数 static __INLINE uint32_t ITM_SendChar(uint32_t ch)&#xff0c;相当于串口的发送函…

锚框【目标检测】

生成多个锚框 假设输入图像高为h,宽为w,我们以图像每个像素为中心生成不同形状的锚框,缩放比 s∈(0,1],宽高比为r>0。那么锚框的宽度和高度分别为和。当中心位置给定时, 已知宽和高的锚框是确定的。缩放比为锚框高与图像高的比值,然后得到一个正方形锚框面积。 ​​…