* 在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時序圖
總結
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中大量使用這種命名方式,很值得借鑑和學習的命名方式。