风言枫语  

Spring中的属性编辑器能够自动的将String类型转化成需要的类型,例如一个类里面的一个整型属性,在配置文件中我们是通过String类型的数字进行配置的,这个过程中就需要一个转化操作,当然这个转化操作是由Spring来帮我们完成的,就是通过属性编辑器来操作的。

Spring具有多个自定义编辑器,它们能够自动把注入的String值转化为更复杂的类型

ClassEditor:能够实现将一个String值转化为java.lang.Class,其中String值包括一个完整的类名描述

CustomDateEditor:将一个String值转化为java.util.Date,其中String是使用的自定义的DateFormat对象

FileEditor:从一个String值设置java.io.File属性,String值中包含文件的路径

LocalEditor:从一个String值设置java.util.Locale,String值里面包含地域的文本信息

StringArrayPropertyEditor:把逗号分割的String转化为一个String数组属性

StringTrimmerEditor:对String属性进行自动裁剪,设置这个选项后,可以把空的String值转化为NULL

URLEditor:从一个String值设置为java.net.URL属性,String中包括一个URL

下面是一个自定义属性编辑器的例子

 

//一个普通的JavaBean
public class Person {
	//人的名字
	private String name;
	private Phone phone;
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public Phone getPhone() {
		return phone;
	}
	public void setPhone(Phone phone) {
		this.phone = phone;
	}
}

 

这个类里面有一个属性是电话,具体的定义如下:

//普通的PHONE类,也是一个JavaBean
public class Phone {
private String areaCode;
private String prefix;
private String number;
public Phone(String areaCode, String prefix, String number) {
	super();
	this.areaCode = areaCode;
	this.prefix = prefix;
	this.number = number;
}
public String getAreaCode() {
	return areaCode;
}
public void setAreaCode(String areaCode) {
	this.areaCode = areaCode;
}
public String getPrefix() {
	return prefix;
}
public void setPrefix(String prefix) {
	this.prefix = prefix;
}
public String getNumber() {
	return number;
}
public void setNumber(String number) {
	this.number = number;
}
}

对这个Phone生成一个字符串到Phone的转化类

public class PhoneEditor extends java.beans.PropertyEditorSupport{
	@Override
	public void setAsText(String text) throws IllegalArgumentException {
		String stripped=stripNonNumeric(text);
		String areaCode=stripped.substring(0,3);
		String prefix=stripped.substring(3,6);
		String number=stripped.substring(6);
		Phone phone=new Phone(areaCode,prefix,number);
		setValue(phone);
	}
	private String stripNonNumeric(String original){
		StringBuffer allNumberic=new StringBuffer();
		for(int i=0;i<original.length();i++){
			char c=original.charAt(i);
			if(Character.isDigit(c)){
				allNumberic.append(c);
			}
		}
		return allNumberic.toString();
	}
}

配置文件如下:

<!-- 这里配置了自定义属性编辑器,Bean工厂在创建完后会自动将其注入 -->
	<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
	<property name="CustomEditors">
		<map>
			<entry key="com.pp.Phone">
				<bean id="phoneEditor" class="com.pp.PhoneEditor"></bean>
			</entry>
		</map>
	</property>
	</bean>
	<bean id="test" class="com.pp.Person">
		<property name="Name" value="ppTest"></property>
		<!-- 在这里生成Bean对象时,会自动的将字符串转化成一个类 -->
		<property name="Phone" value="888-555-1213"></property>
	</bean>

测试文件如下:

 

		BeanFactory factory=new XmlBeanFactory(new ClassPathResource("person.xml"));
		Person person=(Person)factory.getBean("test");
		System.out.println(person.getName());
		System.out.println(person.getPhone().getAreaCode());
		System.out.println(person.getPhone().getPrefix());
		System.out.println(person.getPhone().getNumber());

 

posted on 2013-08-12 19:36  风言枫语  阅读(726)  评论(0编辑  收藏  举报