• Spring中自定义类型转换器


    目录

    一、什么是类型转换器

    二、自定义类型转化器

    2.1 实现Converter接口

    2.2 在Spring中注册

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

    3.1 解决代码的耦合

    3.2 注册标签id值必须唯一

    ​3.3 Spring提供的日期转换器


    一、什么是类型转换器

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

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

    1. public class Person {
    2. private String name;
    3. private Date birthday;
    4. public void setName(String name) {
    5. this.name = name;
    6. }
    7. public void setBirthday(Date birthday) {
    8. this.birthday = birthday;
    9. }
    10. @Override
    11. public String toString() {
    12. return "Person{" +
    13. "name='" + name + '\'' +
    14. ", birthday=" + birthday +
    15. '}';
    16. }
    17. }

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

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

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

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

    二、自定义类型转化器

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

    2.1 实现Converter接口

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

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

    2.2 在Spring中注册

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

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

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

    1. <bean id="myConverter" class="com.gl.demo.converter.MyDateConverter"/>
    2. <bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    3. <property name="converters">
    4. <set>
    5. <ref bean="myConverter"/>
    6. set>
    7. property>
    8. bean>

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

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

    3.1 解决代码的耦合

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

    1. public class MyDateConverter implements Converter {
    2. // 在这里添加一个属性,并给上setter方法就可了
    3. private String dateName;
    4. public void setDateName(String dateName) {
    5. this.dateName = dateName;
    6. }
    7. @Override
    8. public Date convert(String source) {
    9. SimpleDateFormat sdf = new SimpleDateFormat(dateName);
    10. Date date = null;
    11. try {
    12. date = sdf.parse(source);
    13. } catch (ParseException e) {
    14. e.printStackTrace();
    15. }
    16. return date;
    17. }
    18. }

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

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

    3.2 注册标签id值必须唯一

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

    3.3 Spring提供的日期转换器

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

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

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

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

  • 相关阅读:
    原生js的animate()方法详解
    java毕业设计社区医疗服务系统mybatis+源码+调试部署+系统+数据库+lw
    Spring的copy属性
    单文件组件环境配置步骤---vue-cli版
    数据结构刷题:第十三天
    神经网络深度学习(三)优化器
    Redis作者谈Redis应用场景
    搞定面试官 - MySQL 中你知道如何计算一个索引的长度嘛?
    国内AI大赛汇总
    apache、iis6、ii7独立ip主机屏蔽拦截蜘蛛抓取(适用vps云主机服务器)
  • 原文地址:https://blog.csdn.net/x2656271356/article/details/133961663