Spring中自定义类型转换器

news2024/12/23 11:09:01

目录

一、什么是类型转换器

二、自定义类型转化器

2.1 实现Converter接口

2.2 在Spring中注册

三、自定义类型转换器中的细节

3.1 解决代码的耦合

3.2 注册标签id值必须唯一

​3.3 Spring提供的日期转换器


一、什么是类型转换器

在Spring中类型转换器就是将配置文件中的字符串类型的数据,转换成对象中成员变量对应的数据类型,进而完成注入。其实在Spring中内置了类型转换器,那为什么还要去自定义类型转换器呢?

1)首先创建一个Person类,在这个类中有一个生日的属性,根据以往的经验,接下来在配置文件中对这两个属性进行注入

public class Person {
    private String name;
    private Date birthday;
    public void setName(String name) {
        this.name = name;
    }
    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", birthday=" + birthday +
                '}';
    }
}

2)配置文件为属性进行注入

<bean id="person" class="com.gl.demo.converter.Person">
    <property name="name" value="张三"></property>
    <property name="birthday" value="2002-01-01"></property>
</bean>

3)注入完成,接下来进行测试,按道理来说这里应该是会得到一个结果,但是程序报错了。仔细查看报错的原因,原来是Spring中不能将2002-01-01这个字符串转化为日期格式。这也就是为什么要自定义类型转换器的原因了。(其实Spring内置了日期的转换器,文末详说)

public void test() {
    ApplicationContext ctx =
            new ClassPathXmlApplicationContext("spring-config.xml");
    Person person = (Person) ctx.getBean("person");
    System.out.println(person);
}

二、自定义类型转化器

在Spring中为我们提供了自定义类型转换器的接口,我们只需要去实现这个接口即可。最后在Spring中注册这个接口就可以了。

2.1 实现Converter接口

实现这个接口的时候会发现这里有两个泛型,其中第一个是参数注入时的类型,第二个是需要转换的类型。实现接口方法的时候Spring会将配置文件中的注入数据通过source直接传递过来

