我们知道,spring在为我们进行动态创建对象过程中,给我们提供了一系列用于处理Java对象变量类型的属性标签,如<value>,<list>,<set>,<map>,<props>和<prop>等,但是对于一些较为复杂的变量类型,spring不会也无法提供,如java.util.Date,这就要求我们利用属性编辑器自行处理。以Date为例:
 
1>.编写目标类:Student.java
public class Student {
  private Date birthday;
    //setter.getter方法
}
 
2>.编写属性编辑器:DateEditor.java
public class DateEditor extends PropertyEditorSupport {//必须继承PropertyEditorSupport
  @Override
  public void setAsText(String text) throws IllegalArgumentException {//text是从配置文件中取得的字符串
    try {
      SimpleDateFormat format=new SimpleDateFormat("y-m-d");
      Date date=format.parse(text);
      setValue(date); //setValue()是从父类继承来的方法,作用是把生成的date对象设置到目标类中    
    } catch (ParseException e) {
      e.printStackTrace();
    }
  } 
}
 
3>.配置文件:test.xml
<beans>
  <bean id="editor" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
    <property name="customEditors">
      <map>
        <entry>
          <key><value>java.util.Date</value></key><!--目标类型-->
          <bean id="myEditor" class="com.cernet.spring.editor.DateEditor"/>
        </entry>
      </map>
    </property>
  </bean>    
  <bean id="student" class="com.cernet.spring.editor.Student">
    <property name="birthday">
      <value>1988-08-08</value>
    </property>
  </bean>
</beans>
 
4>.测试类:Test.java
public static void main(String[] args) { 
    ApplicationContext ctx=new ClassPathXmlApplicationContext("test.xml");
    Student stu=(Student)ctx.getBean("student");
    System.out.println(stu.getBirthday());
 
运行结果:Fri Jan 08 00:08:00 CST 1988
 
说明:
     1.在整个过程中,我们需要做的只是定义属性编辑器并配置到文件中,对编辑器的使用是由spring类完成的。所以,属性编辑器的应用并不是想象中的那么难。
     2.它的运行过程是这样的:在创建ctx之前(ApplicationContext采用饿汉式加载对象),创建Student对象时,spring发现需要注入的变量birthday是Date类型的并且本身没有提供处理此类型数据的标签,于是容器会到配置文件中查找合适的编辑器。当它发现myEditor合适时,就交给了我们编写的com.cernet.spring.editor.DateEditor来进行处理。
     3.注意BeanFactory是不支持属性编辑器的。