当前位置:   article > 正文

bean转换 传类型_「死磕 Spring」—– IOC 之自定义类型转换器

beanconverts让某个字段转成其他类型

原文出自:http://cmsblogs.com

作者:作者:chenssy

在上篇文章中小编分析了 Spring ConversionService 类型转换体系,相信各位都对其有了一个清晰的认识,这篇博客将利用 ConversionService 体系来实现自己的类型转换器。

ConversionService 是 Spring 类型转换器体系中的核心接口,它定义了是否可以完成转换(canConvert()) 与 类型转换(convert())两类接口。ConversionService 有三个子类,每个子类针对不同的类型转换:

  • Converter:将 S 类型对象转为 T 类型对象。
  • GenericConverter:会根据源类对象及目标类对象所在的宿主类中的上下文信息进行类型转换。
  • ConverterFactory:将相同系列多个 “同质” Converter 封装在一起。如果希望将一种类型的对象转换为另一种类型及其子类的对象(例如将 String 转换为 Number 及 Number 子类(Integer、Long、Double 等)对象)可使用该转换器工厂类。

如何自定义类型转换器?分两步走:

  1. 实现 Converter / GenericConverter / ConverterFactory 接口
  2. 将该类注册到 ConversionServiceFactoryBean 中。

ConversionServiceFactoryBean 实现了 InitializingBean 接口实现 afterPropertiesSet() ,我们知道在 Bean 实例化 bean 阶段,Spring 容器会检查当前 bean 是否实现了 InitializingBean 接口,如果是则执行相应的初始化方法。(关于 InitializingBean 详情请参考:【死磕 Spring】----- IOC 之 深入分析 InitializingBean 和 init-method)。afterPropertiesSet() 源码如下:

public void afterPropertiesSet() { this.conversionService = createConversionService(); ConversionServiceFactory.registerConverters(this.converters, this.conversionService);}

首先调用 createConversionService() 初始化 conversionService,然后调用 ConversionServiceFactory.registerConverters()将定义的 converters 注入到类型转换体系中。createConversionService() 其实就是创建一个 DefaultConversionService 实例对象,对于 DefaultConversionService 小编在上篇博客已经分析了,如有不了解的请移步上篇博文。这里直接分析 ConversionServiceFactory.registerConverters(),该方法是将定义的 converter 注册到目标 ConverterRegistry 中,我们知道 ConverterRegistry 是一个 Converter 注册器,他定义了一系列注册方法。

9a8062295f15760a4931444253abf721.png

调用 ConverterRegistry 的 addConverter() 方法将转换器注册到容器中。所以在我们使用 Spring 容器的时候,Spring 将会自动识别出 IOC 容器中注册的 ConversionService 并且在 bean 属性注入阶段使用自定义的转换器完成属性的转换了。

实例

定义 StudentConversionService 转换器:

43de11977252993d9bea0354a2b3c7dc.png

配置:

c7ba6d0bd14935a18ec1da0d0ad84079.png
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/138549
推荐阅读
相关标签
  

闽ICP备14008679号