日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

Spring5参考指南: BeanWrapper和PropertyEditor

發(fā)布時間:2024/2/28 javascript 36 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Spring5参考指南: BeanWrapper和PropertyEditor 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

文章目錄

    • BeanWrapper
    • PropertyEditor

BeanWrapper

通常來說一個Bean包含一個默認的無參構(gòu)造函數(shù),和屬性的get,set方法。

org.springframework.beans 包里面有個很重要的類叫做BeanWrapper接口和他的實現(xiàn)BeanWrapperImpl,BeanWrapper提供了設(shè)置和獲取屬性值(單個或批量)、獲取屬性描述符和查詢屬性的功能,以確定它們是可讀的還是可寫的。

此外,BeanWrapper還支持嵌套屬性,允許將子屬性的屬性設(shè)置為無限深度。BeanWrapper還支持添加標準JavaBeans屬性PropertyChangeListeners和VetoableChangeListeners,而不需要在目標類中支持代碼。最后,BeanWrapper提供了對設(shè)置索引屬性的支持。BeanWrapper通常不直接由應(yīng)用程序代碼使用,而是由DataBinder和BeanFactory使用。

BeanWrapper提供了setPropertyValue,setPropertyValues,getPropertyValue和getPropertyValues方法,和一系列的可覆蓋的方法來實現(xiàn)對Bean的操作。

下面是使用BeanWrapper的例子,我們先定義兩個bean:

@Data public class Company {private String name;private Employee managingDirector; } @Data public class Employee {private String name;private float salary;}

下面是使用的例子:

public class BeanWrapperUsage {public static void main(String[] args) {BeanWrapper company = new BeanWrapperImpl(new Company());// setting the company name..company.setPropertyValue("name", "Some Company Inc.");// ... can also be done like this:PropertyValue value = new PropertyValue("name", "Some Company Inc.");company.setPropertyValue(value);// ok, let's create the director and tie it to the company:BeanWrapper jim = new BeanWrapperImpl(new Employee());jim.setPropertyValue("name", "Jim Stravinsky");company.setPropertyValue("managingDirector", jim.getWrappedInstance());// retrieving the salary of the managingDirector through the companyFloat salary = (Float) company.getPropertyValue("managingDirector.salary");} }

注意setPropertyValue和getPropertyValue的使用。

其中propertyName屬性可以有如下幾種形式:

ExpressionExplanation
name指示屬性name相對于的getName() , isName() 和 setName(…)方法
account.name指示account內(nèi)部的name屬性,對應(yīng)getAccount().setName() 和getAccount().getName()方法。
account[2]指示account的第三個元素,索引屬性可以是array, list或者其他的自然排序的集合。
account[COMPANYNAME]一個map,key是COMPANYNAMEs

PropertyEditor

Spring使用PropertyEditor的概念來實現(xiàn)Object和String之間的轉(zhuǎn)換。

比如你配置了一個時間對象,但是在配置上,你可能需要傳入一個String,然后可以通過PropertyEditor來將其自動轉(zhuǎn)換為時間類型。

在Spring中使用PropertyEditor的情況有如下幾種:

  • 通過使用PropertyEditor實現(xiàn)來設(shè)置bean的屬性。當使用String作為在XML文件中聲明的某個bean的屬性值時,Spring(如果相應(yīng)屬性的setter有類參數(shù))則使用ClassEditor嘗試將參數(shù)解析為Class對象。

  • 在Spring的MVC框架中解析HTTP請求參數(shù)是通過使用各種屬性編輯器實現(xiàn)來完成的,這些實現(xiàn)可以手動綁定到CommandController的所有子類中。

Spring有內(nèi)置的方便使用的PropertyEditor實現(xiàn),他們都在org.springframework.beans.propertyeditors包里面,大多數(shù)都是通過BeanWrapperImpl來注冊的。下表列出了Spring提供的多種PropertyEditor:

ClassExplanation
ByteArrayPropertyEditor字節(jié)數(shù)組編輯器。將字符串轉(zhuǎn)換為相應(yīng)的字節(jié)表示形式。默認情況下由BeanWrapperImpl注冊。
ClassEditor將表示類的字符串解析為實際類,反之亦然。當找不到類時,將引發(fā)IllegalArgumentException。默認情況下,由BeanWrapperImpl注冊。
CustomBooleanEditor布爾屬性的可自定義屬性編輯器。默認情況下,由BeanWrapperImpl注冊,但可以通過將其自定義實例注冊為自定義編輯器來重寫。
CustomCollectionEditor集合的屬性編輯器,將任何源集合轉(zhuǎn)換為給定的目標集合類型。
CustomDateEditorjava.util.date的可自定義屬性編輯器,支持自定義日期格式。默認情況下未注冊。必須根據(jù)需要使用適當?shù)母袷竭M行用戶注冊。
CustomNumberEditor任何數(shù)字子類(如integer、long、float或double)的可自定義屬性編輯器。默認情況下,由BeanWrapperImpl注冊,但可以通過將其自定義實例注冊為自定義編輯器來重寫。
FileEditor將String解析成為java.io.File對象。默認由BeanWrapperImpl來注冊。
InputStreamEditor單向?qū)傩跃庉嬈?#xff0c;它可以獲取一個字符串并(通過中間的ResourceEditor和Resource)生成一個InputStream,以便InputStream屬性可以直接設(shè)置為字符串。請注意,默認用法不會為您關(guān)閉inputstream。默認情況下,由BeanWrapperImpl注冊。
LocaleEditor可以將字符串解析為區(qū)域設(shè)置對象,反之亦然(字符串格式為[country][variant],與區(qū)域設(shè)置的toString()方法相同)。默認情況下,由BeanWrapperImpl注冊。
PatternEditor可以將字符串解析為java.util.regex.Pattern對象,反之亦然。
PropertiesEditor可以將字符串(使用java.util.Properties類的javadoc中定義的格式格式化)轉(zhuǎn)換為屬性對象。默認情況下,由BeanWrapperImpl注冊。
StringTrimmerEditor修剪字符串的屬性編輯器。(可選)允許將空字符串轉(zhuǎn)換為空值。默認情況下未注冊-必須是用戶注冊的。
URLEditor可以將URL的字符串表示形式解析為實際的URL對象。默認情況下,由BeanWrapperImpl注冊。

