* 在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时序图
总结
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中大量使用这种命名方式,很值得借鉴和学习的命名方式。