在Spring2.5中定製自己的屬性編輯器

銀河使者發表於2008-05-07
本文為原創,如需轉載,請註明作者和出處,謝謝!

裝配Bean是Spring的一個非常重要的功能。我們可以通過Spring在XML檔案中配置Java Bean,然後通過ApplicationContext來獲得Bean的物件例項。在配置Bean時,需要對構造方法的引數,屬性進行初始化。對於Java簡單型別或簡單型別的List、Map等資料型別初始化非常簡單,如下面就是一個對簡單型別屬性和構造方法引數進行初始化的配置程式碼:
<!--  要求Spring2.0或Spring2.5   scope="prototype"相當於Spring1.x的singleton="false" --&gt


            my value1
       

       
                皮球
       


            
                    value1
                    value2
               

       



但對於複雜型別的屬性或引數,如一個屬性的型別是另外一個Java Class,這樣就必須在配置檔案中再宣告這個Java Class,如果這種情況很多時,或是我們做的類要release時,就會給開發人員增加很多工作量。讓我們先來舉個例子。假設有兩個類:Contact和PhoneNumber,Contact的phoneNumber屬性的型別是PhoneNumber,程式碼如下:

Contact類

package bean;

public class Contact
{
    private PhoneNumber phoneNumber;
        public PhoneNumber getPhoneNumber()
        {
                return phoneNumber;
        }
        public void setPhoneNumber(PhoneNumber phoneNumber)
        {
                this.phoneNumber = phoneNumber;
        }
}

PhoneNumber類

package bean;

public class PhoneNumber
{
    private String number;
    public PhoneNumber(String s)
    {
            this.number = s;
    }
    public String getNumber()
    {
            return number;
    }
}

    如果直接在XML配置檔案中裝配Contact類,就需要先裝配PhoneNumber類,程式碼如下:


        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:tx="http://www.springframework.org/schema/tx"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd">

       
               
                       
               

       

       
               
                        12345678
               

       



從上面的程式碼中可以看到,裝載Contact的同時,也裝載了PhoneNumber。但如果使用了屬性編輯器,就可以無需裝載PhoneNumber就可以裝載Contact了。
編寫自己的屬性編輯器的步驟很簡單,屬性編輯器類需要從java.beans.PropertyEditorSupport類繼承,在這個類中有一個setAsText方法,這個方法有一個String型別的引數,通過這個方法,可以將String型別的引數值轉換成其他型別的屬性。在這個方法中我們還需要使用一個setValue方法,就來指定轉換後的物件例項。好,現在我們來實現這個簡單的編輯器類,程式碼如下:

package editor;

public class PhoneEditor extends java.beans.PropertyEditorSupport
{
@Override
public void setAsText(String text) throws IllegalArgumentException
{               
        setValue(new bean.PhoneNumber(text));
}
}

    這個類的程式碼非常簡單,在setAsText方法中只有一行程式碼,實際上只是建立一個PhoneNumber物件例項,並將text屬性值作為引數值傳入PhoneNumber的構造方法。接下來我們在配置檔案中安裝這個屬性編輯器(實際上是裝配org.springframework.beans.factory.config.CustomEditorConfigurer類),程式碼如下:

                class="org.springframework.beans.factory.config.CustomEditorConfigurer">
       
               
                       
                               
                       

               

       




    從上面的程式碼可以看出,屬性編輯器是使用了CustomEditorConfigurer的customEditors屬性進行安裝的。這是一個Map型別的屬性。key的值必須是屬性編輯器最終轉換後的型別名,如在本例中,要將文字的引數值轉換成bean.PhoneNumber型別的值,因此,key必須為bean.PhoneNumber。  下面我們來使用PhoneEditor屬性編輯器類來裝配Contact類,程式碼如下:


       
                87654321
       



也許大家都注意到了上面這段程式碼的變化,在設定phoneNumber屬性預設值時,不再使用標籤來引用phoneNumber物件,而是直接使用了來設定一個文字的電話號。Spring當遇到這種情況時,也就是說,某個屬性值和屬性型別不一致時(如本例中一個是文字,一個是PhoneNumber型別),會先找一下屬性型別是否有相應的屬性編輯器已經被安裝,在本例中將以bean.PhoneNumber作為key來查詢,正好找到上面安裝的PhoneEditor,因此,Spring就會呼叫PhoneEditor類中的setAsValue方法來設定PhoneNumber物件例項,然後Spring在內部又分呼叫getValue來獲得PhoneNumber物件例項,並將其賦給Contact的phoneNumber屬性。其實所有型別的bean.PhoneNumber的屬性都可以使用這個屬性編輯器。
大家可以看看,這樣做是不是簡單的多!尤其是在釋出通用的framework或程式時,就更為簡單了。在Spring中已經定義了很多這種屬性編輯器,如我們可以使用org.springframework.beans.propertyeditors.URLEditor將字串對映成java.net.URL物件。

    下面的程式碼通過ApplicationContext來獲得Contact的物件例項,並輸出其phoneNumber屬性值:


import org.springframework.context.*;
import org.springframework.context.support.*;
public class Test
{

        public static void main(String[] args)
        {
               
                ApplicationContext context = new
FileSystemXmlApplicationContext("src\applicationContext.xml");
       
                bean.Contact contact = (bean.Contact) context.getBean("contact");
                System.out.println(contact.getPhoneNumber().getNumber());

        }

}


注:實際上,屬性編輯器本身是由Java提供了,Spring只是利用了這一特性使裝配一個Bean更容易而已。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/12921506/viewspace-263085/,如需轉載,請註明出處,否則將追究法律責任。

相關文章