Spring中的属性编辑器的使用

Spring中的属性编辑器的使用
转载自 http://blog.sina.com.cn/s/blog_59ca2c2a0100jxwh.html


 Struts中用一个类型转换器,在Spring中也有类似的功能,叫做属
 性编辑器,用于将spring配置文件中配置的字符串转换为Action中相应的类型。

这里有一个普通的JavaBean,代码如下:

package cn.com.huixin.spring;
import java.util.Date;
import java.util.List;
import java.util.Map;
public class Bean1 {
 private String stringValue;
 private List list1;
 private Map map1;
 private String[] array;
 private Date birthday;
 public Date getBirthday() {
  return birthday;
 }
 public void setBirthday(Date birthday) {
  this.birthday = birthday;
 }
 public String getStringValue() {
  return stringValue;
 }
 public void setStringValue(String stringValue) {
  this.stringValue = stringValue;
 }
 public List getList1() {
  return list1;
 }
 public void setList1(List list1) {
  this.list1 = list1;
 }
 public Map getMap1() {
  return map1;
 }
 public void setMap1(Map map1) {
  this.map1 = map1;
 }
 public String[] getArray() {
  return array;
 }
 public void setArray(String[] array) {
  this.array = array;
 }
}
  里边有几个属性需要使用spring注入。前边的四个属性注入都没有 问题,只有后边的Date型的属性注入时会出错,提示类型不匹配。从 
 spring配置文件中出过来的都是String型的字符串值,而Bean中是
 一个Date类型的值,这个属性就需要我们提供一个属性编辑器来完成类型转换工作。
  • 首先创建一个属性编辑器,该类需要继承

    java.beans.PropertyEditorSupport类,代码如下所示:

package cn.com.huixin.editor;
import java.beans.PropertyEditorSupport;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class DatePropertyEditor extends PropertyEditorSupport {
 private String format = "yyyy-MM-dd";
 public String getFormat() {
  return format;
 }
 public void setFormat(String format) {
  this.format = format;
 }
 @Override
 public void setAsText(String text) throws IllegalArgumentException {
  SimpleDateFormat dateFormat = new SimpleDateFormat(format);
  Date date = null;
  try {
   date = dateFormat.parse(text);
  } catch (ParseException e) {
   e.printStackTrace();
  }
  this.setValue(date);
 }
}
该类中有一个String型的format属性,为日期格式,并为它提供的
   法用于进行类型转换。参数text为从spring配置文件中获得的字符串值。使用SimpleDateFormat对象将其转换为Date对象后,调用
setValue()方法将转换后的对象放入value对象中。
接下来配置applicationContext.xml文件,代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
 <!--
  - Application context definition for JPetStore's business layer. -
  Contains bean references to the transaction manager and to the DAOs in
  - dataAccessContext-local/jta.xml (see web.xml's
  "contextConfigLocation").
 -->
<beans xmlns="http://www.springframework.org/schema/beans"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:aop="http://www.springframework.org/schema/aop"
 xmlns:tx="http://www.springframework.org/schema/tx"
 xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
 <bean id="bean1" class="cn.com.huixin.spring.Bean1">
  <property name="stringValue" value="stringValue1" />
  <property name="list1">
   <list>
    <value>listValue1</value>
    <value>listValue2</value>
    <value>listValue3</value>
   </list>
  </property>
  <property name="map1">
   <map>
    <entry key="mapkey1" value="mapValue1" />
    <entry key="mapkey2" value="mapValue2" />
   </map>
  </property>
  <property name="array">
   <list>
    <value>arrayValue1</value>
    <value>arrayValue2</value>
   </list>
  </property>
  <property name="birthday" value="2010-07-24"/>
 </bean>
</beans>
 这个文件中对Bean1种的各属性注入了值。接下来再提供一个
 applicationContext-propertyEditor.xml文件,专门用于属性编辑器的配置,代码如下所示:
<?xml version="1.0" encoding="UTF-8"?>
<!--
  - Application context definition for JPetStore's business layer.
  - Contains bean references to the transaction manager and to the DAOs in
  - dataAccessContext-local/jta.xml (see web.xml's "contextConfigLocation").
  -->
<beans xmlns="http://www.springframework.org/schema/beans"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xmlns:aop="http://www.springframework.org/schema/aop"
  xmlns:tx="http://www.springframework.org/schema/tx"
  xsi:schemaLocation="
   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
   http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd
   http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd">
 <bean id="customEditorConfigurer" class="org.springframework.beans.factory.config.CustomEditorConfigurer">
  <property name="customEditors">
   <map> 
    <entry key="java.util.Date">
     <bean class="cn.com.huixin.editor.DatePropertyEditor">
      <property name="format" value="yyyy-MM-dd"/>
     </bean> 
    </entry>
   </map>
  </property>
 </bean>
</beans>
 该文件中实例化了一个  org.springframework.beans.factory.config.CustomEditorCon
 figurer的对象,该类中有一个名为customEditors的Map对象,
 在该对象中添加了一个键值对,key属性值为java.util.Date,即
 类型转换的目标类型,value属性值为
 cn.com.huixin.editor.DatePropertyEditor,即我们编写的
 属性编辑器,这个类用来进行类型转换。在
 cn.com.huixin.editor.DatePropertyEditor类中有一个名为
 format的属性值,即日期格式,这里我们也对它进行了注入。到目前
 为止,我们的属性编辑器就编写好了,下来写一个类进行测试。测试
 代码如下所示:
package cn.com.huixin.test;
import org.springframework.beans.factory.BeanFactory;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import cn.com.huixin.spring.Bean1;
import junit.framework.TestCase;
public class BeanInject extends TestCase {
 private BeanFactory factory;
 @Override
 protected void setUp() throws Exception {
  factory = new ClassPathXmlApplicationContext("applicationContext*.xml");
 }
 public void testBean() {
  Bean1 bean1 = (Bean1) factory.getBean("bean1");
  System.out.println(bean1.getStringValue());
  System.out.println(bean1.getList1());
  System.out.println(bean1.getMap1());
  System.out.println(bean1.getArray());
  System.out.println(bean1.getBirthday());
 }
}
首先通过ClassPathXmlApplicationContext对象加载了以
applicationContext开头的xml文件,获得一个BeanFactory对
象,然后调用该对象的getBean()方法就可以获得为属性注入的值。
运行的结果为:
stringValue1
[listValue1, listValue2, listValue3]
{mapkey1=mapValue1, mapkey2=mapValue2}
[Ljava.lang.String;@1982fc1
Sat Jul 24 00:00:00 CST 2010

说明我们的值注入成功。

posted @ 2016-03-20 14:30  机智的程序员小熊  阅读(294)  评论(0编辑  收藏  举报