一.概述

转换系统是不同范式系统间交互常常会需要碰到的,如WEB 中HTTP KV文本流到对象的转换和对象到http KV文本流的转换;还有对象到关系型DB和关系型DB到对象之间的转换(ORM)。

一个面向对象的转换系统涉及到以下几个方面:

1. 转换映射,

如类型转换:String—>Number,Boolean—>String,String—>Boolean;

字段转换:从一个类声明的字段变成另一个类声明的字段(包括类型和值);

参数转换:从一个方法声明的参数变成另一个方法声明的参数(包括类型和内容)。

2. 转换器负责具体的转换操作。

3. 转换映射和转换器的对应关系。(多对多的关系)

二.Spring的解决方案

1. 转换映射:

采用泛型来对类型映射进行参数化。类型转换是在两种类型中进行的,一种是原始类型,一种是目标类型,将这个泛型化。S—>T,—>extends T

采用TypeDescriptor对参数和字段进行描述,达到扩大转换语境(从类型信息到字段信息)的效果。

2. 转换器

一对一的映射可以用Convert<S,T>来表示,

一对多且多方类型具有继承体系可以用ConverterFactory<S,R>, R 是所有目标类型的基类,可以从工厂中得到对应的Converter<S,T extends R>

更为强大的是GenericConverter 可以将转换从类型之间扩展到字段、参数之间,也就是可以根据声明类型的字段、参数的配置来改变转换逻辑,比如数组到集合的转变,可以读到原始声明元素类型和目标声明元素类型来做动态映射。

3. 转换映射器:在GenericConversionService 有存储字段

private final Map<Class<?>, Map<Class<?>, MatchableConverters>> converters =new HashMap<Class<?>, Map<Class<?>, MatchableConverters>>(36);

这个Map描述了原始类型到目标类型的映射。

4.SRP

ConversionService 只提供转换方法,ConverterRegistry中提供Converter的增加,修改,去除,将两者功能分离在不同的接口中。GenereicConversionService 提供了转换接口的默认实现,并支持CovnertFactory,Coverter和GenericConverter的注册。

三、 web 中涉及的KV 到对象和对象到KV的转换:

web客户端是以kv结构来传递数据到web服务端,涉及的问题有两个:

1. 如何从平面性的kv结构变成树形的对象属性结构

2. 如何从字符串转换成相应的对象中的类型。

第一个问题可以命名一套规范来标识对象中的一个属性,

比如

public Class User{

private UserName name;

}

Class UserName{

private String firstName;

private String lastName;

}

那么如何用kv系统来表示firstName的值是多少呢?可以发明一套标识系统,如name.firstName,用.来表示嵌套关系。

至于类型转换,则可以考虑从类声明定义来查找,从而从String转成声明的类型。

 

Spring学习笔记(三)--Convert System设计的更多相关文章

  1. Spring学习笔记(三):面向切面的Spring

    Spring之面向切面编程 一.理解何为面向切面编程 对于这个的理解,我觉得Spring实战中的例子讲得很明白: 假设我现在是一个小区用户,每个月小区都要收电费,这时候就会来人查看电表,算出来这个月电 ...

  2. Spring学习笔记三:Bean管理

    转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6775827.html  一:如何使用Spring获取对象 1:定义bean类:要按照注入方式来定义对应的bea ...

  3. spring学习笔记三:Component注解(把POJO类实例化到spring的IOC容器中)

    Component注解:把普通的POJO 类实例化到spring的IOC容器中,就是定义成<bean id="" class=""> 项目目录树: ...

  4. Spring学习笔记(三)之装配Bean

    除了组件扫描与自动装配之外还有基于Java代码的装配与基于XML的装配. 有一些场景是我们不能用自动装配的,比如我们要给第三方库中的组件装配到我们的应用中,这时自动装配无效,因为自动装配只能扫描本应用 ...

  5. 不错的Spring学习笔记(转)

    Spring学习笔记(1)----简单的实例 ---------------------------------   首先需要准备Spring包,可从官方网站上下载.   下载解压后,必须的两个包是s ...

  6. Spring学习笔记之aop动态代理(3)

    Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...

  7. Spring学习笔记之依赖的注解(2)

    Spring学习笔记之依赖的注解(2) 1.0 注解,不能单独存在,是Java中的一种类型 1.1 写注解 1.2 注解反射 2.0 spring的注解 spring的 @Controller@Com ...

  8. [Firefly引擎][学习笔记三][已完结]所需模块封装

    原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读:        笔记三主要就是各个模块的封装了,这里贴 ...

  9. VSTO学习笔记(三) 开发Office 2010 64位COM加载项

    原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...

  10. Java IO学习笔记三

    Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...

随机推荐

  1. 如何点焊过的镍片再次焊接到 PCBA 上?

    如何将点焊过的镍片再次焊接到 PCBA 上? 在 PCBA 上贴了镍片再点焊,这样的制造工艺可以大大减少人工处理,提高生产通过率. 由于种种原因,有些机器可能有故障需要维修,而且电池又需要拆下来,才能 ...

  2. easyui datagrid 基础方法和事件

    数据表格属性(DataGrid Properties) 属性继承控制面板,以下是数据表格独有的属性. 名称 类型 描述 默认值 columns array 数据表格列配置对象,查看列属性以获取更多细节 ...

  3. strcpy手写——面试

    #include<stdio.h> #include<string.h> ]={]; char* strcpy(char *to,char *from){ if(NULL==t ...

  4. jeecg中ajax传值的前端js和后台代码

    前端js: var b=1; $.ajax({ type : "POST", --Post请求方式 url : 'orderController.do?wuliao', --路径 ...

  5. 求助OPC Opc.IDiscovery m_discovery = new OpcCom.ServerEnumerator();

    各位大哥们,大家好,在此请教各位一个问题,谢谢大家.我在vs2010中引用了OpcNetApi.dll和OpcNetCom.dll并且加入了using Opc;using Opc.Da;using O ...

  6. linux下使用tar命令详解

    解压语法:tar [主选项+辅选项] 文件或者目录 使用该命令时,主选项是必须要有的,它告诉tar要做什么事情,辅选项是辅助使用的,可以选用. 主选项: c 创建新的档案文件.如果用户想备份一个目录或 ...

  7. bc显示小数点前的0

    bc是强大而常用的计算工具.不过在除法运算时,如果得到的结果值小于1,得到的小数前面的0不存.本篇提供几个常用小数点前缺0的解决方法. [root@maqing ~]# bc bc Copyright ...

  8. Git出现提交错误--Push to origin/master was rejected(转)

    Step1:出现的问题? 在使用Git Push代码的时候,会出现Push to origin/master was rejected 的错误提示.在第一次提交到代码仓库的时候非常容易出现,因为初始化 ...

  9. Windows2012使用笔记

    一.介绍 win 2012的名字于北京时间2012年4月18日公布,全称Windows Server 2012(下面简称win 2012),正式版于2012年9月4日发布.这是一套基于Windows ...

  10. python学习(二十) Python 中的比较:is 与 ==

    Python 中的比较:is 与 == 在 Python 中会用到对象之间比较,可以用 ==,也可以用 is .但是它们的区别是什么呢? is 比较的是两个实例对象是不是完全相同,它们是不是同一个对象 ...