zoukankan      html  css  js  c++  java
  • (spring-第12回【IoC基础篇】)JavaBean的属性编辑器

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

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

    上面是文本配置,

    再看bean:

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

    上面是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类如下:

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

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

    BeanInfo如下:

     1 import java.beans.*;
     2  public class ChartBeanBeanInfo extends SimpleBeanInfo{
     3     public PropertyDescriptor[] getPropertyDescriptors() {
     4        try{
     5 
     6 //①将TitlePositionEditor绑定到ChartBean的titlePosition属性中  
     7 PropertyDescriptor titlePositionDescriptor                       
     8              = new PropertyDescriptor("titlePosition", ChartBean.class);
     9           titlePositionDescriptor.setPropertyEditorClass(TitlePositionEditor.class);
    10            
    11  
    12 //②将InverseEditor绑定到ChartBean的inverse属性中          
    13 PropertyDescriptor inverseDescriptor                        
    14              = new PropertyDescriptor("inverse", ChartBean.class);                    
    15           inverseDescriptor.setPropertyEditorClass(InverseEditor.class);
    16           return new PropertyDescriptor[]{titlePositionDescriptor, inverseDescriptor};
    17        }
    18        catch (IntrospectionException e){
    19           e.printStackTrace();
    20           return null;
    21        }
    22     }
    23  }

    对于上面的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行后面是另一个属性的操作,与上面描述类似。

    下面是属性编辑器类:

     1 import java.beans.*;
     2  public class TitlePositionEditor extends PropertyEditorSupport{
     3     private String[] options = { "Left", "Center", "Right" }; 
     4 
     5     //①代表可选属性值的字符串标识数组
     6     public String[] getTags() { return options; }    
     7    
     8     //②代表属性初始值的字符串
     9     public String getJavaInitializationString() { return "" + getValue(); } 
    10     
    11     //③将内部属性值转换为对应的字符串表示形式,供属性编辑器显示之用
    12     public String getAsText(){
    13        int value = (Integer) getValue();
    14        return options[value];
    15     }
    16 
    17     //④将外部设置的字符串转换为内部属性的值
    18     public void setAsText(String s){ 
    19        for (int i = 0; i < options.length; i++){
    20           if (options[i].equals(s)){
    21              setValue(i);
    22              return;
    23           }
    24        }
    25     }
    26  }
     
    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的下拉框一样:
      1 <select>
      2   <option value="0">Left</option>
      3   <option value="1" selected>Center</option>
      4   <option value="2">Right</option>
      5 </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属性编辑器的工作机制,那就是分分钟搞定的事情了。预知后事如何,请听下回分解。

        

            百学须先立志。――朱熹

  • 相关阅读:
    状态压缩 + 暴力 HDOJ 4770 Lights Against Dudely
    简单几何(推公式) UVA 11646 Athletics Track
    简单几何(四边形形状) UVA 11800 Determine the Shape
    简单几何(求交点) UVA 11437 Triangle Fun
    计算几何模板
    简单几何(相对运动距离最值) UVA 11796 Dog Distance
    简单几何(求划分区域) LA 3263 That Nice Euler Circuit
    覆盖的面积 HDU
    Desert King 最小比率生成树 (好题)
    约会安排 (区间合并)毒瘤题
  • 原文地址:https://www.cnblogs.com/mesopotamia/p/5005264.html
Copyright © 2011-2022 走看看