欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

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

 更新時間:2018年05月20日 15:24:26   作者:deniro  
這篇文章主要介紹了淺談Spring的屬性編輯器的使用,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

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

任何實現(xiàn)了 java.beans.PropertyEditor 接口的類都是屬性編輯器 。 它可以將外部需要設(shè)置的值轉(zhuǎn)換為 JVM 內(nèi)部的對應(yīng)類型,所以屬性編輯器其實就是一個類型轉(zhuǎn)換器 。

1 JavaBean 編輯器

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

Java 通過 java.beans.PropertyEditor 定義了設(shè)置 JavaBean 屬性的方法,通過 BeanInfo 描述了 JavaBean 哪些屬性是可定制的,此外還描述了可定制屬性與 PropertyEditor 之間的對應(yīng)關(guān)系 。

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

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

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

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

PropertyEditor 接口是內(nèi)部屬性值和外部設(shè)置值的溝通橋梁 。

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

1.2 Bean 屬性描述(BeanInfo)

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

PropertyDescriptor 的構(gòu)造函數(shù)有兩個入?yún)ⅲ?PropertyDescriptor(String propertyName, Class beanClass) ,其中 propertyName 為屬性名; beanClass 是 JavaBean 所對應(yīng)的 Class。

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

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

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

2 Spring 默認(rèn)屬性編輯器

Spring 的屬性編輯器與傳統(tǒng)的用于 IDE 開發(fā)的屬性編輯器不同,它沒有 UI 界面,只是將配置文件中的文本配置值轉(zhuǎn)換為 Bean 屬性的對應(yīng)值 。

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

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

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

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

3 自定義 Spring 屬性編輯器

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

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

假設(shè)我們有兩個實體 Book 和 Author,希望在配置 Book 時,可以直接設(shè)置 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);
  //調(diào)用父類的方法,來設(shè)置屬性對象
  setValue(author);
 }
}

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

現(xiàn)在注冊自定義的屬性編輯器:

<!-- 注冊自定義的屬性編輯器-->
<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 在設(shè)置 book 的 author 屬性時,將檢索自定義屬性編輯器注冊表,當(dāng)發(fā)現(xiàn) author 屬性類型所對應(yīng)的屬性編輯器 CustomPropertyEditor 時,它就會這個定制的屬性編輯器把 "村上春樹" 轉(zhuǎn)換為 Author 對象 。

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

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

以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • Idea設(shè)置spring boot應(yīng)用配置參數(shù)的兩種方式

    Idea設(shè)置spring boot應(yīng)用配置參數(shù)的兩種方式

    本文通過兩個方式介紹Idea設(shè)置spring boot應(yīng)用配置參數(shù),一種是配置VM options的參數(shù)時要以:-DparamName的格式設(shè)置參數(shù),第二種可以參考下本文詳細(xì)設(shè)置,感興趣的朋友跟隨小編一起看看吧
    2023-11-11
  • Java web的讀取Excel簡單實例代碼

    Java web的讀取Excel簡單實例代碼

    下面小編就為大家?guī)硪黄狫ava web的讀取Excel簡單實例代碼。小編覺挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2016-06-06
  • Spring Shell應(yīng)用程序開發(fā)流程解析

    Spring Shell應(yīng)用程序開發(fā)流程解析

    這篇文章主要介紹了Spring Shell應(yīng)用程序開發(fā)流程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-10-10
  • Spring案例打印機的實現(xiàn)過程詳解

    Spring案例打印機的實現(xiàn)過程詳解

    這篇文章主要介紹了Spring案例打印機的實現(xiàn)過程詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-10-10
  • Java C++ leetcode執(zhí)行一次字符串交換能否使兩個字符串相等

    Java C++ leetcode執(zhí)行一次字符串交換能否使兩個字符串相等

    這篇文章主要為大家介紹了Java C++ leetcode1790執(zhí)行一次字符串交換能否使兩個字符串相等,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-10-10
  • SpringBoot設(shè)置接口超時時間的方法

    SpringBoot設(shè)置接口超時時間的方法

    這篇文章主要介紹了SpringBoot設(shè)置接口超時時間的方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2019-08-08
  • SpringBoot Maven Clean報錯解決方案

    SpringBoot Maven Clean報錯解決方案

    這篇文章主要介紹了SpringBoot Maven Clean報錯解決方案,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2020-03-03
  • struts2框架入門

    struts2框架入門

    本文主要介紹了struts2框架的基礎(chǔ)入門知識。具有很好的參考價值。下面跟著小編一起來看下吧
    2017-03-03
  • 聊聊關(guān)于Java方法重寫的反思

    聊聊關(guān)于Java方法重寫的反思

    最近在開發(fā)中遇到一個關(guān)于Java方法重寫的一些問題,對于方法重寫的用法以及可能導(dǎo)致的問題產(chǎn)生了一些思考,本文用于記錄下這些想法,希望對大家也有所幫助
    2023-05-05
  • SpringBoot之使用枚舉參數(shù)案例詳解

    SpringBoot之使用枚舉參數(shù)案例詳解

    這篇文章主要介紹了SpringBoot之使用枚舉參數(shù)案例詳解,本篇文章通過簡要的案例,講解了該項技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-09-09

最新評論