BeanWrapper中的类型转换
TypeConverterSupport中有
TypeConverterDelegate typeConverterDelegate;
TypeConverterDelegate负责转换流程,先调用propertyEditor再调用ConvertionService
- PropertyEditorRegistrySupport propertyEditorRegistry;
- ConversionService conversionService;
- Map
, PropertyEditor> customEditors;
- PropertyEditorRegistrySupport propertyEditorRegistry;
TypeConverterDelegate#convertIfNecessary()
整合了PropertyEditor 和 ConvertionService
注册PropertyEditor:PropertyEditorRegistrar接口
自定义实现PropertyEditorSupport类。
public class CustomizedPropertyEditorRegistrar implements PropertyEditorRegistrar {
@Override
public void registerCustomEditors(PropertyEditorRegistry registry) {
// 1. 通用类型转换
// 2. Java Bean 属性类型转换
registry.registerCustomEditor(User.class, "context", new StringToPropertiesPropertyEditor());
}
}
注册ConvertionService:ConfigurablePropertyAccessor接口
可以setConversionService()
类型转换流程总结
Converter & GenericConverter
Printer Pasrser Converter适配转换成GenericConverter放入Converters集合中。
Converter的局限性【一对一】
ConditionalConverter【增加转换前置判断】
针对Converter的条件判断接口。参数TypeDescriptor
GenericConverter【多对多】【一个Converter转换多种类型】
类型更为宽泛。
比如ByteBufferConverter,就支持n种类型的相互转换。
ConditionalGenericConverter【给GenericConverter增加条件判断】
public interface ConditionalGenericConverter extends GenericConverter, ConditionalConverter {
}
注册转换器
BeanWrapper中的ConvertionrService是来自BeanFactory中的ConvertionService。
BeanFactory中的ConvertionService是从容器中getBean获取,类型为ConversionService的Bean,
且BeanName必须为conversionService
使用xml可以配置
ConvertionService接口
ConverterRegistry接口【既能添加Converter又能添加GenericConverter】
GenericConvertionService【保存Converters】
Converters内部是Set<GenericConverter> globalConverters = new LinkedHashSet<>();
添加Converter转为GenericConverter
GenericConversionService#addConverter(Converter<?,?>)
DefaultConversionService【工具类内部都是static方法】【向GenericConversionService添加了很多Converter】
- 工具类被DefaultFormattingConversionService使用。
FormattingConversionService【将Formatter转为Converter添加到ConversionService】
DefaultFormattingConversionService
- 通过DefaultConversionService添加默认的类型转换器。
ConversionServiceFactoryBean【Converter配置类】
各种类型的Converter都能配置:
PropertyEditor
- PropertyEditors 线程不安全,不能通过@Autowired注入。对于每一个请求,我们都需要new一个PropertyEditor对象,并用WebDataBinder去注册;
DataBinder【将Formatter转为PropertyEditor】
DataBinder将Formater变为PropertyEditor
保存在HandlerAdapter属性中
HttpMessageConverter
HttpMessageConverter和Convert SPI分别用来反序列化请求的Body和非Body部分
RequestResponseBodyMethodProcessor类型转换优先级
自定义PropertyEditor
采用注册CustomEditorConfigurer的形式【两种方式】
CustomEditorConfigurer【叫做PostProcessor多好】 implements BeanFactoryPostProcessor
两种配置方式:
两种方式最终都注册到BeanFactory中。