Spring类型转换机制

Spring Type Conversion

1Spring中的类型转换,主要用在两种场景

  1. Bean的解析,Spring中bean定义的属性都是以文本的形式,构造bean的时候需要转成相应的各种Java类型

  2. 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

一个有用的公众号

长按,识别二维码,加关注

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值