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

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值