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

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

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

<!--   要求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 时,就会给开发人员增加很多工作量。让我们先来举个例子。假设有两个类: Contact PhoneNumber Contact phoneNumber 属性的类型是 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 >

    从上面的代码可以看出,属性编辑器是使用了 CustomEditorConfigurer customEditors 属性进行安装的。这是一个 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开发速学宝典》出版,欢迎定购

目录
相关文章
|
6月前
|
存储 Java 数据安全/隐私保护
|
3月前
|
XML Java 数据格式
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
这篇文章是Spring5框架的实战教程,主要介绍了如何在Spring的IOC容器中通过XML配置方式使用外部属性文件来管理Bean,特别是数据库连接池的配置。文章详细讲解了创建属性文件、引入属性文件到Spring配置、以及如何使用属性占位符来引用属性文件中的值。
Spring5入门到实战------7、IOC容器-Bean管理XML方式(外部属性文件)
|
4月前
|
Java 测试技术 数据库
Spring Boot中的项目属性配置
本节课主要讲解了 Spring Boot 中如何在业务代码中读取相关配置,包括单一配置和多个配置项,在微服务中,这种情况非常常见,往往会有很多其他微服务需要调用,所以封装一个配置类来接收这些配置是个很好的处理方式。除此之外,例如数据库相关的连接参数等等,也可以放到一个配置类中,其他遇到类似的场景,都可以这么处理。最后介绍了开发环境和生产环境配置的快速切换方式,省去了项目部署时,诸多配置信息的修改。
|
5月前
|
XML druid Java
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
Spring5系列学习文章分享---第二篇(IOC的bean管理factory+Bean作用域与生命周期+自动装配+基于注解管理+外部属性管理之druid)
60 0
|
3月前
|
Java Spring 开发者
Spring 框架配置属性绑定大比拼:@Value 与 @ConfigurationProperties,谁才是真正的王者?
【8月更文挑战第31天】Spring 框架提供 `@Value` 和 `@ConfigurationProperties` 两种配置属性绑定方式。`@Value` 简单直接,适用于简单场景,但处理复杂配置时略显不足。`@ConfigurationProperties` 则以类级别绑定配置,简化代码并更好组织配置信息。本文通过示例对比两者特点,帮助开发者根据具体需求选择合适的绑定方式,实现高效且易维护的配置管理。
50 0
|
3月前
|
缓存 Java 数据库连接
Spring Boot 资源文件属性配置,紧跟技术热点,为你的应用注入灵动活力!
【8月更文挑战第29天】在Spring Boot开发中,资源文件属性配置至关重要,它让开发者能灵活定制应用行为而不改动代码,极大提升了可维护性和扩展性。Spring Boot支持多种配置文件类型,如`application.properties`和`application.yml`,分别位于项目的resources目录下。`.properties`文件采用键值对形式,而`yml`文件则具有更清晰的层次结构,适合复杂配置。此外,Spring Boot还支持占位符引用和其他外部来源的属性值,便于不同环境下覆盖默认配置。通过合理配置,应用能快速适应各种环境与需求变化。
43 0
|
5月前
|
运维 Java 测试技术
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
Spring运维之boo项目表现层测试加载测试的专用配置属性以及在JUnit中启动web服务器发送虚拟请求
46 3
|
5月前
|
运维 Java 关系型数据库
Spring运维之boot项目bean属性的绑定读取与校验
Spring运维之boot项目bean属性的绑定读取与校验
53 2
|
5月前
|
XML 运维 Java
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
Spring运维之boot项目打包jar和插件运行并且设置启动时临时属性和自定义配置文件
53 1
|
4月前
|
搜索推荐 C#
XAF 属性编辑器(PropertyEditor)- 原理篇
XAF Blazor 的 PropertyEditor 在 DEV 24.1.3 中经历了重大改进,更接近 WinForm。PropertyEditor 担任业务逻辑与各平台交互的角色,利用 INotifyPropertyChanged 监听属性变化。新版本弃用了 ComponentAdapter,代之以接口和基类,简化自定义编辑器的创建,降低了复杂度,同时增加了 ComponentModel 的 ComponentType 属性以自动化组件渲染和属性映射。这使得 Blazor 的 PropertyEditor 创建变得更为简便。