springMVC源码5:HttpMessageConverter<T>和ConversionService之间怎么关联

来源:互联网 发布:中国房地产数据统计 编辑:程序博客网 时间:2024/04/29 10:23

1 SpringMVC数据类型转换

     ——第七章 注解式控制器的数据验证、类型转换及格式化 http://jinnianshilongnian.iteye.com/blog/1723270  必看

   看spring3之前和之后类型转换器区别。

Spring3引入了更加通用的类型转换系统,其定义了SPI接口(Converter等)和相应的运行时执行类型转换的API(ConversionService等)

ConverterRegistry  类型转换器注册支持,可以注册/删除相应的类型转换器。可以注册:Converter实现,GenericConverter实现,ConverterFactory实现 这几个类型转换器。

ConversionService:运行时类型转换服务接口,提供运行期类型转换的支持。使用上面的类型转换器提供类型转换服务。


注意 7.2.2.4、集成到Spring Web MVC环境

如上集成过程看起来比较麻烦,后边我们会介绍<mvc:annotation-driven>和@EnableWebMvc,ConversionService会自动注册,后续章节再详细介绍。

我的理解:默认ConversionService的配置(使用的转换器是HttpMessageConverter,当然可以自定义HttpMessageConverter里的具体转换类),也可以用ConversionService实例显示配置代替原有的默认ConversionService。见上篇

2 SpringMVC之类型转换Converter http://elim.iteye.com/blog/1860732

  讲的更细致一点如:

Spring3之前

我们需要SpringMVC为我们自动进行类型转换的时候都是用的PropertyEditor。

在Spring3中

引入了一个Converter接口(更强大的类型转换Type Conversion一定要结合第一个链接看),它支持从一个Object转为另一个Object。除了Converter接口之外,实现ConverterFactory接口和GenericConverter接口也可以实现我们自己的类型转换逻辑。

在定义了ConversionService之后我们就可以把它定义为一个bean对象,然后指定<mvn:annotation-driven/>的conversion-service属性为我们自己定义的ConversionService bean对象。

<mvc:annotation-driven conversion-service="myConversionService"/>  <bean id="myConversionService" class="com.tiantian.blog.web.converter.support.MyConversionService"/>  
这样当SpringMVC需要进行类型转换的时候就会调用ConversionService的canConvert和convert方法进行类型转换。

对于ConversionService,Spring已经为我们提供了一个实现,它就是GenericConversionService,位于org.springframework.core.convert.support包下面,它实现了ConversionService接口和ConverterRegistry接口。但是不能直接把它作为SpringMVC的ConversionService,因为直接使用时不能往里面注册类型转换器。也就是说不能像下面这样使用:

<mvc:annotation-driven conversion-service="conversionService"/>   <bean id="conversionService" class="org.springframework.core.convert.support.GenericConversionService"/>  
     为此我们必须对GenericConversionService做一些封装,比如说我们可以在自己的ConversionService里面注入一个GenericConversionService,然后通过自己的ConversionService的属性接收Converter并把它们注入到GenericConversionService中,之后所有关于ConversionService的方法逻辑都可以调用GenericConversionService对应的逻辑。按照这种思想我们的ConversionService大概是这样的:。。。。。。。。。。

    除了以上这种使用GenericConversionService的思想之外,Spring已经为我们提供了一个既可以使用GenericConversionService(上文中提到的"类型转换器 "注册器"、"类型转换服务" 的接口"),又可以注入Converter("上文中的类型转换器")的类,那就是ConversionServiceFactoryBean。(可以对比上一个链接的7.2.2.4、集成到Spring Web MVC环境 部分)

-----------------------

GenericConverter接口是所有的Converter接口中最灵活也是最复杂的一个类型转换接口。像我们之前介绍的Converter接口只支持从一个原类型转换为一个目标类型;ConverterFactory接口只支持从一个原类型转换为一个目标类型对应的子类型;而GenericConverter接口支持在多个不同的原类型和目标类型之间进行转换,这也就是GenericConverter接口灵活和复杂的地方。

虽然Converter接口、ConverterFactory接口和GenericConverter接口之间没有任何的关系,但是Spring内部在注册Converter实现类和ConverterFactory实现类时是先把它们转换为GenericConverter,之后再统一对GenericConverter进行注册的。也就是说Spring内部会把Converter和ConverterFactory全部转换为GenericConverter进行注册,在Spring注册的容器中只存在GenericConverter这一种类型转换器。我想之所以给用户开放Converter接口和ConverterFactory接口是为了让我们能够更方便的实现自己的类型转换器。基于此,Spring官方也提倡我们在进行一些简单类型转换器定义时更多的使用Converter接口和ConverterFactory接口,在非必要的情况下少使用GenericConverter接口

  

3 接上篇:http://blog.csdn.net/wabiaozia/article/details/72866843

7.2.2.4、集成到Spring Web MVC环境
阅读全文
0 1