Spring学习02--属性编辑器

来源:互联网 发布:网络战略游戏图片 编辑:程序博客网 时间:2024/06/10 11:27

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>

测试运行,搞定!

0 0
原创粉丝点击