Spring Type Conversion
1Spring中的类型转换,主要用在两种场景
Bean的解析,Spring中bean定义的属性都是以文本的形式,构造bean的时候需要转成相应的各种Java类型
Spring Mvc的request请求生命周期中,需要把http的请求中的参数绑定到Java Object中对应的各种属性上,这个机制在Spring Mvc中叫做DataBind即数据绑定,在绑定的过程中,因为http的参数到后端一般是以文本的形式,需要转换成与Bean对应的Java类型,Spring默认可以转一些java的原生类型,如果是想转成复杂自定义对象,需要自定义Converter
这里着重讲解下MVC中的使用方法以及Conversion实现原理
2本文主要梳理下Spring Mvc中Conversion的机制
先看下Conversion在具体应用中的体现:
http://localhost:8080/spring-mvc-showcase/convert/collection?values=1,2,3,4,5
这个url是我们的http请求,其中参数values=1,2,3,4,5是一个逗号分隔的字符串,在web server后端的Controller中,我们可以如何接收呢?
@RequestMapping("collection")
public @ResponseBody String collection(@RequestParam Collection<Integer> values) {
return "Converted collection " + values;
}
这是接收请求的方法,可以看到,是用Collection<Integer>来接收values参数的,到这里已经变更整形的集合了.
没错,这就是在绑定参数的过程中用到了ConversionService,上边这个具体是用到了Spring内置的StringToCollectionConverter
/*** Converts a comma-delimited String to a Collection.*/
final class StringToCollectionConverter implements ConditionalGenericConverter {
看注释可知道,这是一个专门转换用逗号分隔字符串为集合的converter
3整个Spring中的Conversion机制有几个关键的类或接口:
Converter接口
ConversionService接口
ConverRegistry接口
DefaultConversionService类
ConversionServiceFactoryBean类
FormattingConversionServiceFactoryBean类
converter接口定义了核心的行为
public interface Converter<S, T> {
T convert(S source);
}
下图是Spring内置的Converter:
这些是Spring内置的与Collection转换相关的converter
ConversionService对外统一提供接口
整个Conversion机制还是比较复杂的,所以Spring提供了统一的facade门面,ConversionService接口,对外统一了几个转换相关的方法,屏蔽了具体的转换逻辑。ConverRegistry
在转换服务内部,ConverRegistry是提供了所有Converter的注册管理功能
DefaultConversionService
DefaultConversionService的继承结构图如下:
它整合了ConversionService和ConverRegistry接口的功能,能管理众多Converter并提供conversion常用操作,是整个Convertsion的核心类,所有的转换组件基本都是delegate给这个类来实现具体的转换功能
ConversionServiceFactoryBean
ConversionServiceFactoryBean是作为外部调用方直接使用的类,采用工厂的模式生成ConversionService,这也符合Spring的一贯作风,比较重且复杂的类构造起来一般采用工厂模式,其实它生成的对象就是DefaultConversionService,它同时提供了设置用户算定义Converter的功能,通过setConverter方法加入到ConverterRegistry中。
FormattingConversionServiceFactoryBean
FormattingConversionServiceFactoryBean与ConversionServiceFactoryBean结构类似且更强大,是SpringMVC默认的ConverterService,它又多了setFormatter的功能,能够以解析格式化字段的方式来提供转换功能。
4在Spring mvc中这些组件是如何组织工作的呢?
在使用xml配置Spring mvc的app来说一般是这样的:
上边是通过<mvc:annotation/>来配置mvc相关基础设施,其中的conversion-service属性就是用来指定用户自定义ConversionService的。
在Spring的xml中各种标签的解析,是各种***NamespaceHandler来完成的,比方说<mvc>标签的解析类就是MvcNamespaceHandler
对于<mvc:annotation-driven>标签的解析是通过AnnotationDrivenBeanDefinitionParser类来完成的。
getConversionService方法是具体解析ConversionService的方法:
这里可以看到,如果我们配置了自定义ConversionService的话就会被Spring容器使用,否则会给默认装配一个FormattingConversionServiceFactoryBean
至此,在Spring mvc的容器中就可以用这个bean来获取ConversionService,来提供转换服务。
SpringAutowired
一个有用的公众号
长按,识别二维码,加关注