JavaBean API 中提供了这样一个接口:java.beans.PropertyEditor,该接口提供了将字符串值(String类型)映射为非String类型的方法。它便是传说中的属性编辑器。通过实现该接口,用户可以编写自定义属性编辑器,以将spring配置文件中的字符串转换成相应的对象注入。
但该接口有12个方法,如果用户要实现该接口编写自定义的属性编辑器会比较麻烦。幸运的是有一个好用的这个接口的实现类:java.beans.PropertyEditorSupport,我们可以继承这个实现类,覆写其中的setAsText(String value)方法,来实现我们的自定义属性编辑器。
使用自定义编辑器的几个步骤:
(1)继承PropertyEditorSupport类,覆写setAsText(String value)方法,该方法通过一个字符串来构造对象,一般在此方法中解析字符串,构造一个类对象object(构造什么对象要看要注入的属性是什么类型),调用setValue(object)来完成属性对象设置操作
(2)在spring配置文件中注册该属性编辑器
举例:
一个User类,有两个属性:name(String 类型);address(Address 类型)
User.java
- public class User {
- private String name;
- private Address address;
- // getters and setters
- public getName() {
- return name;
- }
- public void setName(String name) {
- this.name = name;
- }
- public getAddress() {
- return address;
- }
- public void setAddress(Address address) {
- this.address = address;
- }
- }
Address.java
- public class Address {
- public String streetName;
- public String doorNum;
- // getters and setters省略
- }
AddressPropertyEditor.java
- public class AddressPropertyEditor extends PropertyEditorSupport {
- public void setAsText(String text) {
- if (text == null || text.equals("")) {
- throw new IllegalArgumentException("text can't be null or empty");
- } else {
- String[] strArr = StringUtils.tokenizeToStringArray(text,",");
- Address add = new Address();
- add.setStreetName(strArr[0]);
- add.setDoorNum(strArr[1]);
- setValue(add);
- }
- }
- public String getAsText() {
- Address add = (Address)getValue();
- return "" + add;
- }
- }
spring配置文件中添加:
- <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
- <property name="customEditors">
- <map>
- <entry key="org.itec.elwg.entity.Address"> <!-- 属性类型 -->
- <bean class="org.itec.elwg.customeditor.AddressPropertyEditor"/> <!--对应Address的编辑器 -->
- </entry>
- </map>
- </property>
- </bean>
- <bean id="user" class="org.itec.elwg.entity.User">
- <property name="name" value="小白"/>
- <property name="address" value="珞瑜路,1037"/>
- </bean>
CustomEditorConfigurer类将Address属性与AddrPropertyEditor属性编辑器关联起来, 在为user注入Address类型的address属性时,spring会使用AddressPropertyEditor利用“珞瑜路,1037”字符串的值转换成一个Address对象付给address。
转载于:https://blog.51cto.com/xiannenglin/435814