BeanWrapper中的类型转换

image.png
image.png
TypeConverterSupport中有

  • TypeConverterDelegate typeConverterDelegate;

    TypeConverterDelegate负责转换流程,先调用propertyEditor再调用ConvertionService

    • PropertyEditorRegistrySupport propertyEditorRegistry;
      • ConversionService conversionService;
      • Map, PropertyEditor> customEditors;

TypeConverterDelegate#convertIfNecessary()

整合了PropertyEditor 和 ConvertionService

image.png
image.png
image.png
image.png

注册PropertyEditor:PropertyEditorRegistrar接口

自定义实现PropertyEditorSupport类。
image.png

  1. public class CustomizedPropertyEditorRegistrar implements PropertyEditorRegistrar {
  2. @Override
  3. public void registerCustomEditors(PropertyEditorRegistry registry) {
  4. // 1. 通用类型转换
  5. // 2. Java Bean 属性类型转换
  6. registry.registerCustomEditor(User.class, "context", new StringToPropertiesPropertyEditor());
  7. }
  8. }

注册ConvertionService:ConfigurablePropertyAccessor接口

可以setConversionService()

类型转换流程总结

image.png

Converter & GenericConverter

image.png
Printer Pasrser Converter适配转换成GenericConverter放入Converters集合中。

Converter的局限性【一对一】

image.png

ConditionalConverter【增加转换前置判断】

image.png
针对Converter的条件判断接口。参数TypeDescriptor

GenericConverter【多对多】【一个Converter转换多种类型】

类型更为宽泛。
image.png
image.png
比如ByteBufferConverter,就支持n种类型的相互转换。

ConditionalGenericConverter【给GenericConverter增加条件判断】

  1. public interface ConditionalGenericConverter extends GenericConverter, ConditionalConverter {
  2. }

image.png

注册转换器

image.png
image.png
BeanWrapper中的ConvertionrService是来自BeanFactory中的ConvertionService。
BeanFactory中的ConvertionService是从容器中getBean获取,类型为ConversionService的Bean,
且BeanName必须为conversionService
使用xml可以配置
image.png
image.png

ConvertionService接口

image.png
image.png

ConverterRegistry接口【既能添加Converter又能添加GenericConverter】

image.png

GenericConvertionService【保存Converters】

image.png
Converters内部是Set<GenericConverter> globalConverters = new LinkedHashSet<>();

添加Converter转为GenericConverter

GenericConversionService#addConverter(Converter<?,?>)
image.png

DefaultConversionService【工具类内部都是static方法】【向GenericConversionService添加了很多Converter】

  • 工具类被DefaultFormattingConversionService使用。

image.png

FormattingConversionService【将Formatter转为Converter添加到ConversionService】

image.png

DefaultFormattingConversionService

  • 通过DefaultConversionService添加默认的类型转换器。

ConversionServiceFactoryBean【Converter配置类】

image.png
各种类型的Converter都能配置:
image.png

PropertyEditor

  • PropertyEditors 线程不安全,不能通过@Autowired注入。对于每一个请求,我们都需要new一个PropertyEditor对象,并用WebDataBinder去注册;

DataBinder【将Formatter转为PropertyEditor】

DataBinder将Formater变为PropertyEditor
image.png

保存在HandlerAdapter属性中
image.png

HttpMessageConverter

HttpMessageConverter和Convert SPI分别用来反序列化请求的Body和非Body部分
image.png
RequestResponseBodyMethodProcessor类型转换优先级
image.png

自定义PropertyEditor

采用注册CustomEditorConfigurer的形式【两种方式】

CustomEditorConfigurer【叫做PostProcessor多好】 implements BeanFactoryPostProcessor
两种配置方式:
image.png
image.png
两种方式最终都注册到BeanFactory中。
image.png
image.png

initBinder方式

image.png