Spring中的属性编辑器能够自动的将String类型转化成需要的类型,例如一个类里面的一个整型属性,在配置文件中我们是通过String类型的数字进行配置的,这个过程中就需要一个转化操作,当然这个转化操作是由Spring来帮我们完成的,就是通过属性编辑器来操作的。

Spring具有多个自定义编辑器,它们能够自动把注入的String值转化为更复杂的类型

ClassEditor:能够实现将一个String值转化为java.lang.Class,其中String值包括一个完整的类名描述

CustomDateEditor:将一个String值转化为java.util.Date,其中String是使用的自定义的DateFormat对象

FileEditor:从一个String值设置java.io.File属性,String值中包含文件的路径

LocalEditor:从一个String值设置java.util.Locale,String值里面包含地域的文本信息

StringArrayPropertyEditor:把逗号分割的String转化为一个String数组属性

StringTrimmerEditor:对String属性进行自动裁剪,设置这个选项后,可以把空的String值转化为NULL

URLEditor:从一个String值设置为java.net.URL属性,String中包括一个URL

下面是一个自定义属性编辑器的例子

//一个普通的JavaBean
public class Person {
//人的名字
private String name;
private Phone phone;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Phone getPhone() {
return phone;
}
public void setPhone(Phone phone) {
this.phone = phone;
}
}

这个类里面有一个属性是电话,具体的定义如下:

//普通的PHONE类,也是一个JavaBean
public class Phone {
private String areaCode;
private String prefix;
private String number;
public Phone(String areaCode, String prefix, String number) {
super();
this.areaCode = areaCode;
this.prefix = prefix;
this.number = number;
}
public String getAreaCode() {
return areaCode;
}
public void setAreaCode(String areaCode) {
this.areaCode = areaCode;
}
public String getPrefix() {
return prefix;
}
public void setPrefix(String prefix) {
this.prefix = prefix;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}

对这个Phone生成一个字符串到Phone的转化类

public class PhoneEditor extends java.beans.PropertyEditorSupport{
@Override
public void setAsText(String text) throws IllegalArgumentException {
String stripped=stripNonNumeric(text);
String areaCode=stripped.substring(0,3);
String prefix=stripped.substring(3,6);
String number=stripped.substring(6);
Phone phone=new Phone(areaCode,prefix,number);
setValue(phone);
}
private String stripNonNumeric(String original){
StringBuffer allNumberic=new StringBuffer();
for(int i=0;i<original.length();i++){
char c=original.charAt(i);
if(Character.isDigit(c)){
allNumberic.append(c);
}
}
return allNumberic.toString();
}
}

配置文件如下:

<!-- 这里配置了自定义属性编辑器,Bean工厂在创建完后会自动将其注入 -->
<bean class="org.springframework.beans.factory.config.CustomEditorConfigurer">
<property name="CustomEditors">
<map>
<entry key="com.pp.Phone">
<bean id="phoneEditor" class="com.pp.PhoneEditor"></bean>
</entry>
</map>
</property>
</bean>
<bean id="test" class="com.pp.Person">
<property name="Name" value="ppTest"></property>
<!-- 在这里生成Bean对象时,会自动的将字符串转化成一个类 -->
<property name="Phone" value="888-555-1213"></property>
</bean>

测试文件如下:

		BeanFactory factory=new XmlBeanFactory(new ClassPathResource("person.xml"));
Person person=(Person)factory.getBean("test");
System.out.println(person.getName());
System.out.println(person.getPhone().getAreaCode());
System.out.println(person.getPhone().getPrefix());
System.out.println(person.getPhone().getNumber());

[置顶] Spring中自定义属性编辑器的更多相关文章

  1. [置顶] Spring中DI设置器注入

    Java的反射机制可以说是在Spring中发挥的淋漓尽致,下面要看的代码就是通过反射机制来实现向一个类注入其实际依赖的类型,这个过程的实现会交由Spring容器来帮我们完成. JavaBean中针对属 ...

  2. [置顶] Spring的DI依赖实现分析

