`
hl756799782
  • 浏览: 74900 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring属性编辑器解读(转载)

阅读更多
Spring DI注入的时候可以把普通属性注入进来,但是像Date类型的就无法被识别。这时可以通过Spring的属性编辑器把配置文件中的字符串转化成相应的对象进行注入。


Spring有自带的属性编辑器,我们也可以写自定义的属性编辑器


自定义属性编辑器:


继承java.beans.PropertyEditorSupport类,重写其中的setAsText(String text)方法。


再把自定义的属性编辑器注入到Spring中。

 

下面,分几个步骤来说明,定义一个自定义PropertyEditor的过程。

 
  1)首先,碰到的问题即是,要如何编辑自己的PropertyEditor,其实需要了解一点java.beans包的知识,在该包中,有一个java.beans.PropertyEditor的接口,它定义了一套接口方法(12个),即通过这些方法如何将一个String变成内部的一个对象,这两个方法是比较重要的:
    a)setValue(Object value) 直接设置一个对象,一般不直接用该方法设置属性对象 
    b)setAsText(String text) 通过一个字符串来构造对象,一般在此方法中解析字符串,将构造一个
      类对象,调用setValue(Object)来完成属性对象设置操作。
 
  2)实现所有的接口方法是麻烦的,java.beans.PropertyEditorSupport 适时登场,一般情况下,我们通过扩展这个方便类即可。

  3)编写完后,就是在Spring配置文件中注册该属性类型编辑器的问题,Spring提供了专门的注册工具类
   org.springframework.beans.factory.config.CustomEditorConfigurer,它负责将属性类型和
   属性编辑器关联起来。到时BeanFactory注入Bean的属性时,即会在注册表中查找属性类型对应的编辑器。

  下面给出一个小例子,例子先作一个简单描述:
  1)UserBean 需要进行属性注入的Bean,一个Date类型的属性。 
  2)DatePropertyEditor Date类型对应的属性编辑器。 
 

 

例子:

 

JavaBean类

 

Java代码

package com.cos.entity;        
       
import java.util.Date;        
import java.util.List;        
import java.util.Map;        
import java.util.Set;        
       
public class UserBean {        
       
    private Date birthday;        
       
    public Date getBirthday() {        
        return birthday;        
    }        
       
    public void setBirthday(Date birthday) {        
        this.birthday = birthday;        
    }        
}

 

自定义属性编辑器

 

Java代码

 

package com.cos.entity;        
       
import java.beans.PropertyEditorSupport;        
import java.text.ParseException;        
import java.text.SimpleDateFormat;        
       
//自己写一个自定义属性编辑器来继承属性编辑器PropertyEditorSupport        
public class DatePropertyEditor extends PropertyEditorSupport {        
       
    //时间的格式        
    String format;        
       
    public String getFormat() {        
        return format;        
    }        
       
    public void setFormat(String format) {        
        this.format = format;        
    }        
       
    //需要重写属性编辑器的setAsText()方法        
    @Override       
    public void setAsText(String text) {        
        try {        
            SimpleDateFormat f = new SimpleDateFormat(format);        
            //把转换后的值传进去        
            this.setValue(f.parse(text));        
        } catch (ParseException ex) {        
            ex.printStackTrace();        
        }        
    }        
}    

 

 

spring配置文件 applicationContext.xml :

 

Xml代码

 

<beans xmlns="http://www.springframework.org/schema/beans"       
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"       
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd        
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">       
       
    <!-- 普通属性注入 -->       
    <bean id="userBean" class="com.cos.entity.UserBean">       
        <!-- 时间属性,需要属性编辑器 -->       
        <property name="birthday" value="2011-03-16"/>       
    </bean>       
       
    <!-- 特殊属性的注入.把特殊属性注入到CustomEditorConfigurer Bean 里 -->       
    <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">       
        <property name="customEditors">       
            <map>       
                <entry key="java.util.Date">       
                    <bean class="com.cos.entity.DatePropertyEditor">       
                        <property name="format" value="yyyy-MM-dd"/>       
                    </bean>       
                </entry>       
            </map>       
        </property>       
    </bean>       
</beans>    

 

 

org.springframework.beans.factory.config.CustomEditorConfigurer类可以读取PropertyEditorSupport类及子类,将字符串转化为指定的类型。

 

PropertyEditorSupport类把要转化的Date类型注入到customEditors Map中。

 

测试类:

 

Java代码

 

package com.cos.entity;        
       
import org.springframework.beans.factory.BeanFactory;        
import org.springframework.context.support.ClassPathXmlApplicationContext;        
       
public class Main {        
       
    public static void main(String[] args) {        
        //通过spring配置文件返回Bean的工厂对象        
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");        
        //Bean工厂通过Bean的id得到JavaBean        
        UserBean ub = (UserBean) factory.getBean("userBean");        
        System.out.println(""+ub.getBirthday());        
    }        
}  

 

示例2:

  1)Person 需要进行属性注入的Bean,有两个属性 一个是name,一个是address Address是一个类
  2)Address Person的属性类型,本身有3个属性。
  3)AddressPropertyEditor Address类型对应的属性编辑器。

 

1.Person.java

package com.stamen.propedit;   
  
import org.apache.commons.lang.builder.ToStringBuilder;   
  
  
public class Person {   
    private String name;   
  
    private Address address;   
  
  
    public Address getAddress() {   
        return address;   
    }   
  
    public void setAddress(Address address) {   
        this.address = address;   
    }   
  
    public String getName() {   
        return name;   
    }   
  
    public void setName(String name) {   
        this.name = name;   
    }   
    public String toString() {   
        return ToStringBuilder.reflectionToString(this);   
    }   
 } 

 

2.Address.java

 

package com.stamen.propedit;   
import org.apache.commons.lang.builder.ToStringBuilder;   
public class Address {   
    private String street;   
  
    private String doorNum;   
  
    private String postCode;   
  
    public String getDoorNum() {   
        return doorNum;   
    }   
  
    public void setDoorNum(String doorNum) {   
        this.doorNum = doorNum;   
    }   
  
    public String getPostCode() {   
        return postCode;   
    }   
  
    public void setPostCode(String postCode) {   
        this.postCode = postCode;   
    }   
  
    public String getStreet() {   
        return street;   
    }   
  
    public void setStreet(String street) {   
        this.street = street;   
    }   
       
    public String toString() {   
        return ToStringBuilder.reflectionToString(this);   
    }   
  
}   

 

AddressPropertyEditor.java

package com.stamen.propedit;   
  
import java.beans.PropertyEditorSupport;   
import java.util.Date;   
  
import org.springframework.util.StringUtils;   
public class AddressPropertyEditor extends PropertyEditorSupport{   
    //支持的格式为 streeValue,doorNumValue,postCode   
    public void setAsText(String text)   
    {   
        System.out.println("使用自己的编辑器。");   
        if (text == null || !StringUtils.hasText(text)) {   
            throw new IllegalArgumentException("老大,不能为空啊!");   
        }   
        else  
        {   
            String[] strArr = StringUtils.tokenizeToStringArray(text,",");   
            Address add = new Address();   
            add.setStreet(strArr[0]);   
            add.setDoorNum(strArr[1]);   
            add.setPostCode(strArr[2]);   
            setValue(add);   
        }   
    }   
       
    public String getAsText()   
    {   
        Address add = (Address)getValue();   
        return ""+add;   
    }   
}   

 

打开Spring配置文件,添上这两个配置项:

  <bean id="customEditorConfigurer"  class="org.springframework.beans.factory.config.CustomEditorConfigurer">   
  <property name="customEditors">   
    <map>   
      <entry key="com.stamen.propedit.Address"> <!-- 属性类型 -->   
        <bean class="com.stamen.propedit.AddressPropertyEditor"/> <!--对应Address的编辑器 -->   
      </entry>   
    </map>   
  </property>   
</bean>   
  
 <bean id="person" class="com.stamen.propedit.Person">   
    <property name="name" value="Tom"/>   
    <property name="address" value="朝阳区,Soho 1601,010101"/>   
 </bean>  

 
本文参考了部分学友的文章,原文地址:http://nathanyu.iteye.com/blog/1001814http://www.iteye.com/topic/24660,谢谢这2位朋友的贡献,非常感谢,好人一生平安!

分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics