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里去搜寻,对性能有一定影响。
?