在Spring2.5中定制自己的属性编辑器-阿里云开发者社区

开发者社区> geekori> 正文

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

简介: 本文为原创,如需转载,请注明作者和出处,谢谢!     装配Bean是Spring的一个非常重要的功能。我们可以通过Spring在XML文件中配置Java Bean,然后通过ApplicationContext来获得Bean的对象实例。
+关注继续查看
本文为原创,如需转载,请注明作者和出处,谢谢!

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

<!--  要求Spring2.0或Spring2.5   scope="prototype"相当于Spring1.x的singleton="false" -->
<bean id="my" class="bean.MyClass" scope="prototype">
    
<constructor-arg>
    
<value>my value1</value>
    
</constructor-arg>
    
<property name="name">
    
<value>皮球</value>
    
</property>
    
<property name="myList">
    
<list>
        
<value>value1</value>
        
<value>value2</value>
    
</list>
    
</property>
</bean>

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

Contact


package bean;

public class Contact
{
    
private PhoneNumber phoneNumber;
    
public PhoneNumber getPhoneNumber()
    {
        
return phoneNumber;
    }
    
public void setPhoneNumber(PhoneNumber phoneNumber)
    {
        
this.phoneNumber = phoneNumber;
    }
}

PhoneNumber类

package bean;

public class PhoneNumber
{
    
private String number;
    
public PhoneNumber(String s)
    {
        
this.number = s;
    }
    
public String getNumber()
    {
        
return number;
    }
}

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

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="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/beans http://www.springframework.org/schema/beans/spring-beans-2.0.xsd
                http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.0.xsd"
>

    
<bean id="contact" class="bean.Contact">
        
<property name="phoneNumber">
            
<ref bean="phoneNumber"/>
        
</property>
    
</bean>
    
<bean id="phoneNumber" class="bean.PhoneNumber">
        
<constructor-arg>
            
<value>12345678</value>
        
</constructor-arg>
    
</bean>
</beans>

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

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

package editor;

public class PhoneEditor extends java.beans.PropertyEditorSupport
{
    @Override
    
public void setAsText(String text) throws IllegalArgumentException
    {        
        setValue(
new bean.PhoneNumber(text));
    }
}

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

<bean id="customerEditor"
        class
="org.springframework.beans.factory.config.CustomEditorConfigurer">
    
<property name="customEditors">
        
<map>
            
<entry key="bean.PhoneNumber">
                
<bean id="phoneEditor" class="editor.PhoneEditor"/>
            
</entry>
        
</map>
    
</property>
</bean>

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

<bean id="contact" class="bean.Contact">
    
<property name="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属性值:


import org.springframework.context.*;
import org.springframework.context.support.*;
public class Test
{
    
public static void main(String[] args)
    {
        
// 上面的配置代码都在applicationContext.xml文件中
        ApplicationContext context = new FileSystemXmlApplicationContext("src//applicationContext.xml");
        bean.Contact contact 
= (bean.Contact) context.getBean("contact");
        System.out.println(contact.getPhoneNumber().getNumber());
    }
}


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




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

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

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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
阿里云服务器怎么设置密码?怎么停机?怎么重启服务器?
如果在创建实例时没有设置密码,或者密码丢失,您可以在控制台上重新设置实例的登录密码。本文仅描述如何在 ECS 管理控制台上修改实例登录密码。
4012 0
bluePen – 使用在线 CSS 编辑器美化你的网站
  BluePen 是一款非常强大的样式编辑工具,甚至可以轻松地安装在一个动态的网站中。一旦你已经安装了它,你就可以在任何时间,任何地方修改样式表,一切修改将实时更新到您的浏览器(但不是线上网站),在按下“保存”按钮之后就可以发布出去。
645 0
富文本编辑器的技术演进之路
如果你的业务也将面向国际市场,面向移动端设备访问,不要犹豫了,Hugo.js 就是你最好的选择!
2505 0
阿里云服务器如何登录?阿里云服务器的三种登录方法
购买阿里云ECS云服务器后如何登录?场景不同,阿里云优惠总结大概有三种登录方式: 登录到ECS云服务器控制台 在ECS云服务器控制台用户可以更改密码、更换系.
5680 0
SpringMVC中原生态的Servlet属性
SpringMVC中支持原生态的HttpServletRequest和HttpServletResponse等等。 SpringMVCTest.java package com.hust.springmvc1; import java.io.IOException; import java.io.Writer; import javax.servlet.http.Ht
1040 0
【spring bean】spring中bean的懒加载和depends-on属性设置
项目结构如下:   ResourceBean.java代码: 1 package com.it.res; 2 3 import java.io.File; 4 import java.
814 0
+关注
geekori
欧瑞科技创始人&amp;CEO,东北大学计算机专业硕士,拥有超过20年软件开分经验。欧瑞学院金牌讲师、51CTO学院金牌讲师、CSDN学院特约讲师、畅销书作者,企业内训讲师。曾出版过超过30本IT畅销书,涉猎移动开发、跨平台开发、机器学习、区块链、大数据、编译器等领域。
419
文章
1
问答
文章排行榜
最热
最新
相关电子书
更多
文娱运维技术
立即下载
《SaaS模式云原生数据仓库应用场景实践》
立即下载
《看见新力量:二》电子书
立即下载