读书人

Spring经过继承PropertyEditorSupport

发布时间: 2012-10-23 12:12:22 作者: rapoo

Spring通过继承PropertyEditorSupport处理字符串转换特定类型

实例:

1、写POJO类Car.java:

package com.xfc.test.propertyedit;

public class Car {

??? private int??? horsepower;
??? private String color;

??? public int getHorsepower() {
??????? return horsepower;
??? }

??? public void setHorsepower(int horsepower) {
??????? this.horsepower = horsepower;
??? }

??? public String getColor() {
??????? return color;
??? }

??? public void setColor(String color) {
??????? this.color = color;
??? }

}
2.写bean类MyEditor.java:

package com.xfc.test.propertyedit;

/**
?* 对应spring配置文件中的bean
?*
?* @author xfc
?*/
public class MyEditor {

??? private String name;
??? private Car??? car;

??? public String getName() {
??????? return name;
??? }

??? public void setName(String name) {
??????? this.name = name;
??? }

??? public Car getCar() {
??????? return car;
??? }

??? public void setCar(Car car) {
??????? this.car = car;
??? }

}
3.写配置文件bean.xml:

<?xml version="1.0" encoding="GB2312"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">
<beans default-autowire="byName" default-lazy-init="true">
???
??? <!--? 使用HessianProxyFactoryBean 连接远程Hessian服务-->
??? <bean id="myEditor" value="xfc"/>
???????? <property name="car" value="1,shanghai"/>
??? </bean>
</beans>

4.写字符串转特定car对象类CarEditor.java:

package com.xfc.test.propertyedit;

import java.beans.PropertyEditorSupport;

import org.springframework.util.StringUtils;

/**
?* 将字符串转换成car对象的类
?*
?* @author xfc
?*/
public class CarEditor extends PropertyEditorSupport {

??? public void setAsText(String str) throws IllegalArgumentException {
??????? if (str == null && "".equals(str)) {
??????????? throw new IllegalArgumentException("string is null");
??????? }
??????? String[] s = StringUtils.commaDelimitedListToStringArray(str);
??????? if (s.length < 2) {
??????????? throw new IllegalArgumentException("string length is not right");
??????? }
??????? Car c = new Car();
??????? c.setHorsepower(Integer.parseInt(s[0]));
??????? c.setColor(s[1]);
??????? setValue(c);
??? }
}

?

5.写测试类Test.java:

package com.xfc.test.propertyedit;

import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class Test {

??? /**
??? ?* @param args
??? ?*/
??? public static void main(String[] args) {
??? ??? ApplicationContext ac=new ClassPathXmlApplicationContext("bean.xml");
??? ??? MyEditor me=(MyEditor)ac.getBean("myEditor");
??? ??? System.out.println(me);
??? ??? System.out.println(me.getCar().getHorsepower());
??? }

}

?

最大的疑问:为什么在配置文件中没指定字符串转特定对象的bean(如上CarEditor.java),Spring能自动调用该类呢?

经查:

spring可以自动的去检测PropertyEditor,其检测的规则是PropertyClassType-》ProertyClassTypeEditor,比如说,bean的某个属性类型为Family,那么如果在classpath里存在一个类名字叫FamilyEditor,那么spring会将这个editor认为是Family类的edtior,以后当给类型为Family的属性赋值时,都将使用这个FamilyEditor。

具体实现可以看TypeConverter类的委托类TypeConverterDelegate的findDefaultEditor方法(BeanUtils.findEditorByConvention(requiredType)),当然,推荐是用户自己进行配置,否则spring会在整个classpath里去搜寻,对性能有一定影响。

?

读书人网 >软件架构设计

热点推荐