`
seara
  • 浏览: 654938 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

在Spring2.5中定制自己的属性编辑器

阅读更多
本文为原创,如需转载,请注明作者和出处,谢谢!

装配BeanSpring的一个非常重要的功能。我们可以通过SpringXML文件中配置Java Bean,然后通过ApplicationContext来获得Bean的对象实例。在配置Bean时,需要对构造方法的参数,属性进行初始化。对于Java简单类型或简单类型的ListMap等数据类型初始化非常简单,如下面就是一个对简单类型属性和构造方法参数进行初始化的配置代码:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><!--要求Spring2.0或Spring2.5scope="prototype"相当于Spring1.x的singleton="false"-->
<beanid="my"class="bean.MyClass"scope="prototype">
<constructor-arg>
<value>myvalue1</value>
</constructor-arg>
<propertyname="name">
<value>皮球</value>
</property>
<propertyname="myList">
<list>
<value>value1</value>
<value>value2</value>
</list>
</property>
</bean>

但对于复杂类型的属性或参数,如一个属性的类型是另外一个Java Class,这样就必须在配置文件中再声明这个Java Class,如果这种情况很多时,或是我们做的类要release时,就会给开发人员增加很多工作量。让我们先来举个例子。假设有两个类:ContactPhoneNumberContactphoneNumber属性的类型是PhoneNumber,代码如下:

Contact


<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->packagebean;

publicclassContact
{
privatePhoneNumberphoneNumber;
publicPhoneNumbergetPhoneNumber()
{
returnphoneNumber;
}
publicvoidsetPhoneNumber(PhoneNumberphoneNumber)
{
this.phoneNumber=phoneNumber;
}
}

PhoneNumber类

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->packagebean;

publicclassPhoneNumber
{
privateStringnumber;
publicPhoneNumber(Strings)
{
this.number=s;
}
publicStringgetNumber()
{
returnnumber;
}
}

如果直接在XML配置文件中装配Contact类,就需要先装配PhoneNumber类,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"
xmlns:tx
="http://www.springframework.org/schema/tx"
xsi:schemaLocation
="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans-2.0.xsd
http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
>

<beanid="contact"class="bean.Contact">
<propertyname="phoneNumber">
<refbean="phoneNumber"/>
</property>
</bean>
<beanid="phoneNumber"class="bean.PhoneNumber">
<constructor-arg>
<value>12345678</value>
</constructor-arg>
</bean>
</beans>

从上面的代码中可以看到,装载Contact的同时,也装载了PhoneNumber。但如果使用了属性编辑器,就可以无需装载PhoneNumber就可以装载Contact了。

编写自己的属性编辑器的步骤很简单,属性编辑器类需要从java.beans.PropertyEditorSupport类继承,在这个类中有一个setAsText方法,这个方法有一个String类型的参数,通过这个方法,可以将String类型的参数值转换成其他类型的属性。在这个方法中我们还需要使用一个setValue方法,就来指定转换后的对象实例。好,现在我们来实现这个简单的编辑器类,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> -->packageeditor;

publicclassPhoneEditorextendsjava.beans.PropertyEditorSupport
{
@Override
publicvoidsetAsText(Stringtext)throwsIllegalArgumentException
{
setValue(
newbean.PhoneNumber(text));
}
}

这个类的代码非常简单,在setAsText方法中只有一行代码,实际上只是建立一个PhoneNumber对象实例,并将text属性值作为参数值传入PhoneNumber的构造方法。接下来我们在配置文件中安装这个属性编辑器(实际上是装配org.springframework.beans.factory.config.CustomEditorConfigurer类),代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><beanid="customerEditor"
class
="org.springframework.beans.factory.config.CustomEditorConfigurer">
<propertyname="customEditors">
<map>
<entrykey="bean.PhoneNumber">
<beanid="phoneEditor"class="editor.PhoneEditor"/>
</entry>
</map>
</property>
</bean>

从上面的代码可以看出,属性编辑器是使用了CustomEditorConfigurercustomEditors属性进行安装的。这是一个Map类型的属性。key的值必须是属性编辑器最终转换后的类型名,如在本例中,要将文本的参数值转换成bean.PhoneNumber类型的值,因此,key必须为bean.PhoneNumber下面我们来使用PhoneEditor属性编辑器类来装配Contact类,代码如下:

<!--<br /> <br /> Code highlighting produced by Actipro CodeHighlighter (freeware)<br /> http://www.CodeHighlighter.com/<br /> <br /> --><beanid="contact"class="bean.Contact">
<propertyname="phoneNumber">
<value>87654321</value>
</property>
</bean>

也许大家都注意到了上面这段代码的变化,在设置phoneNumber属性默认值时,不再使用<ref>标签来引用phoneNumber对象,而是直接使用了<value>来设置一个文本的电话号。Spring当遇到这种情况时,也就是说,某个属性值和属性类型不一致时(如本例中一个是文本,一个是PhoneNumber类型),会先找一下属性类型是否有相应的属性编辑器已经被安装,在本例中将以bean.PhoneNumber作为key来查找,正好找到上面安装的PhoneEditor,因此,Spring就会调用PhoneEditor类中的setAsValue方法来设置PhoneNumber对象实例,然后Spring在内部又分调用getValue来获得PhoneNumber对象实例,并将其赋给ContactphoneNumber属性。其实所有类型的bean.PhoneNumber的属性都可以使用这个属性编辑器。

大家可以看看,这样做是不是简单的多!尤其是在发布通用的framework或程序时,就更为简单了。在Spring中已经定义了很多这种属性编辑器,如我们可以使用org.springframework.beans.propertyeditors.URLEditor将字符串映射成java.net.URL对象。下面的代码通过ApplicationContext来获得Contact的对象实例,并输出其phoneNumber属性值:


importorg.springframework.context.*;
importorg.springframework.context.support.*;
publicclassTest
{
publicstaticvoidmain(String[]args)
{
//上面的配置代码都在applicationContext.xml文件中
ApplicationContextcontext=newFileSystemXmlApplicationContext("src\\applicationContext.xml");
bean.Contactcontact
=(bean.Contact)context.getBean("contact");
System.out.println(contact.getPhoneNumber().getNumber());
}
}


注:实际上,属性编辑器本身是由Java提供了,Spring只是利用了这一特性使装配一个Bean更容易而已。




国内最棒的Google Android技术社区(eoeandroid),欢迎访问!

《银河系列原创教程》发布

《Java Web开发速学宝典》出版,欢迎定购

分享到:
评论

相关推荐

    最新Hibernate3[1].2_+_Spring_2.5_+_Struts_2.1_整合开发手册

    ### 最新Hibernate3.2+Spring2.5+Struts2.1整合开发手册 #### 概述 本文档旨在详细介绍如何使用最新的Hibernate 3.2、Spring 2.5和Struts 2.1进行整合开发。通过这种方式,开发者可以更好地理解这三种技术之间的...

    Spring-Reference_zh_CN(Spring中文参考手册)

    5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建的...

    Spring中文帮助文档

    5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建...

    Spring API

    5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建...

    Spring 2.0 开发参考手册

    5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建...

    spring.net中文手册在线版

    Spring.NET是一个应用程序框架,其目的是协助开发人员创建企业级的.NET应用程序。它提供了很多方面的功能,比如依赖注入、面向方面编程(AOP)、数据访问抽象及ASP.NET扩展等等。Spring.NET以Java版的Spring框架为...

    Spring攻略(第二版 中文高清版).part1

    6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4...

    spring chm文档

    5. 校验,数据绑定,BeanWrapper,与属性编辑器 5.1. 简介 5.2. 使用Spring的Validator接口进行校验 5.3. 从错误代码到错误信息 5.4. Bean处理和BeanWrapper 5.4.1. 设置和获取属性值以及嵌套属性 5.4.2. 内建...

    Spring攻略(第二版 中文高清版).part2

    6.2 在你的Servlet和过滤器中使用Spring 214 6.2.1 问题 214 6.2.2 解决方案 215 6.2.3 工作原理 215 6.3 将Spring与Struts 1.x集成 220 6.3.1 问题 220 6.3.2 解决方案 220 6.3.3 工作原理 220 6.4...

    JAVA程序开发大全---上半部分

    3.2 MyEclipse中的Java代码编辑器 43 3.2.1 Java代码编辑器基本功能 43 3.2.2 自定义Java代码编辑器 45 3.2.3 Java代码编辑器相关视图 50 3.3 MyEclipse中的Java代码编译器 51 3.4 MyEclipse中的Java代码调试器 52 ...

    Maven权威指南 很精典的学习教程,比ANT更好用

    2.5. Maven安装细节 2.5.1. 用户相关配置和仓库 2.5.2. 升级Maven 2.6. 获得Maven帮助 2.7. 使用Maven Help插件 2.7.1. 描述一个Maven插件 2.8. 关于Apache软件许可证 I. Maven实战 3. 一个简单的...

    MyEclipse 6 Java EE 开发中文手册

    - **创建Spring项目**:在MyEclipse中创建新的Spring项目。 - **配置Spring环境**:设置Spring所需的库文件和配置文件。 **14.3 开发Spring应用** - **编写Bean**:定义Spring管理的Bean。 - **配置...

    JBoss jBPM jPDL中文指南

    ##### 2.5 JBoss jBPM Job执行器 - **Job执行器** 用于调度和执行异步任务,例如定时任务或外部系统调用。 - 它支持多种类型的作业,并且可以通过配置进行扩展。 #### 三、jBPM jPDL安装与配置 ##### 3.1 下载包...

    JBPM4工作流应用开始指南.rar

    35 2.8 安装jBPM数据库 35 2.8.1 新数据库安装 36 2.8.2 升级旧的数据库 36 2.9 安装图形化流程设计器(GPD) 37 2.9.1 获取Eclipse 37 2.9.2 在Eclipse中安装GPD插件 37 2.9.3 配置jBPM运行环境 38 2.9.4 添加jPDL4...

Global site tag (gtag.js) - Google Analytics