前言: 使用spring的属性注入可以为一个实体bean(有对应的set方法)的属性注入值,例如:
<bean id="studySPro" class="study.spring.StudySPro"> <property name="intValue" value="100"></property> <property name="strValue" value="stringValue"></property> <property name="doubleValue" value="10.36"></property> <property name="listValue"> <list> <value>listValue1</value> <value>listValue2</value> <value>listValue3</value> </list> </property> <property name="mapValue"> <map> <entry key="key1" value="value1"/> <entry key="key2" value="value2"/> <entry key="key3" value="value3"/> </map> </property> <property name="setValue"> <set> <value>setValue1</value> <value>setValue2</value> <value>setValue3</value> </set> </property> <property name="arrayStrValue"> <list> <value>arrayStrValue1</value> <value>arrayStrValue2</value> <value>arrayStrValue3</value> </list> </property> <property name="dateValue" value="1988-02-16"></property> </bean>
当在对一个java.util.Date类型的属性注入值的时候,会出现异常,因为spring默认的方式不能够将类似"1988-02-16"的字符串解析为java.util.Date类型.为了解决这个问题,我们需要自己编写将类似"1988-02-16"这样的字符串解析为Date对象的方式,就是这里要说明的 “自定义属性编辑器” .
首先定义一个"自定义属性编辑器类",该类继承了java.beans.PropertyEditorSupport,并且覆写该类的setAsText(String text)方法,通过这个text参数,我们可以拿到欲转换的字符串,例如"1988-02-16".
package study.spring; import java.beans.PropertyEditorSupport; import java.text.DateFormat; import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date; public class DatePropetyEdtor extends PropertyEditorSupport{ private String format = "yyyy-MM-dd"; @Override public void setAsText(String text) throws IllegalArgumentException { DateFormat df = new SimpleDateFormat(format); try { Date date = df.parse(text); this.setValue(date); } catch (ParseException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
注意 : 这个setAsText方法并没有返回值,我们通过调用setValue(Object obj)方法使得我们将字符串转换后的Date对象生效.
最后,要使得spring能够识别并使用我们的自定义属性编辑器,我们需要将这个类注入到一个spring的类的属性中,该属性是org.springframework.beans.factory.config.CustomEditorConfigurer类的customEditors属性,该属性是一个map类型,我们的注入方式类似这样:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"> <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors"> <map> <entry key="java.util.Date"> <bean class="study.spring.DatePropetyEdtor"></bean> </entry> </map> </property> </bean> </beans>
到这里,我们的自定义属性编辑器就可以正常工作了.
其他 :
对于例子代码中 <property name="dateValue" value="1988-02-16"></property>,如果这里我们注入的值变为 "1988/02/16",则又会出异常了,因为我们的 format = "yyyy-MM-dd",对于这种情况,我们可以将转换格式format也抽取出来,使用spring的注入来为其赋值. 例如在构造函数中为format赋值,或者为format添加一个set方法。