Spring使用java.beans.PropertyEditorManager為可能需要的屬性編輯器設(shè)置搜索路徑,如果標準JavaBeans基礎(chǔ)結(jié)構(gòu)與它們處理的類位于同一個包中,并且與該類具有相同的名稱,并且附加了Editor,那么標準JavaBeans基礎(chǔ)結(jié)構(gòu)會自動發(fā)現(xiàn)PropertyEditor類(無需顯式注冊)。例如,可以具有以下類和包結(jié)構(gòu),這足以使SomethingEditor類被識別并用作某個類型化屬性的屬性編輯器。

如下面的目錄結(jié)構(gòu):

comflydeanbeansExoticTypeExoticTypeEditor

下面是ExoticType和ExoticTypeEditor的定義:

@Data public class ExoticType {private String name;public ExoticType(String name) {this.name = name;} } public class ExoticTypeEditor extends PropertyEditorSupport {public void setAsText(String text) {setValue(new ExoticType(text.toUpperCase()));} }

除了自動注冊之外,也可以使用CustomEditorConfigurer將新創(chuàng)建的PropertyEditor注冊到ApplicationContext:

<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"><property name="customEditors"><map><entry key="com.flydean.beans.ExoticType" value="com.flydean.beans.ExoticTypeEditor"/></map></property></bean>

你也可以使用標準的BeanInfo JavaBeans機制。下面的示例使用BeanInfo機制顯式地用關(guān)聯(lián)類的屬性注冊一個或多個PropertyEditor實例:

comflydeanbeansExoticTypeExoticTypeBeanInfo

以下引用的ExoticTypeBeanInfo類的Java源代碼將CustomNumberEditor與ExoticType類的age屬性關(guān)聯(lián)起來:

public class ExoticTypeBeanInfo extends SimpleBeanInfo {public PropertyDescriptor[] getPropertyDescriptors() {try {final PropertyEditor numberPE = new CustomNumberEditor(Integer.class, true);PropertyDescriptor ageDescriptor = new PropertyDescriptor("age", ExoticType.class) {public PropertyEditor createPropertyEditor(Object bean) {return numberPE;};};return new PropertyDescriptor[] { ageDescriptor };}catch (IntrospectionException ex) {throw new Error(ex.toString());}} }

PropertyEditorRegistrar

另一種機制來注冊屬性編輯器到Spring容器的方法就是使用PropertyEditorRegistrar。

下面是使用的例子:

public final class CustomPropertyEditorRegistrar implements PropertyEditorRegistrar {public void registerCustomEditors(PropertyEditorRegistry registry) {// it is expected that new PropertyEditor instances are createdregistry.registerCustomEditor(ExoticType.class, new ExoticTypeEditor());// you could register as many custom property editors as are required here...} }

下面是使用CustomEditorConfigurer的配置例子:

<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer"><property name="propertyEditorRegistrars"><list><ref bean="customPropertyEditorRegistrar"/></list></property></bean><bean id="customPropertyEditorRegistrar"class="com.flydean.beans.CustomPropertyEditorRegistrar"/>

本節(jié)的例子可參考beanWrapper-propertyEditor

更多精彩內(nèi)容且看:

  • 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學,超級賬本,以太坊,Libra,比特幣等持續(xù)更新
  • Spring Boot 2.X系列教程:七天從無到有掌握Spring Boot-持續(xù)更新
  • Spring 5.X系列教程:滿足你對Spring5的一切想象-持續(xù)更新
  • java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細文章教程

更多教程請參考flydean的博客

總結(jié)

以上是生活随笔為你收集整理的Spring5参考指南: BeanWrapper和PropertyEditor的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。