spring源码学习笔记之自定义属性编辑器(五)

156 阅读1分钟
  1. 自定义一个实现了PropertyEditorSupport接口的编辑器
  2. 让spring能够识别到此编辑器,自定义实现一个属性编辑器的注册器,实现了PropertyEditorRegistrar接口
  3. 让spring能够识别到对应的注册器

示例:
功能:能够把以下划线分割的地址,如 河北省_邯郸市_武安市解析到对象的省、市、区三个字段中。

  • 类定义:
public class Customer {

    private String name;
    private Address address;

    public String getName() {
        return name;
    }

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

    public Address getAddress() {
        return address;
    }

    public void setAddress(Address address) {
        this.address = address;
    }

    @Override
    public String toString() {
        return "Customer{" +
                "name='" + name + ''' +
                ", address=" + address +
                '}';
    }
}

public class Address {
    private String province;
    private String city;
    private String town;

    public String getProvince() {
        return province;
    }

    public void setProvince(String province) {
        this.province = province;
    }

    public String getCity() {
        return city;
    }

    public void setCity(String city) {
        this.city = city;
    }

    public String getTown() {
        return town;
    }

    public void setTown(String town) {
        this.town = town;
    }

    @Override
    public String toString() {
        return "Address{" +
                "province='" + province + ''' +
                ", city='" + city + ''' +
                ", town='" + town + ''' +
                '}';
    }
}
  • 实现了PropertyEditorSupport接口的编辑器
public class AddressPropertyEditor  extends PropertyEditorSupport {

    @Override
    public void setAsText(String text) throws IllegalArgumentException {
        String[] s = text.split("_");
        Address address = new Address();
        address.setProvince(s[0]);
        address.setCity(s[1]);
        address.setTown(s[2]);
        this.setValue(address);
    }
}

自定义一个属性编辑器的注册器

public class AddressPropertyEditorRegistrar implements PropertyEditorRegistrar {

    @Override
    public void registerCustomEditors(PropertyEditorRegistry registry) {
        registry.registerCustomEditor(Address.class,new AddressPropertyEditor());
    }
}
  • xml文件配置:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="customer" class="com.dabao.selfEditor.Customer">
        <property name="name" value="zhangsan"></property>
        <property name="address" value="河北省_邯郸市_武安市"></property>
    </bean>
    <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
        <property name="propertyEditorRegistrars">
            <list>
                <bean class="com.dabao.selfEditor.AddressPropertyEditorRegistrar"></bean>
            </list>
        </property>
    </bean>
</beans>

getBean得到的结果如下:

Customer{name='zhangsan', address=Address{province='河北省', city='邯郸市', town='武安市'}}