`
hl756799782
  • 浏览: 77496 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Spring属性编辑器解读(转载)

阅读更多
Spring DI注入的时候可以把普通属性注入进来,但是像Date类型的就无法被识别。这时可以通过Spring的属性编辑器把配置文件中的字符串转化成相应的对象进行注入。


Spring有自带的属性编辑器,我们也可以写自定义的属性编辑器


自定义属性编辑器:


继承java.beans.PropertyEditorSupport类,重写其中的setAsText(String text)方法。


再把自定义的属性编辑器注入到Spring中。

 

下面,分几个步骤来说明,定义一个自定义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)UserBean 需要进行属性注入的Bean,一个Date类型的属性。 
  2)DatePropertyEditor Date类型对应的属性编辑器。 
 

 

例子:

 

JavaBean类

 

Java代码

package com.cos.entity;        
       
import java.util.Date;        
import java.util.List;        
import java.util.Map;        
import java.util.Set;        
       
public class UserBean {        
       
    private Date birthday;        
       
    public Date getBirthday() {        
        return birthday;        
    }        
       
    public void setBirthday(Date birthday) {        
        this.birthday = birthday;        
    }        
}

 

自定义属性编辑器

 

Java代码

 

package com.cos.entity;        
       
import java.beans.PropertyEditorSupport;        
import java.text.ParseException;        
import java.text.SimpleDateFormat;        
       
//自己写一个自定义属性编辑器来继承属性编辑器PropertyEditorSupport        
public class DatePropertyEditor extends PropertyEditorSupport {        
       
    //时间的格式        
    String format;        
       
    public String getFormat() {        
        return format;        
    }        
       
    public void setFormat(String format) {        
        this.format = format;        
    }        
       
    //需要重写属性编辑器的setAsText()方法        
    @Override       
    public void setAsText(String text) {        
        try {        
            SimpleDateFormat f = new SimpleDateFormat(format);        
            //把转换后的值传进去        
            this.setValue(f.parse(text));        
        } catch (ParseException ex) {        
            ex.printStackTrace();        
        }        
    }        
}    

 

 

spring配置文件 applicationContext.xml :

 

Xml代码

 

<beans xmlns="http://www.springframework.org/schema/beans"       
    xmlns:jdbc="http://www.springframework.org/schema/jdbc"       
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"       
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd        
        http://www.springframework.org/schema/jdbc http://www.springframework.org/schema/jdbc/spring-jdbc-3.0.xsd">       
       
    <!-- 普通属性注入 -->       
    <bean id="userBean" class="com.cos.entity.UserBean">       
        <!-- 时间属性,需要属性编辑器 -->       
        <property name="birthday" value="2011-03-16"/>       
    </bean>       
       
    <!-- 特殊属性的注入.把特殊属性注入到CustomEditorConfigurer Bean 里 -->       
    <bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">       
        <property name="customEditors">       
            <map>       
                <entry key="java.util.Date">       
                    <bean class="com.cos.entity.DatePropertyEditor">       
                        <property name="format" value="yyyy-MM-dd"/>       
                    </bean>       
                </entry>       
            </map>       
        </property>       
    </bean>       
</beans>    

 

 

org.springframework.beans.factory.config.CustomEditorConfigurer类可以读取PropertyEditorSupport类及子类,将字符串转化为指定的类型。

 

PropertyEditorSupport类把要转化的Date类型注入到customEditors Map中。

 

测试类:

 

Java代码

 

package com.cos.entity;        
       
import org.springframework.beans.factory.BeanFactory;        
import org.springframework.context.support.ClassPathXmlApplicationContext;        
       
public class Main {        
       
    public static void main(String[] args) {        
        //通过spring配置文件返回Bean的工厂对象        
        BeanFactory factory = new ClassPathXmlApplicationContext("applicationContext.xml");        
        //Bean工厂通过Bean的id得到JavaBean        
        UserBean ub = (UserBean) factory.getBean("userBean");        
        System.out.println(""+ub.getBirthday());        
    }        
}  

 

示例2:

  1)Person 需要进行属性注入的Bean,有两个属性 一个是name,一个是address Address是一个类
  2)Address Person的属性类型,本身有3个属性。
  3)AddressPropertyEditor Address类型对应的属性编辑器。

 

1.Person.java

package com.stamen.propedit;   
  
import org.apache.commons.lang.builder.ToStringBuilder;   
  
  
public class Person {   
    private String name;   
  
    private Address address;   
  
  
    public Address getAddress() {   
        return address;   
    }   
  
    public void setAddress(Address address) {   
        this.address = address;   
    }   
  
    public String getName() {   
        return name;   
    }   
  
    public void setName(String name) {   
        this.name = name;   
    }   
    public String toString() {   
        return ToStringBuilder.reflectionToString(this);   
    }   
 } 

 

2.Address.java

 

package com.stamen.propedit;   
import org.apache.commons.lang.builder.ToStringBuilder;   
public class Address {   
    private String street;   
  
    private String doorNum;   
  
    private String postCode;   
  
    public String getDoorNum() {   
        return doorNum;   
    }   
  
    public void setDoorNum(String doorNum) {   
        this.doorNum = doorNum;   
    }   
  
    public String getPostCode() {   
        return postCode;   
    }   
  
    public void setPostCode(String postCode) {   
        this.postCode = postCode;   
    }   
  
    public String getStreet() {   
        return street;   
    }   
  
    public void setStreet(String street) {   
        this.street = street;   
    }   
       
    public String toString() {   
        return ToStringBuilder.reflectionToString(this);   
    }   
  
}   

 

AddressPropertyEditor.java

package com.stamen.propedit;   
  
import java.beans.PropertyEditorSupport;   
import java.util.Date;   
  
import org.springframework.util.StringUtils;   
public class AddressPropertyEditor extends PropertyEditorSupport{   
    //支持的格式为 streeValue,doorNumValue,postCode   
    public void setAsText(String text)   
    {   
        System.out.println("使用自己的编辑器。");   
        if (text == null || !StringUtils.hasText(text)) {   
            throw new IllegalArgumentException("老大,不能为空啊!");   
        }   
        else  
        {   
            String[] strArr = StringUtils.tokenizeToStringArray(text,",");   
            Address add = new Address();   
            add.setStreet(strArr[0]);   
            add.setDoorNum(strArr[1]);   
            add.setPostCode(strArr[2]);   
            setValue(add);   
        }   
    }   
       
    public String getAsText()   
    {   
        Address add = (Address)getValue();   
        return ""+add;   
    }   
}   

 

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

  <bean id="customEditorConfigurer"  class="org.springframework.beans.factory.config.CustomEditorConfigurer">   
  <property name="customEditors">   
    <map>   
      <entry key="com.stamen.propedit.Address"> <!-- 属性类型 -->   
        <bean class="com.stamen.propedit.AddressPropertyEditor"/> <!--对应Address的编辑器 -->   
      </entry>   
    </map>   
  </property>   
</bean>   
  
 <bean id="person" class="com.stamen.propedit.Person">   
    <property name="name" value="Tom"/>   
    <property name="address" value="朝阳区,Soho 1601,010101"/>   
 </bean>  

 
本文参考了部分学友的文章,原文地址:http://nathanyu.iteye.com/blog/1001814http://www.iteye.com/topic/24660,谢谢这2位朋友的贡献,非常感谢,好人一生平安!

分享到:
评论

相关推荐

    spring 自定义属性编辑器

    在Spring框架中,属性编辑器(PropertyEditor)是一种强大的工具,允许我们自定义类型转换过程。当我们需要将字符串形式的数据转换为Java对象时,属性编辑器就发挥了关键作用。例如,从请求参数或配置文件中读取的...

    spring中的自定义属性编辑器

    在Spring框架中,属性编辑器(PropertyEditor)扮演着至关重要的角色。它们是JavaBeans规范的一部分,用于在Java对象和其字符串表示之间进行转换。在Spring中,我们可以通过自定义属性编辑器来处理特定类型的值,...

    spring2.0(三) 自定义属性编辑器

    在Spring 2.0框架中,自定义属性编辑器(Custom Property Editor)是一个重要的功能,它允许开发者扩展Spring的默认属性绑定机制,以处理特定类型的转换。本文将深入探讨这一特性,结合源码分析和实际应用,帮助你...

    Spring学习笔记(11)----自定义属性编辑器

    在Spring框架中,属性编辑器(PropertyEditor)扮演着至关重要的角色。它们是JavaBeans规范的一部分,用于在Java对象和字符串之间进行数据转换。在Spring中,属性编辑器被广泛应用于IoC容器,用于处理配置文件中的...

    spring自定义编辑器

    ### Spring自定义编辑器详解 #### 一、引言 在Spring框架中,自定义编辑器主要用于处理数据类型的转换问题,特别是在将用户输入的数据转换为Java对象时非常有用。例如,用户通过表单提交了一个日期格式的字符串,...

    浅谈Spring的属性编辑器的使用

    在Spring框架中,属性编辑器(PropertyEditor)是一个关键组件,它负责将配置文件中非标准格式的数据转换为JavaBean的可识别类型。属性编辑器是基于JavaBeans规范的,因此理解这个概念需要先了解JavaBean和JavaBeans...

    spring 属性参考与自动绑定

    《Spring属性参考与自动绑定详解》 在Java的Spring框架中,属性参考和自动绑定是两个重要的概念,它们为开发者提供了灵活且强大的依赖注入机制。本文将深入解析这两个概念,并通过示例代码来阐述其工作原理。 ### ...

    springmvc自定义属性编辑器和参数解析器

    在Spring MVC框架中,属性编辑器(PropertyEditor)和参数解析器(HandlerMethodArgumentResolver)是两个关键组件,用于处理数据转换和模型绑定的过程。它们是实现灵活性和扩展性的重要手段,尤其在处理用户输入...

    spring编辑器

    标题 "spring编辑器" 暗示我们讨论的是与Spring框架相关的开发工具,可能是用于编辑、配置或调试Spring应用的工具。描述中的链接指向了一篇2019年的博客文章,但无法直接访问以获取详细信息。不过,我们可以基于...

    spring-aop源码解读

    Spring AOP(面向切面编程)是Spring框架的重要组成部分,它允许程序员在不修改源代码的情况下,通过添加额外的行为(即“切面”)来增强应用程序的功能。在Spring AOP中,主要有三个核心概念:Advice、Pointcut和...

    Spring IOC源码解读

    BeanDefinition是Spring中用于描述Bean实例的关键数据结构,包含了Bean的属性、依赖对象、构造器参数等信息。而ApplicationContext则是一种更高级的容器,除了提供BeanFactory的基本功能外,还增加了许多面向框架的...

    自定义属性编辑及Spring处理器映射

    java中的属性编辑器详细说明及Spring中AnnotationMethodHandlerAdapter说明和DefaultAnnotationHandlerMapping的说明及用法

    spring bean 属性总结

    ### Spring Bean 属性详解 Spring框架是Java平台上的一个开源框架,主要用来简化企业级应用程序的开发。在Spring中,核心概念之一就是Bean,它是一个简单的Java对象,由Spring IoC容器管理。Spring通过XML配置文件...

    Spring属性注入

    在Spring中,属性注入(Property Injection)是一种重要的功能,它允许开发者在不直接创建对象的情况下设置对象的属性,从而实现了松耦合和更好的可测试性。 **XML方式的属性注入** 1. **Set注入**:这是Spring ...

    springcloud 源码+解读

    SpringCloud是中国最流行的微服务框架之一,它基于Spring Boot构建,提供了一系列的工具来简化分布式系统开发,如服务发现、负载均衡、断路器、API网关等。本资源包含SpringCloud的源码以及相关的解读,是深入理解其...

    spring 的属性管理

    标题中的“Spring的属性管理”指的是Spring框架中用于管理和注入应用程序配置属性的机制。Spring作为一个广泛应用的Java企业级开发框架,提供了多种方式来处理和管理应用程序的属性,这些属性通常包含数据库连接信息...

    spring 普通属性注入

    在Spring框架中,属性注入是核心特性之一,它允许我们通过依赖注入(Dependency Injection, DI)来管理对象的属性,而不是让对象自行创建或查找它们的依赖。这有助于提高代码的可测试性、可维护性和解耦性。下面将...

    Spring视频教程(1)

    此外,"009_Spring属性编辑器.avi"和"011_Spring属性编辑器_日期格式可配置_多文件读取方式.avi"将讲解Spring属性编辑器的用法,如何处理复杂类型的属性注入,如日期格式化和文件操作。 "010_上午内容回顾.avi"是对...

    菜鸟 Spring 源码解读 推荐流程

    Spring框架是Java开发中广泛应用的一个开源...总之,Spring源码解读是一项艰巨但极其有价值的任务,对于提升编程技巧和深入理解软件设计都有极大的帮助。作为"菜鸟",不要畏惧,逐步深入,你将收获满满的知识和经验。

Global site tag (gtag.js) - Google Analytics