Spring的PropertyEditor

Spring中的属性编辑器PropertyEditor

PropertyEditor

一个Bean可能有很多属性需要设置,而配置时,我们只是写的字符串,Spring需要将字符串转换为我们定义的类型,比如:

属性编辑器PropertyEditor工作就是:将字符串转换为任意的Java类型(如基本数据类型,我们写的Class,以及它们组成的Collection和Map等)。

PropertyEditor和PropertyEditorSupport都是java.bean中定义的接口/类,Spring则针对不同的情况进行了实现。

PropertyEditorRegister

管理PropertyEditor,定义属性编辑器PropertyEditor的注册和查找:void registerCustomEditorPropertyEditor findCustomEditor

PropertyEditorRegisterSupport

PropertyEditorRegister的默认实现。

既然是Register,内部肯定也是使用Map来实现:Map<Class<?>, PropertyEditor> customEditors。

除此之外,内部还持有一个ConversionService conversionService对象。

TypeConverter

PropertyEditor负责将字符串转换为任意Java类型,但有时候并不一定拿字符串去转换,有可能是其他类型,TypeConverter就是负责进行类型转换的,可以看做是PropertyEditor的升级版:PropertyEditor(String -> anyType),TypeConverter(anyType->anyType)。

TypeConverterSupport

对TypeConverter的默认实现,其采用代理模式,交由TypeConverterDelegate实现,TypeConverterDelegate内部持有PropertyEditorRegisterSupport,转换策略为:先使用PropertyEditor转换器器转换,如果没找到对应的转换器器,会⽤ConversionService来进⾏行行对象转换。

PropertyAccessor

即前面获取到了某个字段的值,PropertyAccessor负责将这些具体的值设置到Bean的属性上或者说设置到对象的字段上,主要方法:

AbstractPropertyAccessor是它的实现类,AbstractNestablePropertyAccessor则支持嵌套结构的属性设置。

此外,Spring还使用PropertyValue来对<propertyName, PropertyValue>进行了包装,即PropertyAccessor中还有类似如下的定义:

BeanWrapper

BeanWrapper继承自ConfigurablePropertyAccessor,相当于Bean属性操作的总接口,包含了属性编辑、类型转换,属性设置的全部功能,并额外定义了获取包装对象的方法:

BeanWrapperImpl

BeanWrapper的默认实现,通常是由PropertyAccessorFactory工厂来创建BeanWrapperImpl的实例:

Spring中的ConversionService

参考

spring笔记-PropertyAccessor

Spring3.1.0实现原理分析(四).属性访问器(PropertyAccessor)

Last updated