likes
comments
collection
share

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

作者站长头像
站长
· 阅读数 42

前言

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

类型转换器

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

自定义类型转换器

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

错误分析

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

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;
    }
}
<bean id="person" class="com.aomsir.basic.converter.Person">
    <property name="name" value="Aomsir" />
    <property name="birthday" value="2023-09-13" />
</bean>
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配置文件进行注册
  • 接口说明

    • 接口中第一个泛型是原类型,第二个泛型是目标类型
    • 接口方法的参数是原数据,返回值是转换好后的对应数据
  • Spring5应用之自定义类型转换器

  • 注意:类型注册器id值必须是conversionService

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;
    }
}
<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>

参考文献

转载自:https://juejin.cn/post/7278238985448882216
评论
请登录