Spring 5:自定义编辑器

自定义属性编辑器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();
		}
	}

猜你喜欢

转载自blog.csdn.net/qq_42857603/article/details/83278937