在spring实例化bean的最后阶段,spring利用属性编辑器将配置文件中的文本配置值转换为bean属性的对应值,例如:

代码001
1 <bean id="car" class="com.mesopotamia.test1.Car"
p:name="汽车"
p:brand="宝马"
p:maxSpeed="200"/>

上面是文本配置,

再看bean:

代码002
1 public class Car {
private String name;
private String brand;
private double maxSpeed;
。。。

上面是bean的属性。

那么,代码001中"汽车"、"宝马"、"200"是简单的值,并没有标明类型,如:String、double等,这就是字面值,那么把代码001中的这些"字面值"转换成代码002中Car类的具体属性值,就是属性编辑器的工作。

在介绍spring的属性编辑器之前,有必要了解一下javabean的属性编辑器。

Sun所制定的JavaBean规范,很大程度是为IDE准备的。(IDE:Integrated Development Environment,集成开发环境,一般包括代码编辑器编译器、调试器和图形用户界面工具)。JavaBean的属性编辑器就是IDE的得力助手。

与spring的属性编辑不同,IDE通过属性编辑器利用可视化的方式来编辑组件的属性。

一般来说,完成JavaBean的属性编辑工作需要三个重要部分:

  1. Bean类。当然了,属性编辑就是为了设置bean的属性值,所以,东道主必须在。
  2. BeanInfo。通过它我们可以知道,bean的哪些属性可以编辑,bean的每个属性对应的属性编辑器是哪个。(就好像老王家有四个闺女,分别喜欢琴、棋、书、画,那么老王想要分别培养这四个闺女,就把大闺女送到琴社,二闺女送到棋坊,三闺女送到书院,四闺女送到画楼。这四个闺女就是四个需要编辑的属性,而琴社、棋坊、书院、画楼就是四个不同的属性编辑器。)
  3. PropertyEditor。它通过Bean类知道我要编辑的是该bean的属性,通过BeanInfo知道我要编辑哪个属性。它负责对这个属性进行编辑(转换)。

下面看一个具体的栗子:

Bean类如下:

 public class ChartBean extends JPanel{
private int titlePosition = CENTER;
private boolean inverse;
//省略get/setter方法
}

JPanel 是 Java图形用户界面(GUI)工具包swing中的面板容器类,包含在javax.swing 包中,是一种轻量级容器,可以加入到JFrame窗体中。如果一个Bean继承了JPanel,那么意味着我们可以通过可视化的图形界面对bean的属性进行编辑。

BeanInfo如下:

 import java.beans.*;
public class ChartBeanBeanInfo extends SimpleBeanInfo{
public PropertyDescriptor[] getPropertyDescriptors() {
try{ //①将TitlePositionEditor绑定到ChartBean的titlePosition属性中
PropertyDescriptor titlePositionDescriptor
= new PropertyDescriptor("titlePosition", ChartBean.class);
titlePositionDescriptor.setPropertyEditorClass(TitlePositionEditor.class); //②将InverseEditor绑定到ChartBean的inverse属性中
PropertyDescriptor inverseDescriptor
= new PropertyDescriptor("inverse", ChartBean.class);
inverseDescriptor.setPropertyEditorClass(InverseEditor.class);
return new PropertyDescriptor[]{titlePositionDescriptor, inverseDescriptor};
}
catch (IntrospectionException e){
e.printStackTrace();
return null;
}
}
}

对于上面的BeanInfo类,有下面几点需要了解:

  1. JavaBean中的BeanInfo命名规则:bean的类名+BeanInfo,如:ChartBean+BeanInfo。
  2. SimpleBeanInfo实现了BeanInfo类,一般情况下,通过扩展该类实现自己的功能。
  3. 一个属性描述器(PropertyDescriptor)记录了一个属性和该属性隶属的bean类。
  4. 第7、8行,BeanInfo把属性和bean绑定起来塞到一个PropertyDescriptor对象中。
  5. 紧接着第9行,把绑定了属性和bean类的属性描述器与特定的属性编辑器(如本例:TitlePositionEditor)连接起来。

12行后面是另一个属性的操作,与上面描述类似。

下面是属性编辑器类:

 import java.beans.*;
public class TitlePositionEditor extends PropertyEditorSupport{
private String[] options = { "Left", "Center", "Right" }; //①代表可选属性值的字符串标识数组
public String[] getTags() { return options; } //②代表属性初始值的字符串
public String getJavaInitializationString() { return "" + getValue(); } //③将内部属性值转换为对应的字符串表示形式,供属性编辑器显示之用
public String getAsText(){
int value = (Integer) getValue();
return options[value];
} //④将外部设置的字符串转换为内部属性的值
public void setAsText(String s){
for (int i = 0; i < options.length; i++){
if (options[i].equals(s)){
setValue(i);
return;
}
}
}
}
 
PropertyEditorSupport定义了一些属性编辑的方法,一般情况下通过扩展该类来定义自己的属性编辑器。我们可以根据下面图形界面的结果来了解上面TitlePositionEditor 的方法:


  1. 第六行,getTags()获取的就是属性编辑界面与某个属性对应的下拉框选择,代码中返回的是opertions字符串数组,渲染到操作界面上如上图的下拉框:Left、Center、Right等。
  2. 第9行,getJavaInitializationString()是设置编辑的初始值。getValue()是获取当前属性的当前值。Bean类的第二行代码:private int titlePosition = CENTER,设置了titlePosition的初始值为CENTER(注意这是一个常量),那么getValue()返回的就是CENTER这个值对应的封装类实例。(把基本类型封装成Object对象来存储)。而getJavaInitializationString()获取了这个初始值,所以,我们看到图形界面下拉框的默认值为Center。就好像html的下拉框一样:
     <select>
    <option value="0">Left</option>
    <option value="1" selected>Center</option>
    <option value="2">Right</option>
    </select>
  3. 第12行,就比如说像上面的html一样,属性的值其实是"1",但是,"1"代表的是Center,所以getAsText()就是根据属性值"1"转换成对应的字符串"Center",这样的话,界面上的下拉框中就显示的是字符串Center,而不是"1"。getAsText()就是为了帮助图形化界面的显示的。
  4. 第18行,当我们用下拉框选择了Right,那么需要把Right转换为对应的属性值(比如,2),这样才能赋值给bean的titlePosition属性,setAsText就是为了这样的转换。
  5. 结合12、18行我们知道,这其实是个双向的过程,编辑器拿到属性的可选值以及当前值,转换成对应的字符串放到下拉框里供使用人员来选择,选择好了之后,编辑器把选择的字符串值转换成对应的属性值,赋值给bean的属性。而getValue()负责获取当前属性的值。这个过程就是属性编辑器的工作机制。
 

spring的属性编辑器没有UI界面,它仅负责将配置文件中的字面值转换成bean的属性值,因此,工作机制也不等同于java bean的属性编辑器。但了解了java bean的属性编辑器,再去理解spring属性编辑器的工作机制,那就是分分钟搞定的事情了。预知后事如何,请听下回分解。

    

        百学须先立志。――朱熹

(spring-第12回【IoC基础篇】)JavaBean的属性编辑器的更多相关文章

  1. (spring-第13回【IoC基础篇】)PropertyEditor(属性编辑器)--实例化Bean的第五大利器

    上一篇讲到JavaBeans的属性编辑器,编写自己的属性编辑器,需要继承PropertyEditorSupport,编写自己的BeanInfo,需要继承SimpleBeanInfo,然后在BeanIn ...

  2. Spring+SpringMVC+MyBatis+easyUI整合基础篇(六)maven整合SSM

    写在前面的话   承接前文<Spring+SpringMVC+MyBatis+easyUI整合基础篇(五)讲一下maven>,本篇所讲述的是如何使用maven与原ssm项目整合,使得一个普 ...

  3. Spring+SpringMVC+MyBatis+easyUI整合基础篇(八)mysql中文查询bug修复

    写在前面的话 在测试搜索时出现的问题,mysql通过中文查询条件搜索不出数据,但是英文和数字可以搜索到记录,中文无返回记录.本文就是写一下发现问题的过程及解决方法.此bug在第一个项目中点这里还存在, ...

  4. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十一)SVN服务器进阶

    日常啰嗦 上一篇文章<Spring+SpringMVC+MyBatis+easyUI整合基础篇(十)SVN搭建>简单的讲了一下SVN服务器的搭建,并没有详细的介绍配置文件及一些复杂的功能, ...

  5. Spring+SpringMVC+MyBatis+easyUI整合基础篇(十二)阶段总结

    不知不觉,已经到了基础篇的收尾阶段了,看着前面的十几篇文章,真的有点不敢相信,自己竟然真的坚持了下来,虽然过程中也有过懒散和焦虑,不过结果还是自己所希望的,克服了很多的问题,将自己的作品展现出来,也发 ...

  6. Spring+SpringMVC+MyBatis+easyUI整合基础篇

    基础篇 Spring+SpringMVC+MyBatis+easyUI整合基础篇(一)项目简介 Spring+SpringMVC+MyBatis+easyUI整合基础篇(二)牛刀小试 Spring+S ...

  7. (spring-第2回【IoC基础篇】)Spring的Schema,基于XML的配置

    要深入了解Spring机制,首先需要知道Spring是怎样在IoC容器中装配Bean的.而了解这一点的前提是,要搞清楚Spring基于Schema的Xml配置方案. 在深入了解之前,必须要先明白几个标 ...

  8. (spring-第5回【IoC基础篇】)spring容器从加载配置文件到实例化bean的内部工作机制

    前面讲过,spring的生命周期为:实例化前奏-->实例化-->实例化后期-->初始化前期-->初始化-->初始化后期-->bean的具体调用-->销毁前-- ...

  9. (spring-第11回【IoC基础篇】)BeanWrapper--实例化Bean的第四大利器

    重复是理解和记忆的最好方法.在讲实例化Bean的每个步骤之前,我都会先复习一下Bean实例化的整个过程: 结合图片我们回顾一下具体的过程: ResourceLoader加载配置信息, 由BeanDef ...

