spring基础-convert

 * 在spring中有一个convert包用于转换,他和相似于JDK中的beans包。*

JDK中beans包实现

在JDK包中,提供了BeanInfo PropertyDescriptor PropertyEditor 实现对Bean属性的 转化。

BeanInfo

Bean信息访问的接口,能够访问BeanDescriptor PropertyDescriptor MethodDescriptor
 方式:BeanInfo student = Introspector.getBeanInfo(Class

    BeanInfo beanInfo = Introspector.getBeanInfo(Student.class);
    System.out.println(beanInfo.getBeanDescriptor());
    for (MethodDescriptor methodDescriptor :   beanInfo.getMethodDescriptors()) {
            System.out.println(methodDescriptor.toString());
        }
        for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) {
            System.out.println(propertyDescriptor.toString());
        }

PropertyDescriptor:属性描述器

用于描述Bean属性的描述器,包括属性名称 属性类型 属性编辑方法 
一个BeanInfo对象包含了多个PropertyDescriptor。

for (PropertyDescriptor propertyDescriptor : beanInfo.getPropertyDescriptors()) {
            System.out.println(propertyDescriptor.getReadMethod());
            System.out.println(propertyDescriptor.getWriteMethod());
            System.out.println(propertyDescriptor.getPropertyType());
            System.out.println(propertyDescriptor.getName());
        }

PropertyEditor:属性编辑器

提供了对属性进行编辑的操作,主要方法是setAsText getAsText方法
 可以允许通过页面值设置Bean的属性。
 

java Beans 的缺点

仅支持String到java对象的转化,不能支持java对象到java对象之间的转化
不能使用宿主对象的上下文信息(比如注解)帮助转换
非线程安全的(需要我们每次都必须创建一个)


spring解决之道

上面简单介绍了了JDK中属性转换的实现方式以及他的缺点,下面我们来看一下,spring如何解决这些问题的

针对无法实现java对象到java对象的转化

定义了一个Converter<’S, T>对象,提供了对于任何对象之间的转化

针对无法利用宿主对象的上下文信息

重新定义了一个TypeDescriptor对象,是基于java对象的封装,拥有Class<’?> type,和 注解属性,保存了宿主对象的注解信息。

TypeDescriptor提供了支持Property MethodParameter Filed的构造方法

ConversionService类图

这里写图片描述

ConversionService时序图

Created with Raphaël 2.1.0 GenericConversionService GenericConversionService ConversionUtils ConversionUtils GenericConverter GenericConverter convert(Object,target,source) getConvert() invokeConverter convert

总结

spring通过定义了TypeDescriptor重新定义了类型。这个类型包括了类型信息和注解信息,能够支持转换可以利用宿主对象的上下文对象。

spring 定义来GenericConvertor定义了通过source sourceType targetType参数对实例进行转换的接口,提供了对java对象到java对象之间转换的接口

spring内部提供大量的GenericConvertor的实现,满足基本的日常要求。

spring转换器知识使用了方法,而没有类似PropertyEditor的setValue(),利用了实例变量,避免了线程不安全的问题。

spring 学习

在convert中,看到了spring对接口的定义比较细致一些。
使用ConvertRegistory定义了可以注册Convertor的接口
GenericService定义了canConvert() convert()接口,大量重载这两个方法,只是为了实现操作的易用性而已,底层都是TypeDescriptor这个类型,这种设计便于维护,同时也是接口单一职责的体现。
ConfigurableConversionService继承了上述接口,起名为可配置的,表述上更加清晰。
GenericConversionService提供了ConfigurableConversionService基本实现,也是一个骨架类
DefaultConversionService 表示为系统的默认实现
整个spring中大量使用这种命名方式,很值得借鉴和学习的命名方式。

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值