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属性编辑器的工作机制,那就是分分钟搞定的事情了。预知后事如何,请听下回分解。

        

            百学须先立志。――朱熹

  • 相关阅读:
    微软2019暑期实习笔试题
    java中函数传值和传地址的问题
    不常见的机器学习算法
    隐马尔可夫模型
    hive中over的用法
    SQL基本练习
    drop、truncate和delete的区别
    概率函数,分布函数,密度函数
    greenDao:操作数据库的开源框架
    利用百度API Store接口进行火车票查询
  • 原文地址:https://www.cnblogs.com/mesopotamia/p/5005264.html
Copyright © 2011-2022 走看看