    DI(依赖注入)是Spring最底层的核心容器要实现的功能之一,利用DI可以实现程序功能的控制反转(控制反转即程序之间之间的依赖关系不再由程序员来负责,而是由Spring容器来负责) 一个简单的例子( ...

  3. [置顶] NS2中TCP拥塞控制仿真过程中盲点解析

    最近利用NS2做TCP拥塞控制协议的仿真,发现很多变量的方法含义都是解释的不清楚,给核心模块修改带来很多麻烦,所以决定用最准确的语言解释成员变量.方法,术语等的含义.限于个人水平,若有错误请留言指正! ...

  4. [置顶] NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析--吐血放送

    NS2中对TCP数据包和ACK包的TCP Sink类的主要实现代码详尽剖析,限于个人水平,如有错误请留言指出! TcpSink类的recv()方法: void TcpSink::recv(Packet ...

  5. [置顶] spring集成mina 实现消息推送以及转发

    spring集成mina: 在学习mina这块时,在网上找了很多资料,只有一些demo,只能实现客户端向服务端发送消息.建立长连接之类.但是实际上在项目中,并不简单实现这些,还有业务逻辑之类的处理以及 ...

  6. [置顶] Spring的自动装配

    采用构造函数注入,以及setter方法注入都需要写大量的XML配置文件,这时可以采用另一种方式,就是自动装,由Spring来给我们自动装配我们的Bean. Spring提供了四种自动装配类型 1:By ...

  7. [置顶] Android中使用Movie显示gif动态图

    转载请注明:  http://blog.csdn.net/u012975705/article/details/48717391 在看这篇博文之前对attr自定义属性还是不是很熟的童鞋可以先看看:An ...

  8. [置顶] linux中fork()函数详解(原创!!实例讲解)

    分类: 计算机系统 linux2010-06-01 23:35 60721人阅读 评论(105) 收藏 举报 linux2010存储  一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源 ...

  9. [置顶] Jquery中DOM操作(详细)

    Jquery中的DOM操作 为了能全面的讲解DOM操作,首先需要构建一个网页. HTML代码: <%@ page language="java" import="j ...

随机推荐

  1. 【SQL】177. Nth Highest Salary

    Write a SQL query to get the nth highest salary from the Employee table. +----+--------+ | Id | Sala ...

  2. 1019 General Palindromic Number (20)(20 point(s))

    problem A number that will be the same when it is written forwards or backwards is known as a Palind ...

  3. Django-高级特性

    分页 1.固定显示分页数目 2.点击相应分页取出对应数据 具体实现: from django.utils.safestring import mark_safe class Pagination(ob ...

  4. 【WIN10】文本圖標

    在Storyboard動畫板中,我使用文本顯示了一個“心”形.在這裡,我將介紹一下文本圖標. 1.Segoe MDL2 Assets 首先,它必須使用字體:Segoe MDL2 Assets 其次,它 ...

  5. Needed Learning(Updating)

    决定把掌握不熟练或是模型见的少的知识点在这里列一列 希望能在自己AFO前成功get技能点吧…… 优先级:动态规划-分治-字符串-图论-数据结构-数学-计算几何-其它 动态规划 1.四边形不等式优化 2 ...

  6. [AGC016E]Poor Turkeys

    [AGC016E]Poor Turkeys 题目大意: 有\(n(n\le400)\)只火鸡,编号为\(1\)到\(n\),有\(m(m\le10^5)\)个人,每人指定了两只火鸡\(x\)和\(y\ ...

  7. CodeIgniter框架中关于URL重写(index.php)的二三事

    最近,在做自己的个人网站时,采用了轻量级的php框架CodeIgniter.乍一看上去,代码清晰简洁,MVC模型非常容易维护.开发时我采用的工具是Netbeans IDE 8.0,当然,本文的内容和开 ...

  8. Java并发(十七):ConcurrentHashMap

    先做总结: 1.HashMap HashTable ConcurrentHashMap HashMap:线程不安全 HashTable:线程安全,每个方法都加了 synchronized 修饰.类似 ...

  9. UVALive 4869 Profits DP

    G - Profits Time Limit:3000MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit Status ...

  10. UVALive 4867 Maximum Square 贪心

    E - Maximum Square Time Limit:4500MS     Memory Limit:0KB     64bit IO Format:%lld & %llu Submit ...