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());