目录
一、什么是类型转换器
二、自定义类型转化器
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)配置文件为属性进行注入
<bean id="person" class="com.gl.demo.converter.Person">
<property name="name" value="张三"></property>
<property name="birthday" value="2002-01-01"></property>
</bean>
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中为我们提供了自定义类型转换器的接口,我们只需要去实现这个接口即可。最后在Spring中注册这个接口就可以了。
2.1 实现Converter接口
实现这个接口的时候会发现这里有两个泛型,其中第一个是参数注入时的类型,第二个是需要转换的类型。实现接口方法的时候Spring会将配置文件中的注入数据通过source直接传递过来
// 这里的接口泛型有两个参数,一个是原来的类型,一个是转换后的类型
public class MyDateConverter implements Converter<String, Date> {
@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即可
<bean id="myConverter" class="com.gl.demo.converter.MyDateConverter"/>
这里Spring中提供了一个用于注册类型转化器的的bean标签,注意这个id值必须是conversionService不然就会报错,这是Spring的规定!
<bean id="myConverter" class="com.gl.demo.converter.MyDateConverter"/>
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<ref bean="myConverter"/>
</set>
</property>
</bean>
接下来再次进行试验,由于已经在Spring中将自定义的类型转换器进行了注册,所以现在是能够将值打印出来的。注意这里的打印值是调用了Java.Util包中的Date类的toString方法所以打印值会不一样,总的来说这里的转换是已经成功了
三、自定义类型转换器中的细节
3.1 解决代码的耦合
我们发现,在这个实现类中,日期的格式是写死了的,我们想要修改的时候只能是改代码,对于这种的解决方式大家应该已经想到了吧!那就是依赖注入
public class MyDateConverter implements Converter<String, Date> {
// 在这里添加一个属性,并给上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;
}
}
修改了代码的格式之后,接下来就是需要在配置文件中注入数据了,其他的配置文件不用修改
<bean id="myConverter" class="com.gl.demo.converter.MyDateConverter">
<property name="dateName" value="yyyy-MM-dd"/>
</bean>
3.2 注册标签id值必须唯一
这个细节已经在2.2中说明了
3.3 Spring提供的日期转换器
其实Spring是提供了日期转化器的,但是由于提供的格式我们平常使用的比较少,这也就相当于没有提供。这里只需要将日期格式改成反斜线的方式即可
<bean id="person" class="com.gl.demo.converter.Person">
<property name="name" value="李四"></property>
<property name="birthday" value="2002/01/01"></property>
</bean>
这里为了避免干扰,将之前的配置文件全部都注释了,并且将名字修改了,最后运行看结果
这里发现没有报错,说明了Spring确实是含有日期转换器的