spring的Convert机制

时间:2021-10-10 23:07:57

spring.core包内有Converter接口,方法是T convert(S source);从一个类型转为内容一个类型的实际转化器;converters可能非常多,需要一个注册器来集中管理使用,ConverterRegistry接口担当此任务.ConversionService这个概念将converter的这层概念对上层屏蔽,以服务接口形式,是convert工作更好使用。GenericConversionServcie既是ConversionService也是ConverterRegistry,就有效的整合出了实际可产生作用的服务实现;

另外:GenericConversionSerivce支持GenericConverter,这个GenericConverter 从Set<ConvertiblePair> getConvertibleTypes();方法可以看出,可以支持多组soureType-->targetType的能力,但是作者自己也一般不要用,直接用简单的Converter就行了(1:1类型转化)。而且spring内部的ObjectToCollectionConverter,ArrayToArrayConverter,都是Generic的,但ConvertiblePairSet长度都是1(即1对1)

spring.beans包内有一个TypeConverter用来,对jdk的propertEditor的setAsText的场景的spring抽象;

PropertyEditorRegistrySupport 实现PropertyEditorRegistry接口。也是一个为Bean的property进行处理的创造的概念,基于propery的nested对象路径的结构,来扩展一种叫customEditor(即只特定的属性才生效,比如“user.address.description”,只对desciption进行特殊订定制的(除了满足类型要求外)。).

beanWrapper,SimpletTypeConverter(他们都是TypeConverter,也是PropertyEditorRegistry)都委托包内部类TypeConverterDelegate来代理"自己作为PropertyEditorRegistrySupport所收集到(持有的)propertyEditor"。这个委托价值,在于它就如何使用conversionService,CustomEditors,defaultEditors进行了定义;

spring.context中有个DataBinder同样既是TypeConverter,也是PropertyEditorRegistry。 默认最终是委托给BeanWrapper去执行。但它的意义是为validation领域提供了比较容易的概念“数据绑定器”。 DataBinder可以认为是一个壳,只是可以接受外部的配置,最终converter的配置和执行到要让beanWrpaper去坐的。可以立即。

另外:DataBinder,还整合validation,包括Validator,和Erros(BindingResult)。实际发生数据bind的地方就是是由AbstractPropertyBindResult,中的PropertyAccessor完成的。 validation发生在bind完成的 校验。