Spring 在装配Bean 时可以使用字符串装配其他数据类型,如URL。也就是说Spring 会自动的将String 类型转换成URL类型进行Bean 的属性装配。这是通过JavaBean API 实现的(java.beans.PropertyEditor 接口)。 那么如何通过Spring 配置将String 类型转换成自定义的类型呢?
这首先需要写一个编辑器类,该类用于实现将String 类型转换成您需要的数据类型。这只需要继承JDK 中的 java.beans.PropertyEditorSupport 类来实现自己的编辑器类。然后我们只需要在Spring 的容器中对这个编辑器进行有效的“注册”便可以实现Spring 在装配Bean 时自动的将Strng 类型转换成我们自定义的类型。 这就是今天我要介绍的CustomEditorConfigurer 类用于实现在Spring 中注册自己定义的编辑器。它是Spring 当中一个非常有用的工厂后处理类(工厂后处理通过Spring 的BeanFactoryPostProcessor 接口实现, 它是在Spring 容器启动并初始化之后进行对Spring 容器的操作类)。在Spring 中已经注册了不少编辑器类,他们都用于String 类型转换为其他的数据类型,如URL,Date等。
在Spring框架中,提供了几个内置的属性编辑器,如FileEditor,ResourceEditor等。要想使用自定义属性编辑器,需要经过两个步骤。
一。定义一个自定义编辑器,可实现PropertyEditor接口或直接继承PropertyEditorSupport类。
- package com.dream.editor;
- import com.dream.model.photo.Photo;
- import com.dream.service.standard.PhotoService;
- import java.beans.PropertyEditorSupport;
- /**
- * Created by IntelliJ IDEA.
- * User: Zhong Gang
- * Date: 11-9-6
- * Time: 下午10:10
- */
- public class PhotoEditor extends PropertyEditorSupport {
- private PhotoService photoService;
- @Override
- public String getAsText() {
- Photo photo = (Photo) getValue();
- return photo.getGuid();
- }
- @Override
- public void setAsText(String text) throws IllegalArgumentException {
- Photo photo = photoService.loadPhotoByGuid(text);
- setValue(photo);
- }
- }
二。注册自定义编辑器
Spring提供了一个PropertyEditorRegistry接口和PropertyEditorRegistrySupport类来自定义一个注册器。其中PropertyEditorRegistrySupport是Spring提供的一个默认实现,里面注册了一些内置的编辑器。
可以在配置文件中注册自定义编辑器,也可以以编程的方式注册自定义编辑器。
- String location = "testApplicationContext.xml";
- Resource resource = new ClassPathResource(location);
- XmlBeanFactory beanFactory = new XmlBeanFactory(resource);
- beanFactory.registerCustomEditor(Photo.class, PhotoEditor.class);
- <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
- <property name="customEditors">
- <map>
- <entry key="com.dream.model.photo.Photo">
- <ref bean="photoEditor"/>
- </entry>
- </map>
- </property>
- </bean>
- <bean id="photoEditor" class="com.dream.editor.PhotoEditor">
- <property name="photoService" ref="photoService"/>
- </bean>