TypeConverter暴露转换功能,PropertyEditorRegistry暴露注册转换器服务

//@param value the value to convert
//@param requiredType the type we must convert to
<T> T convertIfNecessary(@Nullable Object value, @Nullable Class<T> requiredType) throws TypeMismatchException;

实现类:转换服务依赖转换器的注册器。思想是从注册器中找到合适的类型转换器,进行转换。

public abstract class TypeConverterSupport extends PropertyEditorRegistrySupport implements TypeConverter

TypeConverterSupport 转换服务实现类;
PropertyEditorRegistrySupport转换器注册器;

转换器:
PropertyEditor转换器将String转换成Obejct类型。Object并非是JavaBean类型,是jdk中提供的一些类型例如String,Integer,Date等。

org.springframework.beans.propertyeditors.CustomBooleanEditor,以该类为例。

 @Overridepublic void setAsText(@Nullable String text) throws IllegalArgumentException {String input = (text != null ? text.trim() : null);if (this.allowEmpty && !StringUtils.hasLength(input)) {// Treat empty String as null value.setValue(null);}else if (this.trueString != null && this.trueString.equalsIgnoreCase(input)) {setValue(Boolean.TRUE);}else if (this.falseString != null && this.falseString.equalsIgnoreCase(input)) {setValue(Boolean.FALSE);}else if (this.trueString == null &&(VALUE_TRUE.equalsIgnoreCase(input) || VALUE_ON.equalsIgnoreCase(input) ||VALUE_YES.equalsIgnoreCase(input) || VALUE_1.equals(input))) {setValue(Boolean.TRUE);}else if (this.falseString == null &&(VALUE_FALSE.equalsIgnoreCase(input) || VALUE_OFF.equalsIgnoreCase(input) ||VALUE_NO.equalsIgnoreCase(input) || VALUE_0.equals(input))) {setValue(Boolean.FALSE);}else {throw new IllegalArgumentException("Invalid boolean value [" + text + "]");}}@Overridepublic String getAsText() {if (Boolean.TRUE.equals(getValue())) {return (this.trueString != null ? this.trueString : VALUE_TRUE);}else if (Boolean.FALSE.equals(getValue())) {return (this.falseString != null ? this.falseString : VALUE_FALSE);}else {return "";}}

通过setValue方法来保存目标类型。

添加自定义转换器:
先获得BeanFactory,beanFactory#getTypeConverter()方法得到TypeConverter实现类,之后调用注册方法。 默认使用的是SimpleTypeConverter

org.springframework.beans.factory.support.AbstractBeanFactory#getTypeConverter

 public TypeConverter getTypeConverter() {TypeConverter customConverter = getCustomTypeConverter();if (customConverter != null) {return customConverter;}else {// Build default TypeConverter, registering custom editors.SimpleTypeConverter typeConverter = new SimpleTypeConverter();// 设置最新的转换器typeConverter.setConversionService(getConversionService());registerCustomEditors(typeConverter);return typeConverter;}}

发现SimpleTypeConverter有PropertyEditor的转换功能,又加入了ConversionService,转换的时候可以旧的用不了,使用新的转换器转换。

最新的转换器:
ConversionService暴露转换服务。ConverterRegistry提供转换器的注册
实现类:DefaultConversionService,具有转换功能和注册转换器的功能。

本文基于以下文章进行汇总:

1. 揭秘Spring类型转换 - 框架设计的基石

2. Spring早期类型转换,基于PropertyEditor实现

3. 搞定收工,PropertyEditor就到这

4. 上新了Spring,全新一代类型转换机制

5. 穿过拥挤的人潮,Spring已为你制作好高级赛道

6. 抹平差异,统一类型转换服务ConversionService

【spring源码分析】spring中类型转换器详解相关推荐

  1. bytebuddy实现原理分析 源码分析 (三)- advice 详解

    advice详解 八.advice 8.1 AsmVisitorWrapper 8.1.1 ForDeclareFields 8.1.1.1 Entry 8.1.1.2 DispatchingVisi ...

  2. Spring源码分析-Spring事务源码分析

    导语      在配置Spring事务管理的时候会用到一个类TransactionInterceptor,从下面的类关系图中可以看到TransactionInterceptor继承了MethodInt ...

  3. 从源码分析RocketMQ系列-MQClientInstance类详解

    导语   在之前的分析中,看到有一个类MQClientInstance,这个无论是在Producer端还是在Consumer端都是很重要的一个类,很多的功能都是从这个类发起的,这边分享中就来详细的看看 ...

  4. Spring源码解析之 Bean与BeanDefinition详解

    文章目录 Spring解决的核心问题 Bean与BeanDefinition 代码验证BeanDefinition 代码运行测试 Spring容器主要流程 与BeanDefinition相关的类 At ...

  5. 从源码分析RocketMQ系列-start()方法详解

    导语   在之前的分析中主要介绍的是关于Producer 发送消息的逻辑,但是在实例代码中有一个操作是producer.start()方法,在Consumer中看到的方法是consumer.start ...

  6. Spring源码分析之Bean的创建过程详解

    前文传送门: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 本文内容: 在 ...

  7. spring源码分析之spring-core总结篇

    1.spring-core概览 spring-core是spring框架的基石,它为spring框架提供了基础的支持. spring-core从源码上看,分为6个package,分别是asm,cgli ...

  8. 【spring源码分析】IOC容器初始化(二)

    前言:在[spring源码分析]IOC容器初始化(一)文末中已经提出loadBeanDefinitions(DefaultListableBeanFactory)的重要性,本文将以此为切入点继续分析. ...

  9. spring源码分析第五天------springAOP核心原理及源码分析

    spring源码分析第五天------springAOP核心原理及源码分析 1. 面向切面编程.可以通过预 编译方式和运行期动态代理实现在不修改源代码的情况下给程序动态统一添加功能的一种技术 切面(A ...

  10. Spring 源码分析(三) —— AOP(五)创建代理

    2019独角兽企业重金招聘Python工程师标准>>> 创建代理 代理的定义其实非常简单,就是改变原来目标对象方法调用的运行轨迹.这种改变,首先会对这些方法进行拦截,从而为这些方法提 ...

最新文章

  1. R语言使用tidyquant包的tq_transmute函数计算持有某只股票的天、月、周收益率、ggplot2使用条形图(bar plot)可视化股票年收益率数据使用不同的色彩表征正收益率和负收益率
  2. 为所有服务器端代码调用ConfigureAwait的最佳实践
  3. 算法导论中C语言代码,算法导论-学习笔记与进度
  4. 10.6 ip:网络配置工具
  5. 【PAT甲级 sc.nextInt()的使用】1008 Elevator (20 分) Java版 9/9通过
  6. python波峰波谷算法_波动均分算法
  7. iPhone 的 Push(推送通知)功能原理浅析
  8. python数据框循环生成_python - 如何在 Pandas 的for循环迭代中创建多个数据框?
  9. Leetcode--全排列(Java)
  10. 2013年,6月20日,今天非常无聊啊。
  11. C语言int的字节数跟什么有关,C语言中int型字长和什么有关
  12. “鸡肋”的百度,掉队了 BAT? | 畅言
  13. bzoj 1911: [Apio2010]特别行动队【斜率优化dp】
  14. centos7安装python3.6独立的virtualenv环境
  15. 日文輸入法学习和日文键盘图
  16. java poi生成word
  17. matlab mcl,wsn定位蒙特卡洛方法mcl的matlab
  18. edge怎么开启沉浸式阅读_美人鼓上舞!端午小长假,豫园将开启史上首次沉浸式国风庙会...
  19. 一元购抽奖号码 thinkphp php
  20. OJ刷题---鸡兔同笼问题

热门文章

  1. jsp引进的js 显示404_【梅园大讲堂微课堂】Get超级大招!上海人才引进云申报权威解读来了...
  2. java图片的缩放_Java的图片自动缩放
  3. C/C++[1782 codeup] 谁是你的潜在朋友
  4. 自动驾驶 9-3: 走向非线性 - 扩展卡尔曼滤波器 Going Nonlinear - The Extended Kalman Filter
  5. 阿里云云计算 3 阿里云产品全家福
  6. oracle类型介绍,Oracle数字的3种基本类型介绍[转]
  7. 发布传参_Taro 1.2.9 发布,BAT 小程序、H5 与 RN 端统一框架
  8. 1081. 不同字符的最小子序列
  9. 从有序数组中找出某个数出现的次数
  10. 仿真作业3:噪声通过DSB-SC解调器