亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > Java > 正文

淺談Spring的屬性編輯器的使用

2024-07-14 08:40:54
字體:
來源:轉載
供稿:網友

在 Spring 配置文件中,我們往往通過字面值設置 Bean 各種類型的屬性值 ,這個功能是通過屬性編輯器實現的。

任何實現了 java.beans.PropertyEditor 接口的類都是屬性編輯器 。 它可以將外部需要設置的值轉換為 JVM 內部的對應類型,所以屬性編輯器其實就是一個類型轉換器 。

1 JavaBean 編輯器

Sun 所制定的 JavaBean 編輯器,很大程度上是為 IDE 準備的。它讓 IDE 能夠以可視化的方式來設置 JavaBean 的屬性 。

Java 通過 java.beans.PropertyEditor 定義了設置 JavaBean 屬性的方法,通過 BeanInfo 描述了 JavaBean 哪些屬性是可定制的,此外還描述了可定制屬性與 PropertyEditor 之間的對應關系 。

BeanInfo 與 JavaBean 之間的對應關系,通過兩者之間規范的命名確立,對應 JavaBean 的 BeanInfo 采用如下命名規范:<Bean>BeanInfo。 如 BookBean 對應的 BeanInfo 為 BookBeanBeanInfo。 當 JavaBean 連同其屬性編輯器注冊到 IDE 后,當在開發界面中對 JavaBean 進行定制時, IDE 就會根據 JavaBean 規范找到對應的 BeanInfo ,然后再根據 BeanInfo 中的描述信息找到 JavaBean 屬性描述(使用哪個屬性編輯器等),進而為 JavaBean 生成特定開發編輯界面 。

Java 提供了一個用于管理默認屬性編輯器的管理器: PropertyEditorManager ,它保存著一些常見類型的屬性編輯器,如果某個 JavaBean 的常見類型屬性沒有通過 BeanInfo 顯式指定它的屬性編輯器, 那么 IDE 將自動使用 PropertyEditorManager 中注冊的對應屬性的默認編輯器 。

1.1 屬性編輯器(PropertyEditor)
PropertyEditor 是屬性編輯器接口,它定義了將外部設置值轉換為內部 JavaBean 屬性值的接口方法 。主要接口方法說明如下:

 

方法 說明
Object getValue() 返回屬性的當前值 ,基本類型被封裝成對應的包裝類型
void setValue(Object newValue) 設置屬性的值,基本類型以包裝類型傳入
String getAsText() 用字符串來表示屬性對象,以便外部的屬性編輯器能夠以可視化的方式顯示 。 默認返回 null ,表示該屬性不能以字符串表示。
void setAsText(String text) 用一個字符串去更新屬性的內部值,它一般從外部屬性編輯器傳入的。
String[] getTags() 返回表示有效屬性值的字符串數組,以便屬性編輯器能夠以下拉框的方式進行展示 。 默認返回 null。
String getJavaInitializationString() 為屬性提供初始值,屬性編輯器以此值作為屬性的默認值 。

 

PropertyEditor 接口是內部屬性值和外部設置值的溝通橋梁 。

Java 為 PropertyEditor 提供了一個方便的實現類: PropertyEditorSupport ,該類實現了 PropertyEditor 接口,我們可以通過擴展這個類來設計自己的屬性編輯器 。

1.2 Bean 屬性描述(BeanInfo)

BeanInfo 描述了 JavaBean 中的可編輯屬性以及對應的屬性編輯器,每一個屬性對應一個屬性描述器 PropertyDescriptor。

PropertyDescriptor 的構造函數有兩個入參: PropertyDescriptor(String propertyName, Class beanClass) ,其中 propertyName 為屬性名; beanClass 是 JavaBean 所對應的 Class。

PropertyDescriptor 還有一個 setPropertyEditorClass(Class propertyEditorClass) 方法,它可以為 JavaBean 屬性指定編輯器 。

BeanInfo 接口中最重要的方法是:PropertyDescriptor[] getPropertyDescriptors() ,它會返回 JavaBean 的屬性描述器數組 。

BeanInfo 接口的一個常用的實現類是 SimpleBeanInfo ,我們可以通過擴展這個類來實現自定義的功能 。

2 Spring 默認屬性編輯器

Spring 的屬性編輯器與傳統的用于 IDE 開發的屬性編輯器不同,它沒有 UI 界面,只是將配置文件中的文本配置值轉換為 Bean 屬性的對應值 。

Spring 在 PropertyEditorRegistrySupport 中為常見的屬性類型提供了默認屬性編輯器,分為 3 大類,共有 32 個:

 

