标签:
在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的属性编辑工作需要三个重要部分:
下面看一个具体的栗子:
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类,有下面几点需要了解:
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 <select> 2 <option value="0">Left</option> 3 <option value="1" selected>Center</option> 4 <option value="2">Right</option> 5 </select>
spring的属性编辑器没有UI界面,它仅负责将配置文件中的字面值转换成bean的属性值,因此,工作机制也不等同于java bean的属性编辑器。但了解了java bean的属性编辑器,再去理解spring属性编辑器的工作机制,那就是分分钟搞定的事情了。预知后事如何,请听下回分解。
百学须先立志。――朱熹
(spring-第12回【IoC基础篇】)JavaBean的属性编辑器
标签:
原文地址:http://www.cnblogs.com/mesopotamia/p/5005264.html