我们以自定义格式转换器的实现思路,来理解新架构的类型转换器的使用方法,同时在实际开发中,我们可能会有自己的格式转换需求,这个时候我们也可以通过自定义格式转换器来完成这些个性化需求。
<>强自定义格式转换器强>
完成自定义转换器需要实现以下三个中的任意一个接口:Convertor GenericConvertor或ConvertorFacoty。下面我们对这些接口进行逐一分析:
<强> 1。Convertor<年代,T> 强>
这是最为简单的一个接口,定义了从源类到目标类的转换方法。该接口的定义如下
公共接口ConverterFactory<年代,R>{//将S类型的对象转换为T类型,R为目标类T型的基类 & lt; T R>延伸;Converter<年代,T>getConverter (ClasstargetType); }
<强> 2。GenericConvertor 强>
GenericConvertor会根据源类对象及目标类对象所在宿主类的上下文信息进行类型转换工作,该接口的定义如下:
公共接口GenericConverter {//ConvertiblePair包含了源类型和目标类型,它的定义在下面 SetgetConvertibleTypes ();//TypeDescriptor包含了需转换类型对象所在宿主类的信息,我们根据此信息,完成源到目标类型的转换 对象转换(对象来源、TypeDescriptor sourceType TypeDescriptor targetType);/* * *内部类定义 */公共静态最终类ConvertiblePair {//源类型 私人最终Class<& # 63;比;sourceType;//目标类类型 私人最终Class<& # 63;比;targetType;/* * *创建一个源——目标对子 */公共ConvertiblePair (Class<& # 63;比;sourceType Class<& # 63;比;targetType) { 断言。notNull (sourceType“源类型不能空”); 断言。notNull (targetType“目标类型不能空”); 这一点。sourceType=sourceType; 这一点。targetType=targetType; } 公共Class<& # 63;比;getSourceType () { 返回this.sourceType; } 公共Class<& # 63;比;getTargetType () { 返回this.targetType; }//忽略hashCode \=\ toString等重写方法 } } >之前 我们常使用其实现类接口:
公共接口ConditionalGenericConverter GenericConverter延伸,ConditionalConverter { } >之前它除了实现GenericConverter,还实现了另一个“条件转换器”:
公共接口ConditionalConverter {/* * *应该转换从{@code sourceType} {@code targetType}目前 *///根据源类型和目标类型所在宿主类型的上下文信息判断是否要进行类型转换 布尔匹配(TypeDescriptor sourceType, TypeDescriptor targetType); } >之前在实际开发中,我们能实现此接口自定义转换器,来根据具体类型上下文来灵活配置我们的类型转换
<强> 3。ConvertorFacoty 强>
这是一个将我们源类转换为一个目标类或其子类的“多转换器共存”接口工厂。它的定义如下:
公共接口ConverterFactory<年代,R>{//获取将源类转换为特定R类或其子类的转换器 & lt; T R>延伸;Converter<年代,T>getConverter (ClasstargetType); } >之前 这个接口一个常见的实现类是StringToNumberConvertor,能将字符串类型数据转换为数字类型或其子类:长整数,双等。
<强>注册自定义转换器强>
<强> ConversionService 强>
ConversionService则是弹簧类型转换体系的核心接口,ConversionService接口的定义如下:
包org.springframework.core.convert; 公共接口ConversionService {//判断sourceType是否可以转换为targetType 布尔canConvert (Class<& # 63;比;sourceType Class<& # 63;比;targetType);//TypeDescriptor描述了转换类的各类上下文信息,在类型转换实现方法中可以根据这些信息进行灵活控制//比如这里通过源类和目标类的上下文信息判断是否可以进行转换 布尔canConvert (TypeDescriptor sourceType, TypeDescriptor targetType);//将源转换为targetType & lt; T>T转换(对象来源,ClasstargetType);//利用源、目标类的上下文信息,将源类型转换为目标类型 对象转换(对象来源、TypeDescriptor sourceType TypeDescriptor targetType); } >之前 <强> ConversionServiceFactoryBean 强>
实现以上类型完成我们的自定义转换器定义后,我们还要在春天容器中通过ConversionServiceFactoryBean注册创建后才能使用。
springMVC4之强大类型转换器实例解析