類型 說明
基礎數據類型 【1】基本數據類型,如: boolean、int 等; 【2】基本數據類型封裝類,如: Boolean、Integer 等; 【3】基本數據類型數組: char[] 和 byte[] ; 【4】大數: BigDecimal 和 BigInteger 。
集合類 Collection、Set、SortedSet、List 和 SortedMap。
資源類 Class、Class[]、File、InputStream、Locale、Properties、Resource[] 和 URL。

 

PropertyEditorRegistrySupport 中有兩個用于保存屬性編輯器的 Map 類型變量:

 

變量名 說明
defaultEditors 保存默認屬性類型的編輯器,元素的鍵為屬性類型,值為對應的屬性編輯器實例。
customEditors 保存用戶自定義的屬性編輯器,元素的鍵值和 defaultEditors 相同 。

 

3 自定義 Spring 屬性編輯器

如果我們的應用定義了特殊類型的屬性,并且希望在配置文件中以字面值方式來配置屬性值,那么就可以編寫自定義屬性編輯器并注冊到 Spring 容器的方式來實現。

Spring 默認的屬性編輯器大都擴展自 java.beans.PropertyEditorSupport,我們可以通過擴展 PropertyEditorSupport 來自定義屬性編輯器 。在Spring 環境下僅需要將配置文件中字面值轉換為屬性類型的對象即可,并不需要提供 UI 界面,所以僅需要覆蓋 PropertyEditorSupport 的 setAsText() 方法就可以啦 (∩_∩)O哈哈~。

假設我們有兩個實體 Book 和 Author,希望在配置 Book 時,可以直接設置 Author 的名字。

Book.java

