`
liuwei_blog
  • 浏览: 91430 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

关于Spring属性编辑器详解

阅读更多

最近刚在研究Spring 的编辑器,发现很有意思,刚好galaxystar起了一个这样贴,我想对PropertyEditor作一个详细的整理会对大家有益,特定启了这个新帖。
   
    所谓的PropertyEditor,顾名思义,就是属性编辑器。由于Bean属性通过配置文档以字符串了方式为属性赋值,所以必须有一个“东东”负责将这个字符串转换为属性的直接对象,如属性的类型为int,那么编辑器要做的工作就是int i = Integer.parseInt("1");
   Spring 为一般的属性类型提供了默认的编辑器,BeanWrapperImpl是Spring 框架中重要的类,它负责对注入的Bean进行包装化的管理,常见属性类型对应的编辑器即在该类中通过以下代码定义:

Java代码 复制代码
  1. private   void  registerDefaultEditors()   
  2.     {   
  3.          // Simple editors, without parameterization capabilities.   
  4.          // The JDK does not contain a default editor for any of these target types.   
  5.          this .defaultEditors.put( byte []. class new  ByteArrayPropertyEditor());   
  6.          this .defaultEditors.put(Class. class new  ClassEditor());   
  7.          this .defaultEditors.put(File. class new  FileEditor());   
  8.          this .defaultEditors.put(InputStream. class new  InputStreamEditor());   
  9.          this .defaultEditors.put(Locale. class new  LocaleEditor());   
  10.          this .defaultEditors.put(Properties. class new  PropertiesEditor());   
  11.          this .defaultEditors.put(Resource[]. class ,   
  12.                                  new  ResourceArrayPropertyEditor());   
  13.          this .defaultEditors.put(String[]. class new  StringArrayPropertyEditor());   
  14.          this .defaultEditors.put(URL. class new  URLEditor());   
  15.   
  16.          // Default instances of collection editors.   
  17.          // Can be overridden by registering custom instances of those as custom editors.   
  18.          this .defaultEditors.put(Collection. class ,   
  19.                                  new  CustomCollectionEditor(Collection. class ));   
  20.          this .defaultEditors.put(Set. class new  CustomCollectionEditor(Set. class ));   
  21.          this .defaultEditors.put(SortedSet. class ,   
  22.                                  new  CustomCollectionEditor(SortedSet. class ));   
  23.          this .defaultEditors.put(List. class new  CustomCollectionEditor(List. class ));   
  24.   
  25.          // Default instances of character and boolean editors.   
  26.          // Can be overridden by registering custom instances of those as custom editors.   
  27.         PropertyEditor characterEditor =  new  CharacterEditor( false );   
  28.         PropertyEditor booleanEditor =  new  CustomBooleanEditor( false );   
  29.   
  30.          // The JDK does not contain a default editor for char!   
  31.          this .defaultEditors.put( char . class , characterEditor);   
  32.          this .defaultEditors.put(Character. class , characterEditor);   
  33.   
  34.          //  Spring 's CustomBooleanEditor accepts more flag values than the JDK's default editor.   
  35.          this .defaultEditors.put( boolean . class , booleanEditor);   
  36.          this .defaultEditors.put(Boolean. class , booleanEditor);   
  37.   
  38.          // The JDK does not contain default editors for number wrapper types!   
  39.          // Override JDK primitive number editors with our own CustomNumberEditor.   
  40.         PropertyEditor byteEditor =  new  CustomNumberEditor(Byte. class false );   
  41.         PropertyEditor shortEditor =  new  CustomNumberEditor(Short. class false );   
  42.         PropertyEditor integerEditor =  new  CustomNumberEditor(Integer. class false );   
  43.         PropertyEditor longEditor =  new  CustomNumberEditor(Long. class false );   
  44.         PropertyEditor floatEditor =  new  CustomNumberEditor(Float. class false );   
  45.         PropertyEditor doubleEditor =  new  CustomNumberEditor(Double. class false );   
  46.   
  47.          this .defaultEditors.put( byte . class , byteEditor);   
  48.          this .defaultEditors.put(Byte. class , byteEditor);   
  49.   
  50.          this .defaultEditors.put( short . class , shortEditor);   
  51.          this .defaultEditors.put(Short. class , shortEditor);   
  52.   
  53.          this .defaultEditors.put( int . class , integerEditor);   
  54.          this .defaultEditors.put(Integer. class , integerEditor);   
  55.   
  56.          this .defaultEditors.put( long . class , longEditor);   
  57.          this .defaultEditors.put(Long. class , longEditor);   
  58.   
  59.          this .defaultEditors.put( float . class , floatEditor);   
  60.          this .defaultEditors.put(Float. class , floatEditor);   
  61.   
  62.          this .defaultEditors.put( double . class , doubleEditor);   
  63.          this .defaultEditors.put(Double. class , doubleEditor);   
  64.   
  65.          this .defaultEditors.put(BigDecimal. class ,   
  66.                                  new  CustomNumberEditor(BigDecimal. class false ));   
  67.          this .defaultEditors.put(BigInteger. class ,   
  68.                                  new  CustomNumberEditor(BigInteger. class false ));   
  69.     }  


   但是,并非Bean的属性都是这些常见的类型,如果你的Bean需要注入一个自定义类型的属性,而又想享受IoC的好处,那么就只得自己开干,提供一个自定义的PropertyEditor了。
   下面,分几个步骤来说明,定义一个自定义PropertyEditor的过程。
  1)首先,碰到的问题即是,要如何编辑自己的PropertyEditor,其实需要了解一点java.beans包的知识,在该包中,有一个java.beans.PropertyEditor的接口,它定义了一套接口方法(12个),即通过这些方法如何将一个String变成内部的一个对象,这两个方法是比较重要的:
    a)setValue(Object value) 直接设置一个对象,一般不直接用该方法设置属性对象
     b)setAsText(String text) 通过一个字符串来构造对象,一般在此方法中解析字符串,将构造一个
     类对象,调用setValue(Object)来完成属性对象设置操作。
 
  2)实现所有的接口方法是麻烦的,java.beans.PropertyEditorSupport 适时登场,一般情况下,我们通过扩展这个方便类即可。

  3)编写完后,就是在Spring 配置文件中注册该属性类型编辑器的问题,Spring 提供了专门的注册工具类
   org.springframework.beans.factory.config.CustomEditorConfigurer,它负责将属性类型和
   属性编辑器关联起来。到时BeanFactory注入Bean的属性时,即会在注册表中查找属性类型对应的编辑器。

  下面给出一个小例子,例子先作一个简单描述:
  1)Person 需要进行属性注入的Bean,有两个属性 一个是name,一个是address Address是一个类
  2)Address Person的属性类型,本身有3个属性。
  3)AddressPropertyEditor Address类型对应的属性编辑器。
 
  开工:
  1.Person.java

Java代码 复制代码
  1. package  com.stamen.propedit;   
  2.   
  3. import  org.apache.commons.lang.builder.ToStringBuilder;   
  4.   
  5.   
  6. public   class  Person {   
  7.      private  String name;   
  8.   
  9.      private  Address address;   
  10.   
  11.   
  12.      public  Address getAddress() {   
  13.          return  address;   
  14.     }   
  15.   
  16.      public   void  setAddress(Address address) {   
  17.          this .address = address;   
  18.     }   
  19.   
  20.      public  String getName() {   
  21.          return  name;   
  22.     }   
  23.   
  24.      public   void  setName(String name) {   
  25.          this .name = name;   
  26.     }   
  27.      public  String toString() {   
  28.          return  ToStringBuilder.reflectionToString( this );   
  29.     }   
  30.  }   



  2.Address.java

Java代码 复制代码
  1. package  com.stamen.propedit;   
  2. import  org.apache.commons.lang.builder.ToStringBuilder;   
  3. public   class  Address {   
  4.      private  String street;   
  5.   
  6.      private  String doorNum;   
  7.   
  8.      private  String postCode;   
  9.   
  10.      public  String getDoorNum() {   
  11.          return  doorNum;   
  12.     }   
  13.   
  14.      public   void  setDoorNum(String doorNum) {   
  15.          this .doorNum = doorNum;   
  16.     }   
  17.   
  18.      public  String getPostCode() {   
  19.          return  postCode;   
  20.     }   
  21.   
  22.      public   void  setPostCode(String postCode) {   
  23.          this .postCode = postCode;   
  24.     }   
  25.   
  26.      public  String getStreet() {   
  27.          return  street;   
  28.     }   
  29.   
  30.      public   void  setStreet(String street) {   
  31.          this .street = street;   
  32.     }   
  33.        
  34.      public  String toString() {   
  35.          return  ToStringBuilder.reflectionToString( this );   
  36.     }   
  37.   
  38. }   
  39.    


 
AddressPropertyEditor.java

Java代码 复制代码
  1. package  com.stamen.propedit;   
  2.   
  3. import  java.beans.PropertyEditorSupport;   
  4. import  java.util.Date;   
  5.   
  6. import  org.springframework.util.StringUtils;   
  7. public   class  AddressPropertyEditor  extends  PropertyEditorSupport{   
  8.      //支持的格式为 streeValue,doorNumValue,postCode   
  9.      public   void  setAsText(String text)   
  10.     {   
  11.         System.out.println( "使用自己的编辑器。" );   
  12.          if  (text ==  null  || !StringUtils.hasText(text)) {   
  13.              throw   new  IllegalArgumentException( "老大,不能为空啊!" );   
  14.         }   
  15.          else   
  16.         {   
  17.             String[] strArr = StringUtils.tokenizeToStringArray(text, "," );   
  18.             Address add =  new  Address();   
  19.             add.setStreet(strArr[ 0 ]);   
  20.             add.setDoorNum(strArr[ 1 ]);   
  21.             add.setPostCode(strArr[ 2 ]);   
  22.             setValue(add);   
  23.         }   
  24.     }   
  25.        
  26.      public  String getAsText()   
  27.     {   
  28.         Address add = (Address)getValue();   
  29.          return   "" +add;   
  30.     }   
  31. }   
  32.    



打开Spring 配置文件,添上这两个配置项:

Java代码 复制代码
  1.   <bean id= "customEditorConfigurer"    class = "org.springframework.beans.factory.config.CustomEditorConfigurer" >   
  2.   <property name= "customEditors" >   
  3.     <map>   
  4.       <entry key= "com.stamen.propedit.Address" > <!-- 属性类型 -->   
  5.         <bean  class = "com.stamen.propedit.AddressPropertyEditor" /> <!--对应Address的编辑器 -->   
  6.       </entry>   
  7.     </map>   
  8.   </property>   
  9. </bean>   
  10.   
  11.  <bean id= "person"   class = "com.stamen.propedit.Person" >   
  12.     <property name= "name"  value= "Tom" />   
  13.     <property name= "address"  value= "朝阳区,Soho 1601,010101" />   
  14.  </bean>  

 

分享到:
评论

相关推荐

    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 2.0 开发参考手册

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

    Spring.3.x企业应用开发实战(完整版).part2

    5.2.2 Spring默认属性编辑器 5.2.3 自定义属性编辑器 5.3 使用外部属性文件 5.3.1 使用外部属性文件 5.3.2 使用加密的属性文件 5.3.3 属性文件自身的引用 5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.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 chm文档

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

    Spring2.0学习笔记

    1、ICO环境的搭建 2、属性注入 3、自定义属性编辑器 4、AOP实现 5、事务处理 6、Spring事务配置的五种方式 详解 7、Struts与Spring集成方案

    Spring3.x企业应用开发实战(完整版) part1

    5.2.2 Spring默认属性编辑器 5.2.3 自定义属性编辑器 5.3 使用外部属性文件 5.3.1 使用外部属性文件 5.3.2 使用加密的属性文件 5.3.3 属性文件自身的引用 5.4 引用Bean的属性值 5.5 国际化信息 5.5.1 基础知识 5.5.2...

    springboot项目整合.zip

    第二篇:SpringBoot配置详解] 第三篇:SpringBoot日志配置] 第四篇:整合Thymeleaf模板] 第五篇:使用JdbcTemplate访问数据库] 第六篇:整合SpringDataJpa] 第七篇:整合Mybatis] 第八篇:通用Mapper与...

    Step By Step写测试(书签版).pdf

    《Step By Step写测试》介绍使用 JTESTER 写单元测试,作者吴大瑞,pdf 格式,大小 1.8MB。本书带有 pdf 书签,方便读者阅读。 目录: Jtester的项目配置 1 TestNG测试 ...7.6 使用SQL Editor编辑器 覆盖率统计

    本科毕业设计+基于Springboot+JPA+semantic开发的个人博客系统

    集成了markdown编辑器,markdown内容转化器,中文排版 项目框架: 前端 static :为js,css,images以及一些集成工具的样式 templates:分别为后台管理html,错误html,前台显示html 后端 依次是javabean,配置类...

    webx3框架指南PDF教程附学习Demo

    • 扩展性 —— Webx 3.0对Spring做了扩展,使Spring Bean不再是“bean”,而是升级成“组件”。一个组件可以扩展另一个组件,也可以被其它组件扩展。这种机制造就了Webx的非常好的扩展性,且比未经扩展的Spring更易...

    swing界面设计之JTree

    定义 bean 属性 21 创建 to-do 列表:创建一个可重用组件并在表中显示数据 23 创建一个可重用的面板 23 将 bean 组合在一起 24 添加一个表并重用这个面板 26 定义表模型 28 显示列表中的项 29 创建 to-do 列表:完成...

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

    平台分类器 11.8. 小结 12. Maven Assemblies 12.1. Introduction 12.2. Assembly Basics 12.2.1. Predefined Assembly Descriptors 12.2.2. Building an Assembly 12.2.3. Assemblies as Dependencies ...

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

    26 2.3 安装脚本详解 27 2.3.1 关于配置文件 30 2.3.2 关于依赖库 31 2.4 安装到JBoss 31 2.5 安装到Tomcat 32 2.6 基于Web的Signavio流程设计器 33 2.6.1 jBPM Web流程设计器简介 33 2.6.2 独立安装Signavio 34 ...

    asp.net知识库

    关于能自定义格式的、支持多语言的、支持多数据库的代码生成器的想法 发布Oracle存储过程包c#代码生成工具(CodeRobot) New Folder XCodeFactory3.0完全攻略--序 XCodeFactory3.0完全攻略--基本思想 XCodeFactory...

    平板显示发展史

    关于一个选择器XML的小程序 C++控制台计算器(能识别括号) Java面试宝典 VC写的蝴蝶会动的时钟 清华大学C语言课件【超详细_很强大】 Struts,Hibernate,Spring集成开发宝典.pdf asp.net mvc教程 jquery-ui-1.9.2....

    整理后java开发全套达内学习笔记(含练习)

    Iterator [java] 迭代器, 迭代程序 legal 合法的 ['li:gәl] log n.日志,记录 [lɒg] native (关键字) ?? ['neitiv] nested [java] 嵌套的 ['nestid] '如:内部类(nested classes) Object [java] 对象 ['ɒbdʒ...

Global site tag (gtag.js) - Google Analytics