關(guān)于Spring屬性編輯器詳解
原文出處:
http://stamen.javaeye.com/blog/24660
最近剛在研究Spring的編輯器,發(fā)現(xiàn)很有意思,剛好galaxystar起了一個(gè)這樣貼,我想對(duì)PropertyEditor作一個(gè)詳細(xì)的整理會(huì)對(duì)大家有益,特定啟了這個(gè)新帖。
所謂的PropertyEditor,顧名思義,就是屬性編輯器。由于Bean屬性通過配置文檔以字符串了方式為屬性賦值,所以必須有一個(gè)“東東”負(fù)責(zé)將這個(gè)字符串轉(zhuǎn)換為屬性的直接對(duì)象,如屬性的類型為int,那么編輯器要做的工作就是int i = Integer.parseInt("1"); Spring為一般的屬性類型提供了默認(rèn)的編輯器,BeanWrapperImpl是Spring框架中重要的類,它負(fù)責(zé)對(duì)注入的Bean進(jìn)行包裝化的管理,常見屬性類型對(duì)應(yīng)的編輯器即在該類中通過以下代碼定義:
代碼
但是,并非Bean的屬性都是這些常見的類型,如果你的Bean需要注入一個(gè)自定義類型的屬性,而又想享受IoC的好處,那么就只得自己開干,提供一個(gè)自定義的PropertyEditor了。 下面,分幾個(gè)步驟來說明,定義一個(gè)自定義PropertyEditor的過程。 1)首先,碰到的問題即是,要如何編輯自己的PropertyEditor,其實(shí)需要了解一點(diǎn)java.beans包的知識(shí),在該包中,有一個(gè)java.beans.PropertyEditor的接口,它定義了一套接口方法(12個(gè)),即通過這些方法如何將一個(gè)String變成內(nèi)部的一個(gè)對(duì)象,這兩個(gè)方法是比較重要的: a)setValue(Object value) 直接設(shè)置一個(gè)對(duì)象,一般不直接用該方法設(shè)置屬性對(duì)象 b)setAsText(String text) 通過一個(gè)字符串來構(gòu)造對(duì)象,一般在此方法中解析字符串,將構(gòu)造一個(gè) 類對(duì)象,調(diào)用setValue(Object)來完成屬性對(duì)象設(shè)置操作。
2)實(shí)現(xiàn)所有的接口方法是麻煩的,java.beans.PropertyEditorSupport 適時(shí)登場(chǎng),一般情況下,我們通過擴(kuò)展這個(gè)方便類即可。
3)編寫完后,就是在Spring配置文件中注冊(cè)該屬性類型編輯器的問題,Spring提供了專門的注冊(cè)工具類 org.springframework.beans.factory.config.CustomEditorConfigurer,它負(fù)責(zé)將屬性類型和 屬性編輯器關(guān)聯(lián)起來。到時(shí)BeanFactory注入Bean的屬性時(shí),即會(huì)在注冊(cè)表中查找屬性類型對(duì)應(yīng)的編輯器。
下面給出一個(gè)小例子,例子先作一個(gè)簡(jiǎn)單描述: 1)Person 需要進(jìn)行屬性注入的Bean,有兩個(gè)屬性 一個(gè)是name,一個(gè)是address Address是一個(gè)類 2)Address Person的屬性類型,本身有3個(gè)屬性。 3)AddressPropertyEditor Address類型對(duì)應(yīng)的屬性編輯器。
開工: 1.Person.java
代碼
2.Address.java
代碼
AddressPropertyEditor.java
代碼
打開Spring配置文件,添上這兩個(gè)配置項(xiàng):
代碼
?
|