自定义属性编辑器PropertyEditor
有时候我们需要一个类的多个不同对象,如果在容器中实例化多个bean,显然比较麻烦,Spring中我们可以使用属性编辑器来将特定的字符串转换为对象 :String-->object
java.beans.PropertyEditor(JDK中)用于将xml文件中字符串转换为特定的类型
JDK为我们提供一个实现类PropertyEditorSupport
Spring在注入时,如果遇到类型不一致则会去调用相应的属性编辑器进行转换,
调用属性编辑器的setAsText(String str)进行处理,调用其getValue()获取处理后得到的对象
自定义属性编辑器示例
public class AddressEditor extends PropertyEditor{
public void setAsText(String text) throws IllegalArgumentException{
String str = text.split("[,]");
Address addr = new Address(str[0],str[1],Integer.parseInt(str[2]));
//设置到父类中,以便Spring调用getValue可以获得
setValue(addr);
}
}
public class User {
private Address address;
//getter setter
}
public class Address {
private String city;
private String street;
private int code;
//getter setter
}
xml:
customEditors 是CustomEditorConfigurer类的一个属性,这个属性的值是一个Map类型的,Map的KEY 是需要编辑的属性的类型,对应的value值是属性编辑器类
<bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<entry key="com.briup.ioc.Address> //key为目标类
<bean class="com.briup.ioc.AddressEditor" /> //属性编辑器
</entry>
</map>
</property>
</bean>
<bean id="user" class="com.briup.ioc.User">
<property name="address" value="城市,街道,471900" /> //此处串会被转换
</bean>
例:
实体类:
package com.briup.bean;
public class User {
private long id;
private String name;
private Address address;
@Override
public String toString() {
return "User [id=" + id + ", name=" + name + ", address=" + address + "]";
}
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
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;
}
}
package com.briup.bean;
public class Address {
private String province;
private String city;
private String street;
@Override
public String toString() {
return "Address [province=" + province + ", city=" + city + ", street=" + street + "]";
}
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 getStreet() {
return street;
}
public void setStreet(String street) {
this.street = street;
}
}
配置文件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 name="user"
class="com.briup.bean.User">
<property name="id" value="1"></property>
<property name="name" value="tom"></property>
<property name="address" ref="addr"></property>
</bean>
<bean name="addr"
class="com.briup.bean.Address">
<property name="province" value="江苏省"></property>
<property name="city" value="昆山"></property>
<property name="street" value="巴城"></property>
</bean> -->
<!-- 告诉spring 容器,address对象的
封装当遇到value属性指定字符串的时候,
用那个自定义编辑器 -->
<bean id="customEditorConfigurer"
class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="customEditors">
<map>
<!-- <entry key="com.briup.bean.Address">
<bean class="com.briup.bean.EditorAddress" />
</entry> -->
<entry key="com.briup.bean.Address"
value="com.briup.bean.EditorAddress">
</entry>
</map>
</property>
</bean>
<bean name="user"
class="com.briup.bean.User">
<property name="id" value="1"></property>
<property name="name" value="tom"></property>
<!-- 自定义属性编辑器
将String转为需要的对象类型
-->
<property name="address"
value="江苏省,昆山,巴城"></property>
</bean>
</beans>
自定义编辑器:
package com.briup.bean;
import org.springframework.beans.propertyeditors.PropertiesEditor;
/*
* 自定义编辑器
* String ->Address
*/
public class EditorAddress
extends PropertiesEditor{
private Object value;
public Object getValue() {
System.out.println("getValue...");
return value;
}
public void setValue(Object value) {
this.value = value;
}
/*
* 转化的方法,
* 在将String转化为对象的过程中
* spring自动调用setAsText方法
* 参数就是解析得到value属性
*
* spring最后会调用getValue方法获取
* 封装好的对象
*/
@Override
public void setAsText(String text) throws IllegalArgumentException {
System.out.println("text:"+text);
String[] strs=text.split("[,]");
Address addr=new Address();
addr.setProvince(strs[0]);
addr.setCity(strs[1]);
addr.setStreet(strs[2]);
setValue(addr);
}
}
测试代码:
@Test
public void editor_test(){
try {
ClassPathXmlApplicationContext cp=
new ClassPathXmlApplicationContext(
"com/briup/IOC/editor.xml");
System.out.println(cp.getBean("user"));
//cp.destroy();
} catch (Exception e) {
e.printStackTrace();
}
}