JavaBean API 中提供了这样一个接口:java.beans.PropertyEditor,该接口提供了将字符串值(String类型)映射为非String类型的方法。它便是传说中的属性编辑器。通过实现该接口,用户可以编写自定义属性编辑器,以将spring配置文件中的字符串转换成相应的对象注入。

    但该接口有12个方法,如果用户要实现该接口编写自定义的属性编辑器会比较麻烦。幸运的是有一个好用的这个接口的实现类:java.beans.PropertyEditorSupport,我们可以继承这个实现类,覆写其中的setAsText(String value)方法,来实现我们的自定义属性编辑器。

    使用自定义编辑器的几个步骤:

(1)继承PropertyEditorSupport类,覆写setAsText(String value)方法,该方法通过一个字符串来构造对象,一般在此方法中解析字符串,构造一个类对象object(构造什么对象要看要注入的属性是什么类型),调用setValue(object)来完成属性对象设置操作

(2)在spring配置文件中注册该属性编辑器

举例:

一个User类,有两个属性:name(String 类型);address(Address 类型)

User.java

 
  
  1. public class User { 
  2.     private String name; 
  3.     private Address address; 
  4.     // getters and setters 
  5.     public getName() { 
  6.         return name; 
  7.     } 
  8.     public void setName(String name) { 
  9.         this.name = name; 
  10.     } 
  11.     public getAddress() { 
  12.         return address; 
  13.     } 
  14.     public void setAddress(Address address) { 
  15.         this.address = address; 
  16.     } 

Address.java

 
  
  1. public class Address { 
  2.     public String streetName; 
  3.     public String doorNum; 
  4.     // getters and setters省略 

AddressPropertyEditor.java

 
  
  1. public class AddressPropertyEditor extends PropertyEditorSupport { 
  2.     public void setAsText(String text) { 
  3.         if (text == null || text.equals("")) {    
  4.             throw new IllegalArgumentException("text can't be null or empty");    
  5.         } else {    
  6.             String[] strArr = StringUtils.tokenizeToStringArray(text,",");    
  7.             Address add = new Address();    
  8.             add.setStreetName(strArr[0]);    
  9.             add.setDoorNum(strArr[1]);   
  10.             setValue(add);    
  11.         }    
  12.     }    
  13.         
  14.     public String getAsText() {    
  15.         Address add = (Address)getValue();    
  16.         return "" + add;    
  17.     }    
  18. }    

spring配置文件中添加:

 
  
  1. <bean id="customEditorConfigurer"  class="org.springframework.beans.factory.config.CustomEditorConfigurer">    
  2.   <property name="customEditors">    
  3.     <map>    
  4.       <entry key="org.itec.elwg.entity.Address"> <!-- 属性类型 -->    
  5.         <bean class="org.itec.elwg.customeditor.AddressPropertyEditor"/> <!--对应Address的编辑器 -->    
  6.       </entry>    
  7.     </map>    
  8.   </property>    
  9. </bean>    
  10.    
  11.  <bean id="user" class="org.itec.elwg.entity.User">    
  12.     <property name="name" value="小白"/>    
  13.     <property name="address" value="珞瑜路,1037"/>    
  14.  </bean> 

CustomEditorConfigurer类将Address属性与AddrPropertyEditor属性编辑器关联起来, 在为user注入Address类型的address属性时,spring会使用AddressPropertyEditor利用“珞瑜路,1037”字符串的值转换成一个Address对象付给address。