Spring中自定义类型转换器

目录

一、什么是类型转换器

二、自定义类型转化器

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)配置文件为属性进行注入


    
    

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中自定义类型转换器_第1张图片

二、自定义类型转化器

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

2.1 实现Converter接口

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

// 这里的接口泛型有两个参数,一个是原来的类型,一个是转换后的类型
public class MyDateConverter implements Converter {
    @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即可

 

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




    
        
            
        
    

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

Spring中自定义类型转换器_第2张图片

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

3.1 解决代码的耦合

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

public class MyDateConverter implements Converter {
    // 在这里添加一个属性,并给上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;
    }
}

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


    

3.2 注册标签id值必须唯一

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

3.3 Spring提供的日期转换器

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


    
    

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

Spring中自定义类型转换器_第3张图片

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

Spring中自定义类型转换器_第4张图片

你可能感兴趣的:(Spring,spring,java,后端)