// 这里的接口泛型有两个参数,一个是原来的类型,一个是转换后的类型
public class MyDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        // 在这个方法中写上具体的转换过程即可,其中这个source会将注入的参数传递过来
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        Date date = null;
        try {
            date = sdf.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

2.2 在Spring中注册

首先需要注册的话就要先创建MyDateConverter的对象,然后将创建好的对象告诉Spring即可

 <bean id="myConverter" class="com.gl.demo.converter.MyDateConverter"/>

这里Spring中提供了一个用于注册类型转化器的的bean标签,注意这个id值必须是conversionService不然就会报错,这是Spring的规定!

<bean id="myConverter" class="com.gl.demo.converter.MyDateConverter"/>

<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <ref bean="myConverter"/>
        </set>
    </property>
</bean>

接下来再次进行试验,由于已经在Spring中将自定义的类型转换器进行了注册,所以现在是能够将值打印出来的。注意这里的打印值是调用了Java.Util包中的Date类的toString方法所以打印值会不一样,总的来说这里的转换是已经成功了

三、自定义类型转换器中的细节

3.1 解决代码的耦合

我们发现,在这个实现类中,日期的格式是写死了的,我们想要修改的时候只能是改代码,对于这种的解决方式大家应该已经想到了吧!那就是依赖注入

public class MyDateConverter implements Converter<String, Date> {
    // 在这里添加一个属性,并给上setter方法就可了
    private String dateName;
    public void setDateName(String dateName) {
        this.dateName = dateName;
    }
    @Override
    public Date convert(String source) {
        SimpleDateFormat sdf = new SimpleDateFormat(dateName);
        Date date = null;
        try {
            date = sdf.parse(source);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        return date;
    }
}

修改了代码的格式之后,接下来就是需要在配置文件中注入数据了,其他的配置文件不用修改

<bean id="myConverter" class="com.gl.demo.converter.MyDateConverter">
    <property name="dateName" value="yyyy-MM-dd"/>
</bean>

3.2 注册标签id值必须唯一

这个细节已经在2.2中说明了

3.3 Spring提供的日期转换器

其实Spring是提供了日期转化器的,但是由于提供的格式我们平常使用的比较少,这也就相当于没有提供。这里只需要将日期格式改成反斜线的方式即可

<bean id="person" class="com.gl.demo.converter.Person">
    <property name="name" value="李四"></property>
    <property name="birthday" value="2002/01/01"></property>
</bean>

 这里为了避免干扰,将之前的配置文件全部都注释了,并且将名字修改了,最后运行看结果

这里发现没有报错,说明了Spring确实是含有日期转换器的 

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

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

相关文章

力扣一.链表的运用

一.合并生序链表 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 = [1,2,4], l2 = [1,3,4] 输出:[1,1,2,3,4,4] 输入:l1 = [], l2 = [] 输出:[] 输入:l1 = [], l2 = [0] 输出:[0]提示: 两个链表的…

【【萌新的FPGA学习之管脚设定xdc文件】】

萌新的FPGA学习之管脚设定xdc文件 xdc文件可以自己设置 也可以匹配 我们根据正点原子的流水灯管脚设定 主要讲述一下 各个英文设计是什么意思 Name&#xff1a;工程中顶层端口的名称。 Direction&#xff1a;说明管脚是输入还是输出。 Neg Diff Pair&#xff1a;负差分对&…

YOLOv5/v7/v8改进实验(三)之训练技巧篇

&#x1f680;&#x1f680; 前言 &#x1f680;&#x1f680; YOLO系列是一种目标检测算法&#xff0c;具有高效的实时性能和较高的准确性。一些常用的YOLO训练技巧往往可以帮助提高模型的性能和收敛速度。而这些技巧在YOLOv5、YOLOv7和YOLOv8几乎通用。 &#x1f525;&#…

CUDA编程入门系列(十一)CUDA程序优化技巧

优化原则&#xff1a;最大化并行执行 探索并行化&#xff1a; 优化线程块的规模 我们在设计CUDA程序的时候&#xff0c;要对线程块的个数进行考虑。因为GPU中流处理器SM的数量是相对固定的&#xff0c;所以我们应该尽量的将多个block放到同一个SM当中&#xff08;至少保证每个…

三、信号与槽

1. 信号槽的定义 信号函数和槽函数是Qt在C的基础上新增的功能&#xff0c;功能是实现对象之间的通信。 实现信号槽需要有两个先决条件&#xff1a; 通信的对象必须是从QObject派生出来的 QObject是Qt所有类的基类。 类中要有Q_OBJECT宏 2. 信号槽的使用 2.1 函数原型 最常…

免费SSL证书:JoySSL让您的网站更安全

在今天的数字化时代&#xff0c;保护网站和用户信息的安全至关重要。SSL&#xff08;Secure Sockets Layer&#xff09;证书通过加密网站与用户之间的通信&#xff0c;确保数据传输的安全性。让您拥有一个SSL加密的网站是至关重要的&#xff0c;但您可能会担心高昂的费用。不过…

秦丝科技“羽”深大计软学院同行,共庆深圳大学成立40周年

2023年10月21日&#xff0c; 由深圳大学工会主办 &#xff0c; 深圳大学体育学院 、深圳大学后勤部、丽湖校区管委会等单位协办的深圳大学2023年教职工羽毛球联赛-第一场正式举办&#xff1b; 由深圳市秦丝科技有限公司联合头部商户共同赞助的计算机与软件学院取得首场胜利&…

花生好车基于 KubeSphere 的微服务架构实践

公司简介 花生好车成立于 2015 年 6 月&#xff0c;致力于打造下沉市场汽车出行解决方案第一品牌。通过自建直营渠道&#xff0c;瞄准下沉市场&#xff0c;现形成以直租、批售、回租、新能源汽车零售&#xff0c;四大业务为核心驱动力的汽车新零售平台&#xff0c;目前拥有门店…

java基础--transient关键字减少序列化

前置内容 1.序列化 今天在看ArrayList源码的时候看到了这个&#xff0c;我之前应该是看过的&#xff0c;但是忘记了。现在在总结一下。 transient 用在类的属性上&#xff0c;不能修饰其他的。 作用&#xff1a;在序列化的时候transient修饰的属性不能被序列化 用途 在一些…

力扣:盛最多水的容器

题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线&#xff0c;第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 。 找出其中的两条线&#xff0c;使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 说明&#xff1a;你不能倾斜容器。 …

【公众号开发】图像文字识别 · 模板消息推送 · 素材管理 · 带参数二维码的生成与事件的处理

【公众号开发】&#xff08;4&#xff09; 文章目录 【公众号开发】&#xff08;4&#xff09;1. 图像文字识别功能1.1 百度AI图像文字识别接口申请1.2 查看文档学习如何调用百度AI1.3 程序开发1.3.1 导入依赖&#xff1a;1.3.2 公众号发来post请求格式1.3.3 对image类型的消息…

【JavaEE】synchronized原理 -- 多线程篇(6)

synchronized原理 1. synchronized具体采用了哪些加锁策略?2. synchronized内部实现策略(内部原理)2.1 偏向锁2.2 轻量级锁与重量级锁 3. synchronized 的其它优化策略3.1 锁消除3.2 锁的粒度 4. 总结 1. synchronized具体采用了哪些加锁策略? synchronized既是悲观锁, 也是…

Power BI 傻瓜入门 4. Power BI:亮点

本章内容包含&#xff1a; 在Power BI Desktop上学习诀窍摄入数据使用模型试用Power BI服务 就像评估一个由多种成分组成的蛋糕一样&#xff0c;Power BI要求其用户熟悉商业智能&#xff08;BI&#xff09;解决方案中的功能。几乎所有与Power BI交互的用户都是从桌面版开始的…

Locust负载测试工具实操

本中介绍如何使用Locust为开发的服务/网站执行负载测试。 Locust 是一个开源负载测试工具&#xff0c;可以通过 Python 代码构造来定义用户行为&#xff0c;避免混乱的 UI 和臃肿的 XML 配置。 步骤 设置Locust。 在简单的 HTTP 服务上模拟基本负载测试。 准备条件 Python…

2021年03月 Python(三级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python编程&#xff08;1~6级&#xff09;全部真题・点这里 一、单选题&#xff08;共25题&#xff0c;每题2分&#xff0c;共50分&#xff09; 第1题 下列代码的输出结果是&#xff1f;&#xff08; &#xff09; x 0x10print(x)A&#xff1a;2 B&#xff1a;8 C&#xff…

NeurIPS 23 Spotlight丨3D-LLM:将3D世界注入大语言模型

来源&#xff1a;投稿 作者&#xff1a;橡皮 编辑&#xff1a;学姐 论文链接&#xff1a;https://arxiv.org/pdf/2307.12981.pdf 开源代码&#xff1a;https://vis-www.cs.umass.edu/3dllm/ 摘要&#xff1a; 大型语言模型 (LLM) 和视觉语言模型 (VLM) 已被证明在多项任务上…

FPGA的256点FFT调用Quartus IP核实现VHDL傅里叶变换

名称&#xff1a;256点FFT调用Quartus IP核实现傅里叶变换 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a;使用VHDL实现256点FFT&#xff0c;调用Quartus IP核实现傅里叶变换 演示视频&#xff1a;http://www.hdlcode.com/index.php?mhome&cView…

Mysql基础与高级汇总

SQL语言分类 DDL:定义 DML&#xff1a;操作 DCL:控制(用于定义访问权限和安全级别) DQL:查询 Sql方言 ->sql&#xff1a;结构化查询语言 mysql:limit oracle:rownum sqlserver:top 但是存储过程&#xff1a;每一种数据库软件一样SQL语法要求: SQL语句可以单行或多行书写&…

msvcp110.dll无法继续执行代码怎么办?msvcp110.dll丢失的解决方法

msvcp110.dll 丢失通常意味着你的计算机上缺少一个名为 msvcp110.dll 的动态链接库文件。这个文件是 Microsoft Visual C 2010 Redistributable Package 的一个组件&#xff0c;它包含了一些运行时库文件。当你的计算机缺少这个文件时&#xff0c;可能会出现一些问题&#xff0…