Spring学习笔记(三)--Convert System设计
一.概述
转换系统是不同范式系统间交互常常会需要碰到的,如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设计的更多相关文章
- Spring学习笔记(三):面向切面的Spring
Spring之面向切面编程 一.理解何为面向切面编程 对于这个的理解,我觉得Spring实战中的例子讲得很明白: 假设我现在是一个小区用户,每个月小区都要收电费,这时候就会来人查看电表,算出来这个月电 ...
- Spring学习笔记三:Bean管理
转载请注明原文地址:http://www.cnblogs.com/ygj0930/p/6775827.html 一:如何使用Spring获取对象 1:定义bean类:要按照注入方式来定义对应的bea ...
- spring学习笔记三:Component注解(把POJO类实例化到spring的IOC容器中)
Component注解:把普通的POJO 类实例化到spring的IOC容器中,就是定义成<bean id="" class=""> 项目目录树: ...
- Spring学习笔记(三)之装配Bean
除了组件扫描与自动装配之外还有基于Java代码的装配与基于XML的装配. 有一些场景是我们不能用自动装配的,比如我们要给第三方库中的组件装配到我们的应用中,这时自动装配无效,因为自动装配只能扫描本应用 ...
- 不错的Spring学习笔记(转)
Spring学习笔记(1)----简单的实例 --------------------------------- 首先需要准备Spring包,可从官方网站上下载. 下载解压后,必须的两个包是s ...
- Spring学习笔记之aop动态代理(3)
Spring学习笔记之aop动态代理(3) 1.0 静态代理模式的缺点: 1.在该系统中有多少的dao就的写多少的proxy,麻烦 2.如果目标接口有方法的改动,则proxy也需要改动. Person ...
- Spring学习笔记之依赖的注解(2)
Spring学习笔记之依赖的注解(2) 1.0 注解,不能单独存在,是Java中的一种类型 1.1 写注解 1.2 注解反射 2.0 spring的注解 spring的 @Controller@Com ...
- [Firefly引擎][学习笔记三][已完结]所需模块封装
原地址:http://www.9miao.com/question-15-54671.html 学习笔记一传送门学习笔记二传送门 学习笔记三导读: 笔记三主要就是各个模块的封装了,这里贴 ...
- VSTO学习笔记(三) 开发Office 2010 64位COM加载项
原文:VSTO学习笔记(三) 开发Office 2010 64位COM加载项 一.加载项简介 Office提供了多种用于扩展Office应用程序功能的模式,常见的有: 1.Office 自动化程序(A ...
- Java IO学习笔记三
Java IO学习笔记三 在整个IO包中,实际上就是分为字节流和字符流,但是除了这两个流之外,还存在了一组字节流-字符流的转换类. OutputStreamWriter:是Writer的子类,将输出的 ...
随机推荐
- FileStream读写文件
读文件示例 try { // 打开文件 FileStream fs = new FileStream("D:\\not.txt", FileMode.Open, FileAcces ...
- Python 函数 -globals()
globals() globals() 函数会以字典类型返回当前位置的全部全局变量. 实例: >>>a='runoob' >>> print(globals()) ...
- 生产环境LNMP (果图片)
一. 下载一键安装包 LNMP 官方地址为:http://lnmp.org/ 登陆后运行:screen -S lnmp cd /usr/local/src wget -c http://soft. ...
- 初识php,开发环境的配置
PHP开发环境配置和第一个PHP程序(phpStudy+PhpStorm) 第一步 下载phpStudy 首先,到phpStudy官网上下载最新的phpStudy版本. 第二步 安装phpStudy ...
- ios真机连接不上记录,再次执行脚本说找不到真机的解决
1.连接其他手机iphone 6 plus 和 iphone x 的时候,连接不上 appium desired capabilities 获取不了元素 提示 An unknown server ...
- java web 程序---购物车选商品,购买,付款
思路:1.有一个单选按钮,让我们选择商品 2.购买的物品及 数量清算 3.付款 我的界面: home.jsp <body> <center> 选择您购买的商品 <br ...
- 学习:Dom4j和Xpath
1.DOM4J简介 DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和JAXP. DOM4J使 ...
- 第六章 通过Service访问Pod(上)
不应该直接使用Pod的ID地址作为对外提供服务的接口,应为一旦Pod重启,IP地址就变化了,解决方案是使用Service. 6.1 创建Service K8s service从逻辑上代表了一组Pod, ...
- Julia - 函数的参数传递
不定参数 不定参数的函数也称变参函数 函数的参数可以被定义成任意个 可以在最后一个参数后紧跟省略号“...”来定义变参函数 julia> bar(x, y, z...) = (x, y, z) ...
- MySQL编码问题(无法插入中文)
1.问题描述 2.解决方案 1.问题描述 当使用django时,如果数据库是MySQL,插入中文会报错: Incorrect string value: '\xF0\x9F...' for colum ...