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>

参考文献

相关推荐
刀法如飞15 分钟前
AI时代:一文搞懂DDD领域驱动设计
后端·架构·ai编程
weixin_4684668521 分钟前
Prometheus监控服务部署与实战指南
服务器·后端·python·docker·自动化·prometheus
IronMurphy34 分钟前
SSM拷打第二讲!!!
java·spring·mybatis
小江的记录本42 分钟前
【JVM虚拟机】类加载机制:类加载全流程:加载→验证→准备→解析→初始化(附《思维导图》+《面试高频考点清单》)
java·jvm·spring boot·算法·安全·spring·面试
会编程的土豆1 小时前
Go interface 底层的 itab 到底是什么
开发语言·后端·golang
candyTong1 小时前
Claude Code 每次调用 API 时,上下文是怎么"拼"出来的?
javascript·后端·架构
java_cj1 小时前
MySQL 执行原理深度剖析:查询成本计算与优化器内幕
数据库·后端·mysql
J2虾虾1 小时前
Spring AI Alibaba - Models 模型
人工智能·spring·microsoft
java_cj1 小时前
数据库范式化设计与性能优化全攻略
数据库·后端·性能优化·架构·开源
雪隐1 小时前
AI股票小助手01-量化交易基础概念
人工智能·后端·python