1、属性编辑器
上面说道,Spring读取配置文件注入值的时候会调用属性编辑器,将value标签值转换成对象对应属性的类型值。那么,我们来自定义一个属性编辑器。
有一个类TradeAcco.java,有个成员变量是Date类型
private Date vc_date;
然后提供get/set方法(代码忽略)
然后配置文件如下配置:
<property name="vc_date" value="2016/12/13"></property>
这样问题来了,这个value值是个String类型,要以什么格式写呢,才能被注入到Date类型里面呢?
所以,我们来自定义一个Date类型的属性编辑器
新建一个类UtilDatePropertyEditor
/**
* 自定义的日期属性编辑器
* @author Errol
*
*/
public class UtilDatePropertyEditor extends PropertyEditorSupport {
@Override
public void setAsText(String text) throws IllegalArgumentException {
try {
Date date = new SimpleDateFormat("yyyy/MM/dd").parse(text);//对配置的日期值进行转换成日期,根据格式
this.setValue(date);//将转换后的值放到对象属性中
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
里面注意到,改类继承了PropertyEditorSupport类,这个就是提供属性编辑器的支持类,重写其中一个方法setAsText()方法,我们的转换就是在这里面进行的。然后调用PropertyEditorSupport类的setValue()方法,将转换后的值设置进我们的成员变量当中。
这样就可以了吗?还不行,即使我们写好了编辑器的代码,但是Spring不知道,上面也说了,Spring将value值转换成目标类型依赖于属性编辑器的一个map,也就是说,我们接下里的工作要将自定义的属性编辑器,注入到这个map里面。
那么,这个map这哪里?CustomEditorConfigurer Spring依赖的属性编辑器就是这个类,这个类源码中有这么一个成员变量:
private PropertyEditorRegistrar[] propertyEditorRegistrars;
private Map customEditors;
map出现了,对了,就是这个东西。我们要把我们自定义的类注入到这个Map里面。如何注入,又是注入,那就把Spring的这个类当作我们平时写的类来做好了,配置文件,写bean,写property,写map,其实就是这样:
<!-- 配置属性编辑器 ,可分文件配置-->
<!-- 首先配置编辑器的类-->
<bean id="utilDatePropertyEditor" class="com.errrol.util.UtilDatePropertyEditor"></bean>
<!-- 这里进行配置编辑器 -->
<bean id="customEditors" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date" value-ref="utilDatePropertyEditor">
</entry>
</map>
</property>
</bean>
里面配置了两个bean,其中一个是我们写好的Data属性编辑器,另一个是CustomEditorConfigurer类,意思是,往CustomEditorConfigurer类中的成员变量customEditors,这个map里面注入一对键值对,其中键值key=我们所需要转换的类型,那就是Date,value配置的是目标属性编辑器,也就是我们自己写的UtilDatePropertyEditor,用value-ref引用即可。
写好了之后,用jUnit测试方法测试一下,查看我们配置给Date类型的String值有没有被转换成Date类型注入给TradeAcco实例。
TradeAcco [vc_tradeacco=0001, vc_fundacco=980001, en_balance=1000000, en_share=888888.0, ls_manager=[S01, S02, S03, S04], mp_sharedetail={150001=1000, 250001=2000, 350001=3000}, st_fundcurrent=[S01123412, S02231412, S035767, S04213747], prop={1=}, vc_date=Tue Dec 13 00:00:00 CST 2016]
成功注入!
问题又来了,日期的格式我们已经写死了,我们要改的话,又要改配置文件,又要改代码,这实在不是Spring的风格,改进一下。
2、可配置的属性编辑器
其实修改也很简单,时刻想着注入就好,把上面自定义的编辑器中的格式作为一个成员变量,然后配置到配置文件中就好了,直接赋代码
/**
* 自定义的日期属性编辑器
* @author Errol
*
*/
public class UtilDatePropertyEditor extends PropertyEditorSupport {
private String reg;
public String getReg() {
return reg;
}
public void setReg(String reg) {
this.reg = reg;
}
@Override
public void setAsText(String text) throws IllegalArgumentException {
try {
Date date = new SimpleDateFormat(reg).parse(text);//对配置的日期值进行转换成日期,根据格式
this.setValue(date);//将转换后的值放到对象属性中
} catch (ParseException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
然后是配置文件
<!-- 这里进行配置编辑器 -->
<bean id="customEditors" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date" >
<bean id="utilDatePropertyEditor" class="com.errrol.util.UtilDatePropertyEditor">
<property name="reg" value="yyyy/MM/dd"></property>
</bean>
</entry>
</map>
</property>
</bean>
测试运行,搞定!