目录
在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中注册这个接口就可以了。
实现这个接口的时候会发现这里有两个泛型,其中第一个是参数注入时的类型,第二个是需要转换的类型。实现接口方法的时候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;
- }
- }
首先需要注册的话就要先创建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方法所以打印值会不一样,总的来说这里的转换是已经成功了
我们发现,在这个实现类中,日期的格式是写死了的,我们想要修改的时候只能是改代码,对于这种的解决方式大家应该已经想到了吧!那就是依赖注入
- 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;
- }
- }
修改了代码的格式之后,接下来就是需要在配置文件中注入数据了,其他的配置文件不用修改
- <bean id="myConverter" class="com.gl.demo.converter.MyDateConverter">
- <property name="dateName" value="yyyy-MM-dd"/>
- bean>
这个细节已经在2.2中说明了
其实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确实是含有日期转换器的