Spring属性エディタの解読

10272 ワード

Spring DIを注入すると普通の属性を注入できますが、Dateのようなタイプは識別できません.この場合はSpringのプロパティエディタで設定ファイルの文字列を対応するオブジェクトに変換して注入することができます.
Springには独自の属性エディタがあります.カスタマイズした属性エディタを書くこともできます.
カスタム属性エディタ:
java.beans.PropertyEditors Support類を継承し、その中のsets Axt(String text)方法を書き換える.
またカスタム属性エディタをSpringに注入します.
 
以下、いくつかのステップに分けて、カスタムProptyEditorを定義するプロセスを説明します.
   1)まず、どのように自分のPropertyEditorを編集するかという問題がありますが、Java.beansパッケージの知識が必要です.このカバンの中には、java.beans.PropertyEditorというインターフェースがあります.これはインターフェース方法(12個)を定義しています.つまり、これらの方法を通じてどのように一つのStringを内部のオブジェクトにするかという方法が重要です.    a)setValue(Object value)は直接にオブジェクトを設定し、通常は直接にこの方法で属性オブジェクトを設定しない.     b)setAsText(String text)は、一つの文字列でオブジェクトを作成します.この方法では、文字列を解析して、一つの文字列を作成します.      クラスオブジェクトは、setValueを呼び出して属性オブジェクト設定操作を完了します.    2)すべてのインターフェース方法を実現するのは面倒くさいです.java.beans.PropertyEditors Supportは適時に登場します.普通はこの便利な種類を拡張すればいいです.  3)作成後、Springプロファイルに当該属性タイプエディタを登録する問題で、Springは専用の登録ツール類を提供しています.   org.springframe ework.beans.factory.co.fig.ctomEditonfigrerは、属性のタイプと   プロパティエディタを関連付ける.BenFactoryがBenの属性を注入すると、レジストリの中から属性タイプに対応するエディタを検索します.  以下に小さな例を示し、例を簡単に説明する.  1)UserBenは、属性注入を行う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プロファイルaplication Contect.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.springframe ewark.beans.factory.co.fig.ctomEditonfigrer類はProptyEditors Support類とサブクラスを読み取って文字列を指定の種類に変換できます.
 
PropertyEditors Support類は、変換する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)Address PropertyEditor 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);   
    }   
  
}   
 
Address PropertyEditor.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プロファイルを開き、この2つの構成項目を追加します.
  <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人の友達の貢献に感謝して、とても感謝して、良い人の一生の平安!