spring基礎-convert

 * 在spring中有一個convert包用於轉換,他和相似於JDK中的beans包。*

JDK中beans包實現

在JDK包中,提供了BeanInfo PropertyDescriptor PropertyEditor 實現對Bean屬性的 轉化。

BeanInfo

Bean信息訪問的接口,能夠訪問BeanDescriptor PropertyDescriptor MethodDescriptor
 方式:BeanInfo student = Introspector.getBeanInfo(Class

    BeanInfo beanInfo = Introspector.getBeanInfo(Student.class);
    System.out.println(beanInfo.getBeanDescriptor());
    for (MethodDescriptor methodDescriptor :   beanInfo.getMethodDescriptors()) {
            System.out.println(methodDescriptor.toString());
        }
        for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) {
            System.out.println(propertyDescriptor.toString());
        }

PropertyDescriptor:屬性描述器

用於描述Bean屬性的描述器,包括屬性名稱 屬性類型 屬性編輯方法 
一個BeanInfo對象包含了多個PropertyDescriptor。

for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) {
            System.out.println(propertyDescriptor.getReadMethod());
            System.out.println(propertyDescriptor.getWriteMethod());
            System.out.println(propertyDescriptor.getPropertyType());
            System.out.println(propertyDescriptor.getName());
        }

PropertyEditor:屬性編輯器

提供了對屬性進行編輯的操作,主要方法是setAsText getAsText方法
 可以允許通過頁面值設置Bean的屬性。
 

java Beans 的缺點

僅支持String到java對象的轉化,不能支持java對象到java對象之間的轉化
不能使用宿主對象的上下文信息(比如註解)幫助轉換
非線程安全的(需要我們每次都必須創建一個)


spring解決之道

上面簡單介紹了了JDK中屬性轉換的實現方式以及他的缺點,下面我們來看一下,spring如何解決這些問題的

針對無法實現java對象到java對象的轉化

定義了一個Converter<’S, T>對象,提供了對於任何對象之間的轉化

針對無法利用宿主對象的上下文信息

重新定義了一個TypeDescriptor對象,是基於java對象的封裝,擁有Class<’?> type,和 註解屬性,保存了宿主對象的註解信息。

TypeDescriptor提供了支持Property MethodParameter Filed的構造方法

ConversionService類圖

這裏寫圖片描述

ConversionService時序圖

Created with Raphaël 2.1.0GenericConversionServiceGenericConversionServiceConversionUtilsConversionUtilsGenericConverterGenericConverterconvert(Object,target,source)getConvert()invokeConverterconvert

總結

spring通過定義了TypeDescriptor重新定義了類型。這個類型包括了類型信息和註解信息,能夠支持轉換可以利用宿主對象的上下文對象。

spring 定義來GenericConvertor定義了通過source sourceType targetType參數對實例進行轉換的接口,提供了對java對象到java對象之間轉換的接口

spring內部提供大量的GenericConvertor的實現,滿足基本的日常要求。

spring轉換器知識使用了方法,而沒有類似PropertyEditor的setValue(),利用了實例變量,避免了線程不安全的問題。

spring 學習

在convert中,看到了spring對接口的定義比較細緻一些。
使用ConvertRegistory定義了可以註冊Convertor的接口
GenericService定義了canConvert() convert()接口,大量重載這兩個方法,只是爲了實現操作的易用性而已,底層都是TypeDescriptor這個類型,這種設計便於維護,同時也是接口單一職責的體現。
ConfigurableConversionService繼承了上述接口,起名爲可配置的,表述上更加清晰。
GenericConversionService提供了ConfigurableConversionService基本實現,也是一個骨架類
DefaultConversionService 表示爲系統的默認實現
整個spring中大量使用這種命名方式,很值得借鑑和學習的命名方式。

 
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章