随机推荐

  1. WPF:ListView数据绑定及Style

    DrugRecordsWin.xaml <ListView Grid.Row="4" Grid.Column="1" Name="list_Dr ...

  2. 你不知道的JavaScript--面向对象高级程序设计

    转载http://blog.csdn.net/i10630226/article/details/51088841 1. JS是基于原型的程序 建立一个简单的面向对象的类.有属性,有方法. funct ...

  3. Eclipse启动tomcat 报“ A child container failed during start”

    org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]   at org.ap ...

  4. Nodejs异步异常处理domain

    前言 程序开发中,最麻烦的事情之一就是异常处理:对于Nodejs程序开发,最麻烦的事情莫过于异步异常处理. 以MVC的多层架构设计角度,异常总是要一层一层向上抛出,最后在客户端出打印错误.但是,Nod ...

  5. Java多线程-新特性-线程池

    Sun在Java5中,对Java线程的类库做了大量的扩展,其中线程池就是Java5的新特征之一,除了线程池之外,还有很多多线程相关的内容,为多线程的编程带来了极大便利.为了编写高效稳定可靠的多线程程序 ...

  6. 六种流行的语言---C、C++、python、Java、php、C#比较[转]

    语言大餐 回归正题,本文是六种语言连接mysql数据库的代码展示,在LZ尝试的过程中,无论是语言环境搭建.mysql依赖库的导入还是代码的风格,各种语言都各有千秋.接下来,我们就让这些语言一一登场吧. ...

  7. 闲聊CSS之关于clearfix--清除浮动[转]

    .clearfix:after { content: " "; display: block; clear: both; height:; } .clearfix { zoom:; ...

  8. mysql在一台服务器搭建主从1

    1. 登录mysq的方法:  mysql-S /tmp/mysql.sock 登录3306  mysql -S /tmp/mysql_slave.sock 登录3307 mysql -h 127.0. ...

  9. Swift - 自动布局库SnapKit的使用详解1(配置、使用方法、样例)

    为了适应各种屏幕尺寸,iOS 6后引入了自动布局(Auto Layout)的概念,通过使用各种 Constraint(约束)来实现页面自适应弹性布局. 在 StoryBoard 中使用约束实现自动布局 ...

  10. javaMail创建邮件和发送邮件总结

    (注: 本文是参考http://www.cnblogs.com/xdp-gacl/p/4216311.html. 感谢博主的精彩的描述) 一, 前期的准备 1, 导入 mail.jar 二, 操作步骤 ...