Spring5应用之自定义类型转换器

作者简介 :☕️大家好,我是Aomsir,一个爱折腾的开发者!
个人主页Aomsir_Spring5应用专栏,Netty应用专栏,RPC应用专栏
当前专栏Spring5应用专栏_Aomsir的博客

前言

在在我们之前的文章中,我们均采用spring配置文件进行开发。不知道大家是否注意到,配置文件里的依赖注入,除了引用类型外,基本都是字符串类型 。但在bean对应的类中,却往往使用如Integer 这样的类型。这背后是如何实现的呢?

类型转换器

Spring想到了这一点,提供了类型转换器 ,通过类型转换器把配置文件中字符串类型的数据,转换成了对象中成员变量对应类型的数据,进而完成了注入。如上图

自定义类型转换器

spring为我们提供了很多的类型转换器,比如简单类型转换器数组转换器集合类型转换器 等等,但还是会有场景需要我们自己进行类型转换,如下String转Date类型

错误分析

我为IoC容器准备了一个实体类、一份配置文件和一个测试方法,代码如下所示。在进行测试时,我遇到了一个异常,提示无法将String类型转换为Date类型 。这表明Spring无法自动执行String到Date的类型转换。为什么Spring不能自动转换呢?实际上,Spring提供了默认的类型转换器,但是只支持格式为yyyy/MM/dd的日期转换,而我们在测试中使用的是yyyy-MM-dd格式,因此需要我们程序员来自定义类型转换器

java 复制代码
public class Person implements Serializable {
    private String name;
    private Date birthday;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }
}
xml 复制代码
<bean id="person" class="com.aomsir.basic.converter.Person">
    <property name="name" value="Aomsir" />
    <property name="birthday" value="2023-09-13" />
</bean>
java 复制代码
public class TestSpring {
    @Test
    public void test12() {
        ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("applicationContext.xml");
        com.aomsir.basic.converter.Person person = ctx.getBean("person", com.aomsir.basic.converter.Person.class);

        System.out.println("person = " + person);
        System.out.println("birthday = " + person.getBirthday());
    }
}

自定义开发

  • 开发步骤

    • 创建转换器类,实现Converter接口
    • 编写spring配置文件进行注册
  • 接口说明

    • 接口中第一个泛型是原类型,第二个泛型是目标类型
    • 接口方法的参数是原数据,返回值是转换好后的对应数据
  • 注意:类型注册器id值必须是conversionService

java 复制代码
public class MyDateConverter implements Converter<String, Date> {

    /**
     * 将字符串类型转换为日期类型
     * @param s
     * @return
     */
    @Override
    public Date convert(String s) {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");

        Date date = null;
        try {
            date = sdf.parse(s);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }

        return date;
    }
}
xml 复制代码
<bean id="person" class="com.aomsir.basic.converter.Person">
    <property name="name" value="Aomsir" />
    <property name="birthday" value="2023-09-13" />
</bean>

<!--将MyDateConverter创建出来-->
<bean id="myDateConverter" class="com.aomsir.basic.converter.MyDateConverter" />

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

参考文献

相关推荐
用户6854537597769几秒前
同步成本换并行度:多线程、协程、分片、MapReduce 怎么选才不踩坑
后端
javaTodo8 分钟前
Claude Code 记忆机制详解:从 CLAUDE.md 到 Auto Memory,六层体系全拆解
后端
LSTM9729 分钟前
使用 C# 和 Spire.PDF 从 HTML 模板生成 PDF 的实用指南
后端
JaguarJack41 分钟前
为什么 PHP 闭包要加 static?
后端·php·服务端
BingoGo1 小时前
为什么 PHP 闭包要加 static?
后端
是糖糖啊1 小时前
OpenClaw 从零到一实战指南(飞书接入)
前端·人工智能·后端
百度Geek说1 小时前
基于Spark的配置化离线反作弊系统
后端
Java编程爱好者2 小时前
虚拟线程深度解析:轻量并发编程的未来趋势
后端
苏三说技术2 小时前
Spring AI 和 LangChain4j ,哪个更好?
后端