對於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進行轉換.