public class Book { /**  * 作者  */ private Author author; /**  * 書名  */ private String name; //省略 get/setter 方法}

Author.java

public class Author { private String name; //省略 get/setter 方法}

首先,自定義 author 的屬性編輯器:

public class CustomPropertyEditor extends PropertyEditorSupport { @Override public void setAsText(String text) throws IllegalArgumentException {  if(text==null||text.length()==0){   throw new IllegalArgumentException("格式錯誤");  }  Author author=new Author();  author.setName(text);  //調用父類的方法,來設置屬性對象  setValue(author); }}

如果使用 BeanFactory ,則需要手工調用 registerCustomEditor(Class requiredType, PropertyEditor propertyEditor) 方法注冊自定義屬性編輯器;如果使用的是 ApplicationContext ,那么只需要在配置文件中注冊 CustomEditorConfigurer 即可 。CustomEditorConfigurer 實現了BeanFactoryPostProcessor 接口,所以它是一個 Bean 的工廠后處理器 。

現在注冊自定義的屬性編輯器:

<!-- 注冊自定義的屬性編輯器--><bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"> <property name="customEditors">  <map>   <!-- key:屬性類型;value:屬性編輯器-->   <entry key="net.deniro.spring4.editor.Author"     value="net.deniro.spring4.editor.CustomPropertyEditor"     />  </map> </property></bean><bean id="book" class="net.deniro.spring4.editor.Book"> <property name="name" value="海邊的卡夫卡"/> <!-- 使用之前定義的編輯器注入該屬性--> <property name="author" value="村上春樹"/></bean>

BeanWrapper 在設置 book 的 author 屬性時,將檢索自定義屬性編輯器注冊表,當發現 author 屬性類型所對應的屬性編輯器 CustomPropertyEditor 時,它就會這個定制的屬性編輯器把 "村上春樹" 轉換為 Author 對象 。

按照規范, Java 會在 JavaBean 的相同類包下查找是否存在 <JavaBean>Editor 的類;如果存在,就會自動使用 <JavaBean>Editor作為該 JavaBean 的屬性編輯器 。Spring 也支持這個規范。

所以如果在類包下有一個名為 AuthorEditor 屬性編輯器類,那么就無須在配置文件中注冊自定義的屬性編輯器啦O(∩_∩)O哈哈~

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持VeVb武林網。


注:相關教程知識閱讀請移步到JAVA教程頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
欧美精品在线网站| 国产精品入口福利| 日本19禁啪啪免费观看www| 久久久久久久久久久成人| 国产亚洲一区精品| 精品成人乱色一区二区| 国内精品视频久久| 欧美日韩中文在线观看| 亚洲新中文字幕| 国产亚洲一区二区精品| 成人网在线观看| 中文欧美日本在线资源| 在线观看免费高清视频97| 午夜精品久久久久久久99热浪潮| 最近2019好看的中文字幕免费| 国产亚洲欧洲高清| 国产精品福利在线观看| 欧美日韩国产中字| 久久精品99国产精品酒店日本| 日韩电影免费观看在线| 91在线观看免费观看| 欧美极度另类性三渗透| 欧美中文字幕精品| 91网在线免费观看| 在线观看日韩av| 亚洲精品美女久久久| 国产亚洲成av人片在线观看桃| 色妞久久福利网| 热久久这里只有| 欧美一级淫片播放口| 亚洲欧洲中文天堂| 欧美极品美女视频网站在线观看免费| 欧美日韩福利在线观看| 成人福利免费观看| 一区二区欧美日韩视频| 一本久久综合亚洲鲁鲁| 国产一区二区在线播放| 成人亚洲综合色就1024| 亚洲第一视频在线观看| 91免费视频网站| 国产成人综合亚洲| 欧美黑人狂野猛交老妇| 亚洲精品99久久久久| 综合136福利视频在线| 国产成人精品一区二区三区| 久久国产精品99国产精| 欧美成人性色生活仑片| 欧美丰满片xxx777| 欧美天堂在线观看| 日韩美女主播视频| 日韩av网站电影| 在线观看亚洲视频| 久久视频在线播放| 91高潮在线观看| 日韩高清电影免费观看完整| 国产深夜精品福利| 日韩电视剧免费观看网站| 91美女福利视频高清| 国产一区二区三区日韩欧美| 国产精品影片在线观看| 久热国产精品视频| 国产精品久久久久久搜索| 一区二区三区四区在线观看视频| 国产在线精品播放| 91sao在线观看国产| 色综合91久久精品中文字幕| 国产精品99免视看9| 久久久久久国产精品久久| 国产精品成熟老女人| www亚洲精品| 2018中文字幕一区二区三区| 欧美日韩性视频| 久久综合伊人77777| 中文字幕在线视频日韩| 一区二区日韩精品| 久久精品国产成人精品| 欧美在线视频免费| 92国产精品久久久久首页| 一本一本久久a久久精品牛牛影视| 欧美激情亚洲精品| 国产精品免费视频久久久| 日韩在线中文字幕| 欧美老肥婆性猛交视频| 日韩a**中文字幕| 亚洲www永久成人夜色| 亚洲国产精品成人精品| 91在线网站视频| 欧美精品videosex性欧美| 97在线视频免费播放| 欧美日韩在线另类| 亚洲毛茸茸少妇高潮呻吟| 久久99国产精品自在自在app| 国产精品成人一区二区三区吃奶| 色偷偷av亚洲男人的天堂| 久久精品视频一| 日韩欧美aaa| 日韩中文字幕视频在线观看| 亚洲第一天堂av| 日韩av网站在线| 色樱桃影院亚洲精品影院| 久久影视免费观看| 91在线看www| 在线播放国产一区中文字幕剧情欧美| 韩国三级日本三级少妇99| 色yeye香蕉凹凸一区二区av| 亚洲免费高清视频| 日韩中文综合网| 欧美视频国产精品| 91tv亚洲精品香蕉国产一区7ujn| 日韩免费看的电影电视剧大全| 精品国产91久久久久久老师| 久久久久这里只有精品| 国产成人亚洲综合91精品| 国产精品第8页| 欧美性xxxx极品hd满灌| 亚洲aⅴ日韩av电影在线观看| 96国产粉嫩美女| 不卡毛片在线看| 91精品成人久久| 国产成人精品一区二区三区| 欧美性猛交xxxx乱大交极品| xvideos成人免费中文版| 日韩福利在线播放| 欧美国产在线电影| 日韩乱码在线视频| 精品国产精品三级精品av网址| 一区二区三区四区视频| 成人黄色中文字幕| 亚洲欧美中文日韩v在线观看| 欧美一级视频免费在线观看| 国产精品天天狠天天看| 久久精品一区中文字幕| 国产成人免费91av在线| 日韩一区二区三区在线播放| 欧美极品美女电影一区| 精品高清一区二区三区| 丰满岳妇乱一区二区三区| 欧美专区日韩视频| 亚洲精品影视在线观看| 亚洲激情在线视频| 欧美在线亚洲在线| 亚洲一品av免费观看| 在线看福利67194| 97**国产露脸精品国产| 疯狂做受xxxx高潮欧美日本| 亚洲精品美女在线| 国产精品一香蕉国产线看观看| 奇米4444一区二区三区| 2019日本中文字幕| 日韩在线精品一区| 亚洲精品乱码久久久久久金桔影视| 精品久久久999| 国产精品网站入口| 成人夜晚看av| 超碰91人人草人人干| 色偷偷亚洲男人天堂| 国产精品久久久久久久电影| 欧美在线免费看| 色偷偷9999www| 91美女片黄在线观| 亚洲第一精品夜夜躁人人爽| 日韩欧中文字幕| 日韩av网址在线| 亚洲色图美腿丝袜|