起始知识:
Java标准的PropertyEditor的核心功能是将一个字符串转换为一个Java对象,以便根据界面的输入或配置文件中的配置字符串构造出一个JVM内部的java对象。
如何注册自定义的属性编辑器:
1、实现PropertyEditor接口或者继承PropertyEditorSupport类
2、在Spring上下文中声明一个org.springframework.beans.factory.config.CustomEditorConfigurer的bean
<!--将bean1中的Date赋值2008-08-15,spring会认为2008-08-15是String,无法转换成Date,会报错!--> <bean id="bean1" class="com.bjsxt.spring.Bean1">
<property name="dateValue">
<value>2008-08-15</value>
</property>
</bean>
<!-- 于是定义属性编辑器 -->
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="java.util.Date">
<bean class="com.bjsxt.spring.UtilDatePropertyEditor">
<!--干脆把format也注入,灵活处理格式-->
<property name="format" value="yyyy-MM-dd"/>
</bean>
</entry>
</map>
</property>
</bean>
但是Java原生的PropertyEditory存在一下不足:
1、只能用于字符串和java对象的抓换,不适用于任意两个Java类型之间的转换。
2、对源对象和目标对象上下文信息(如注解,所在宿主类的结构等)不敏感,在类型转换时不能利用这些上下文信息实施高级转换逻辑。
有鉴于此,Spring 3.0核心模型中添加了一个通用的类型转换模块,类型转换模块位于org.springframework.core.convert中,Spring希望用这个类型转换体系替换Java标准的PropertyEditor。但由于历史原因,会同时支持两者。
ConversionService
它是Spring类型转换体系中核心接口,位于org.springframework.core.convert中,也是唯一一个接口。
可以利用ConversionServiceFactorybean在spring上下文中定义一个ConversionService。该factorybean提供了大量内置的转换器,同时也支持自定义转换器。
自定义转换器,可选择实现三者中任一种接口:
- Converter<S,T>
- GenericConverter
- ConverterFactory
Spring mvc在支持新转换器框架同时,也支持JavaBeans的PropertyEditor,可以在控制器中使用@InitBinder添加自定义的编辑器,也可以通过WebBindingInitializer装配在全局范围内使用的编辑器。
加载顺序
那么,对于同一个类型对象来说,如果三个地方均配置了,该以哪个为主:
1、查询通过@Initbinder装配的自定义编辑器。
2、查询通过ConversionService装配的自定义转换器。
3、查询通过WebBindingInitializer装配的自定义编辑器。