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

简介: 2. Spring早期类型转换,基于PropertyEditor实现(下)
  • CharsetEditor


@Test
public void test2() {
    // 虽然都行,但建议你规范书写:UTF-8
    PropertyEditor editor = new CharsetEditor();
    editor.setAsText("UtF-8");
    System.out.println(editor.getAsText()); // UTF-8
    editor.setAsText("utF8");
    System.out.println(editor.getAsText()); // UTF-8
}


关注点:utf-8中间的横杠可要可不要,但建议加上使用标准写法,另外字母也是不区分大小写的。


  • CustomDateEditor


@Test
public void test3() {
    PropertyEditor editor = new CustomDateEditor(new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"),true);
    editor.setAsText("2020-11-30 09:10:10");
    System.out.println(editor.getAsText()); // 2020-11-30 09:10:10
    // null输出空串
    editor.setAsText(null);
    System.out.println(editor.getAsText());
    // 报错
    editor.setAsText("2020-11-30");
    System.out.println(editor.getAsText());
}


关注点:这个时间/日期转换器很不好用,构造时就必须指定一个SimpleDateFormat格式化器。在实际应用中,Spring并没有使用到它,而是用后面会说到的替代方案。


特殊实现


把没有放在org.springframework.beans.propertyeditors包下的实现称作特殊实现(前者称为标准实现)。


  • MediaTypeEditor:位于org.springframework.http。依赖的核心API是MediaType.parseMediaType(text),可以把诸如text/html、application/json转为MediaType对象
  • 显然它属于spring-web包,使用在web环境下
  • FormatterPropertyEditorAdapter:位于org.springframework.format.support。将3.0新增的Formatter接口适配为一个PropertyEditor:setAsText这种转换操作委托给formatter.parse()去完成,反向委托给formatter.print()去完成。
  • 此适配器在DataBinder#addCustomFormatter()得到应用
  • PropertyValuesEditor:位于org.springframework.beans。将k-v字符串(Properties格式)转换为一个PropertyValues,从而方便放进Environment里
  • ResourceEditor:位于org.springframework.core.io。此转换器将String转换为Resource资源,特别实用。作为基础设施,广泛被用到Spring的很多地方
  • 像什么标准的FileEditor、InputSourceEditor、InputStreamEditor、URLEditor等等与资源相关的转换器,均依赖它而实现


@Test
public void test4() {
    // 支持标准URL如file:C:/myfile.txt,也支持classpath:myfile.txt
    // 同时还支持占位符形式
    PropertyEditor editor = new ResourceEditor(new DefaultResourceLoader(), new StandardEnvironment(), true);
    // file:形式本处略
    // editor.setAsText("file:...");
    // System.out.println(editor.getAsText());
    // classpath形式(注意:若文件不存在不会报错,而是输出null)
    editor.setAsText("classpath:app.properties");
    System.out.println(editor.getAsText()); // 输出带盘符的全路径
    System.setProperty("myFile.name", "app.properties");
    editor.setAsText("classpath:${myFile.name}");
    System.out.println(editor.getAsText()); // 结果同上
}


关注点:Spring扩展出来的Resource不仅自持常规file:资源协议,还支持平时使用最多的classpath:协议,可谓非常好用。


  • ConvertingPropertyEditorAdapter:位于org.springframework.core.convert.support。将3.0新增的ConversionService转换服务适配为一个PropertyEditor,内部转换动作都委托给前者去完成。
  • AbstractPropertyBindingResult#findEditor()为属性寻找合适PropertyEditor的时候,若ConversionService能支持就包装为ConvertingPropertyEditorAdapter供以使用,这是适配器模式的典型应用场景。


“谁”在使用ProertyEditor

PropertyEditor自动发现机制

PropertyEditor存在的缺陷


考虑到阅读的舒适性,单篇文章不宜太长,因此涉及到PropertyEditor的这几个问题,放在下篇文章单独列出。这个几个问题会明显比本文更深入,欢迎保持持续关注,peace!


✍总结


本文主要介绍了三点内容:


  1. PropertyEditor是什么?
  2. Spring为何选择基于PropertyEditor?
  3. Spring内建的那些PropertyEditor都有哪些,各自什么作用?


PropertyEditor虽然已经很古老,不适合当下复杂环境。但不可否认它依旧有存在的价值,Spring内部也大量的仍在使用,因此不容忽视。下篇文章将深度探讨Spring内部是如何使用PropertyEditor的,赋予了它哪些机制,以及最终为何还是决定自己另起炉灶搞一套呢?欢迎对本系列保持持续关注~


附:Spring主要版本发布时间和特性


  • 2002-02,开始开发孵化此项目,项目名叫:interface21,它便就是Spring的前身
  • 2004-03,1.0版发布。进入迅速发展期
  • 2006-10,2.0版发布。支持可扩展的xml配置功能、支持Java5、支持动态语言、支持更多扩展点
  • 2007-11,2.5版发布。项目名从此改为Spring Source,支持Java 6,支持注解配置(部分)
  • 2009-12,3.0版发布。这是非常非常重要的一个版本,支持了模块驱动、支持SpEL、支持Java Bean配置、支持嵌入式数据库…
  • 2011和2012,这两年发布了非常多的3.x系列小版本,带来了很多惊喜,同时也让Spring更加扎实
  • 2013-12,4.0版发布。这是有一次进步,提供了对Java 8的全面支持,支持Java EE 7、支持websocket、泛型依赖注入…
  • 2017-09,5.0版发布。最低JDK版本要求是Java 8,同时支持Servlet 3.1。当然最为重要的是引入了全新模块:WebFlux


截止到当前,Spring Framework的最新版本是5.3.x版本,此版本是5.x的最后一个主要功能分支,下个版本将是6.x喽,咱们拭目以待。

相关文章
|
前端开发 Java Spring
Spring Boot 实现图片上传并回显
Spring Boot 实现图片上传并回显
|
NoSQL Java Redis
Spring boot整合Redis实现发布订阅(超详细)
Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送消息,订阅者(sub)接收信息。微信,微博,关注系统 Redis客户端可以订阅任意数量的频道
4809 0
Spring boot整合Redis实现发布订阅(超详细)
|
前端开发 Java Spring
《Spring MVC》 第六章 MVC类型转换器、格式化器
《Spring MVC》 第六章 MVC类型转换器、格式化器
190 0
|
JavaScript 前端开发 Java
Spring Boot+Vue实现汽车租赁系统(毕设)
一、前言 汽车租赁系统,很常见的一个系统,但是网上还是以前的老框架实现的,于是我打算从设计到开发都用现在比较流行的新框架。想学习或者做毕设的可以私信联系哦!!
440 19
Spring Boot+Vue实现汽车租赁系统(毕设)
|
XML JSON 前端开发
软件测试|Spring Boot 的 RESTful API 设计与实现
软件测试|Spring Boot 的 RESTful API 设计与实现
软件测试|Spring Boot 的 RESTful API 设计与实现
|
前端开发 Java 数据格式
Spring Boot实现文件上传
Spring Boot实现文件上传
607 0
|
Java Spring
Spring Boot+Netty实现远程过程调用(RPC)
Spring Boot+Netty实现远程过程调用(RPC)
|
存储 Java Apache
Spring Boot整合OpenOffice实现Word、Excel、PPT在线预览
Spring Boot整合OpenOffice实现Word、Excel、PPT在线预览
|
消息中间件 Java Spring
一文看懂Spring Boot整合Rabbit MQ实现多种模式的生产和消费
一文看懂Spring Boot整合Rabbit MQ实现多种模式的生产和消费
|
负载均衡 Java Nacos
手把手教你Spring Cloud Alibaba系列教程:Nacos实现服务注册与发现
手把手教你Spring Cloud Alibaba系列教程:Nacos实现服务注册与发现
339 0
手把手教你Spring Cloud Alibaba系列教程:Nacos实现服务注册与发现