springIoc-BeanWrapper

對於spring我們可能需要配置大量的javaBean屬性,我們需要一個對對象屬性進行操作的一個對象,這個對象就是BeanWrapper接口.

1.既然我們是想對工廠管理所有的bean進行屬性配置,因此我們需要一個對對象屬性的的訪問器.
2.因爲配置文件等大部分傳遞過來的數據都是String類型,我們很可能需要對其進行轉換,能夠重用
spring-core中的Conversion ,同時還的支持用戶熟悉的PropertyEditor編輯器
3.因爲有大量的常用Convertor PropertyEditor,我們可以將其緩存起來,這樣我們不必要每次都創建
這個三方面的考慮就產生了PropertyAccessor TypeConvert PropertyEditorRegistry三個接口

PropertyAccessor(屬性存取器)

定義了對javaBean屬性進行訪問和操作的接口
1.查看指定屬性是否存在讀和寫的方法.(方便調用方法直接賦值)
isWritableProperty(String propertyName) isReadableProperty getPropertyTypeDescriptor
2.查看屬性的類型是什麼.(方便需要將傳遞管理的對象轉換爲指定類型)
Class<'?> getPropertyType(String propertyName) throws BeansException;
3.自己定義的設置對象屬性的方法.
void setPropertyValue(String propertyName, Object value) throws BeansException;
void setPropertyValue(PropertyValue pv) throws BeansException;
設置對象屬性的方法,修改屬性的統一入口.

TypeConverter:類型轉換器

把給定的值轉換爲指定類型
T convertIfNecessary(Object value, Class requiredType) throws TypeMismatchException;
T convertIfNecessary(Object value, Class requiredType, MethodParameter methodParam)
throws TypeMismatchException;
T convertIfNecessary(Object value, Class requiredType, Field field)
throws TypeMismatchException;
之所以會有下面兩個接口,是爲了可以使用上下文參數(註解)
這個類型轉換器屏蔽了使用PropertyEditor 和 Conversion 方法直接的不同

PropertyEditorRegistry:PropertyEditor註冊器

void registerCustomEditor(Class<’?’> requiredType, PropertyEditor propertyEditor);
void registerCustomEditor(Class<’?’> requiredType, String propertyPath, PropertyEditor propertyEditor);
根據屬性名稱 屬性類型註冊屬性編輯器
PropertyEditor findCustomEditor(Class<’?’> requiredType, String propertyPath);
通過給定的屬性和要求類型,查找對應的屬性編輯器.

spring最終實現類爲BeanWrapperImpl,實現了上述的幾個接口,可以對bean進行屬性賦值.
如果給定的類型不符合bean的屬性類型,可以通過PropertyEditor 或者Conversion進行轉換.

Created with Raphaël 2.1.0BeanWrapperImplBeanWrapperImplTypeConverterDelegateTypeConverterDelegate是否爲最後一個屬性,foo.age查找Conversion propertyEditor進行轉換返回轉換的值調用setterMethod.invoke()賦值
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章