实例:
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" class="com.xfc.test.propertyedit.MyEditor">
<property name="name" 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里去搜寻,对性能有一定影响。