电子文档交易市场
安卓APP | ios版本
电子文档交易市场
安卓APP | ios版本

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

18页
  • 卖家[上传人]:ji****81
  • 文档编号:270074984
  • 上传时间:2022-03-24
  • 文档格式:DOCX
  • 文档大小:3.63MB
  • / 18 举报 版权申诉 马上下载
  • 文本预览
  • 下载提示
  • 常见问题
    • 1、 1. 揭秘Spring类型转换 - 框架设计的基石 仰不愧天,俯不愧人,内不愧心。关注公众号【BAT的乌托邦】,有Spring技术栈、MyBatis、JVM、中间件等小而美的原创专栏供以免费学习。分享、成长,拒绝浅尝辄止。本文已被 收录。目录 前言 正文o Spring类型转换o 早期类型转换之PropertyEditor 新一代类型转换接口Converter、GenericConverter 新一代转换服务接口:ConversionService 类型转换整合格式化器Formatter 类型转换底层接口TypeConvert Spring Boot使用增强 总结o 推荐阅读: 关注A哥前言你好,我是YourBatman。Spring Framework是一个现代化的框架,俨然已发展成为Java开发的基石。随着高度封装、高度智能化的Spring Boot的普及,发现团队内越来越少的人知道其深层次机制,哪怕只有一点点。这是让Spirng团队开心,但却是让使用的团队比较担忧的现象。若运行一个完全黑箱程序无疑像抱着一个定时炸弹,总是如履薄冰、战战兢兢。团队内需要这样的同学来为它保驾护航,惊

      2、爆之时方可泰然自诺。所以,你愿意pick吗?本系列将讨论Spring Framework里贯穿其上下文,具有举足轻重地位的一个模块:类型转换(也可叫数据转换)。正文Java是个多类型且强类型语言,类型转换这个概念对它来说并不陌生。比如: 自动类型转换(隐式):小类型 - 大类型。eg:int a = 10; double b = a; 强制类型转换(显式):大类型 - 小类型。eg:double a = 10.123; int b = (int)a; o 说明:强转有可能产生精度丢失 调用API类型转换:常见的是字符串和其它类型的互转。eg:parseInt(String); parseBoolean(String); JSON.toJSONString(Obj); LocalDate.parse(String) o 说明:API可能来自于JDK提供、一方库、二方库、三方库提供在企业级开发环境中,会遇到更为复杂的数据转换场景,譬如说:1. 输入/传入一个规格字符串(如1,2,3,4),转换为一个数组2. 输入/传入一个JSON串(如name:YourBatman,age:18),转换为

      3、一个Person对象3. 输入/传入一个URL串(如:C:/myfile.txt、classpath:myfile.txt),转换为一个org.springframework.core.io.Resource对象虽说数据输入/传入绝大部分都会是字符串(如Http请求信息、XML配置信息),但结构可以千差万别,那么这就必然会涉及到大量的数据类型、结构转换的逻辑。倘若这都需要程序员自己手动编码做转换处理,那会让人望而生畏甚至怯步。还好我们有Spring。从本文起,A哥就帮你解密Spring Framework它是如何帮你接管类型转换,实现“自动化”的。有了此部分知识的储备,后续再讨论自动化数据绑定、自动化数据校验、Spring Boot松散绑定等,一切都变得容易接受得多。说明:类型转换其实每个框架都会存在,其中Java领域以Spring的实现最为经典,学会后便可举一反三Spring类型转换Spring的类型转换也并非一步到位。完全掌握Spring的类型转换并非易事,需要有一定的脉络按步骤进行。本文作为类型转换系列第一篇文章,将绘制目录大纲,将从以下几个方面逐步展开讨论。早期类型转换之Pro

      4、pertyEditor早期的Spirng(3.0之前)类型转换是基于Java Beans接口java.beans.PropertyEditor来实现的(全部继承自PropertyEditorSupport):public interface PropertyEditor ./ String - Objectvoid setAsText(String text) throws java.lang.IllegalArgumentException;/ Object - StringString getAsText();.这类实现举例有: StringArrayPropertyEditor:,分隔的字符串和String类型互转 PropertiesEditor:键值对字符串和Properties类型互转 IntegerEditor:字符串和Integer类型互转 基于PropertyEditor的类型转换作为一种古老的、遗留下来的方式,是具有一些设计缺陷的,如:职责不单一,类型不安全,只能实现String类型的转换等。虽然自Spring 3.0起提供了现代化的类型转换接口,但是此部分机制一直

      5、得以保留,保证了向下兼容性。说明:Spring 3.0之前在Java领域还未完全站稳脚跟,因此良好的向下兼容显得尤为重要这块内容将在本系列后面具体篇章中得到专题详解,敬请关注。新一代类型转换接口Converter、GenericConverter为了解决PropertyEditor作为类型转换方式的设计缺陷,Spring 3.0版本重新设计了一套类型转换接口,其中主要包括: Converter:Source - Target类型转换接口,适用于1:1转换 o StringToPropertiesConverter:将String类型转换为Propertieso StringToBooleanConverter:将String类型转换为Booleano EnumToIntegerConverter:将Enum类型转换为Integer ConverterFactory:Source - R类型转换接口,适用于1:N转换 o StringToEnumConverterFactory:将String类型转任意Enumo StringToNumberConverterFactory:将Strin

      6、g类型转为任意数字(可以是int、long、double等等)o NumberToNumberConverterFactory:数字类型转为数字类型(如int到long,long到double等等) GenericConverter:更为通用的类型转换接口,适用于N:N转换 o ObjectToCollectionConverter:任意集合类型转为任意集合类型(如List转为List / Set都使用此转换器)o CollectionToArrayConverter:解释基本同上o MapToMapConverter:解释基本同上 ConditionalConverter:条件转换接口。可跟上面3个接口组合使用,提供前置条件判断验证重新设计的这套接口,解决了PropertyEditor做类型转换存在的所有缺陷,且具有非常高的灵活性和可扩展性。但是,每个接口独立来看均具有一定的局限性,只有使用组合拳方才有最大威力。当然喽,这也造成学习曲线变得陡峭。据我了解,很少有同学搞得清楚新的这套类型转换机制,特别容易混淆。倘若你掌握了是不是自己价值又提升了呢?不信你细品?这块内容将在本系列后面具体

      7、篇章中得到专题详解,敬请关注。新一代转换服务接口:ConversionService从上一小节我们知道,新的这套接口中,Converter、ConverterFactory、GenericConverter它们三都着力于完成类型转换。对于使用者而言,如果做个类型转换需要了解到这三套体系无疑成本太高,因此就有了ConversionService用于整合它们三,统一化接口操作。此接口也是Spring 3.0新增,用于统一化 底层类型转换实现的差异,对外提供统一服务,所以它也被称作类型转换的门面接口,从接口名称xxxService也能看出来其设计思路。它主要有两大实现:1. GenericConversionService:提供模版实现,如转换器的注册、删除、匹配查找等,但并不内置转换器实现2. DefaultConversionService:继承自GenericConversionService。在它基础上默认注册了非常多的内建的转换器实现,从而能够实现绝大部分的类型转换需求ConversionService转换服务它贯穿于Spring上下文ApplicationContext的多项功能

      8、,包括但不限于:BeanWrapper处理Bean属性、DataBinder数据绑定、PropertySource外部化属性处理等等。因此想要进一步深入了解的话,ConversionService是你绕不过去的坎。说明:很多小伙伴问WebConversionService是什么场景下使用?我说:它并非Spirng Framework的API,而属于Spring Boot提供的增强,且起始于2.x版本,这点需引起注意这块内容将在本系列后面具体篇章中得到专题详解,敬请关注。类型转换整合格式化器FormatterSpring 3.0还新增了一个Formatter接口,作用为:将Object格式化为类型T。从语义上理解它也具有类型转换(数据转换的作用),相较于Converter它强调的是格式化,因此一般用于时间/日期、数字(小数、分数、科学计数法等等)、货币等场景,举例它的实现: DurationFormatter:字符串和Duration类型的互转 CurrencyUnitFormatter:字符串和javax.money.CurrencyUnit货币类型互转 DateFormatter:字

      9、符串和java.util.Date类型互转。这个就使用得太多了,它默认支持什么格式?支持哪些输出方式,这将在后文详细描述 为了和类型转换服务ConversionService完成整合,对外只提供统一的API。Spring提供了FormattingConversionService专门用于整合Converter和Formatter,从而使得两者具有一致的编程体验,对开发者更加友好。这块内容将在本系列后面具体篇章中得到专题详解,敬请关注。类型转换底层接口TypeConvert定义类型转换方法的接口,它在Spring 2.0就已经存在。在还没有ConversionService之前,它的类型转换动作均委托给已注册的PropertyEditor来完成。但自3.0之后,这个转换动作可能被PropertyEditor来做,也可能交给ConversionService处理。它一共提供三个重载方法:/ since 2.0public interface TypeConverter / value:待转换的source源数据 / requiredType:目标类型targetType / methodParam:转换的目标方法参数,主要为了分析泛型类型,可能为null / field:目标的反射字段,为了泛型,可能为null T convertIfNecessary(Object value, Class requi

      《揭秘Spring类型转换-框架设计的基石》由会员ji****81分享,可在线阅读,更多相关《揭秘Spring类型转换-框架设计的基石》请在金锄头文库上搜索。

      点击阅读更多内容
    最新标签
    信息化课堂中的合作学习结业作业七年级语文 发车时刻表 长途客运 入党志愿书填写模板精品 庆祝建党101周年多体裁诗歌朗诵素材汇编10篇唯一微庆祝 智能家居系统本科论文 心得感悟 雁楠中学 20230513224122 2022 公安主题党日 部编版四年级第三单元综合性学习课件 机关事务中心2022年全面依法治区工作总结及来年工作安排 入党积极分子自我推荐 世界水日ppt 关于构建更高水平的全民健身公共服务体系的意见 空气单元分析 哈里德课件 2022年乡村振兴驻村工作计划 空气教材分析 五年级下册科学教材分析 退役军人事务局季度工作总结 集装箱房合同 2021年财务报表 2022年继续教育公需课 2022年公需课 2022年日历每月一张 名词性从句在写作中的应用 局域网技术与局域网组建 施工网格 薪资体系 运维实施方案 硫酸安全技术 柔韧训练 既有居住建筑节能改造技术规程 建筑工地疫情防控 大型工程技术风险 磷酸二氢钾 2022年小学三年级语文下册教学总结例文 少儿美术-小花 2022年环保倡议书模板六篇 2022年监理辞职报告精选 2022年畅想未来记叙文精品 企业信息化建设与管理课程实验指导书范本 草房子读后感-第1篇 小数乘整数教学PPT课件人教版五年级数学上册 2022年教师个人工作计划范本-工作计划 国学小名士经典诵读电视大赛观后感诵读经典传承美德 医疗质量管理制度 2 2022年小学体育教师学期工作总结
    关于金锄头网 - 版权申诉 - 免责声明 - 诚邀英才 - 联系我们
    手机版 | 川公网安备 51140202000112号 | 经营许可证(蜀ICP备13022795号)
    ©2008-2016 by Sichuan Goldhoe Inc. All Rights Reserved.