数据库中数据项变化不定,如何设计Java Beans(3)

发表于:2007-07-14来源:作者:点击数: 标签:
数据库 中数据项变化不定,如何设计Java Beans(3) · 2.2 标准Java Bean属性总结 图一 Java Bean属性综合图解 如图一所示,Java语言为Java Bean组件的属性机制提供了良好的基础,这些语言元素包括Java的 面向对象 技术,接口技术和异常技术等。Java Bean属
数据库中数据项变化不定,如何设计Java Beans(3)

· 2.2 标准Java Bean属性总结

   图一 Java Bean属性综合图解

   如图一所示,Java语言为Java Bean组件的属性机制提供了良好的基础,这些语言元素包括Java的面向对象技术,接口技术和异常技术等。Java Bean属性命名规则和Java Bean属性设计模板是Java Bean组件的属性机制的规范。遵行这些规范,Java Bean组件的属性可以分为三种:最基本的为简单属性,这种属性只涉及属性所在的Java Bean组件本身;相关属性涉及到三方,包括源Bean、目标bean和协调代码,源Bean为属性的拥有者,目标bean为属性变化事件的监听者,协调代码负责组织双方,另外源Bean还可能实例化一个propertyChangeSupport对象来管理所有目标Bean,propertyChangeSupport对象的工作主要是保存所有目标Bean实例,并激发这些目标Bean的事件变化监听方法;约束属性在原理上和相关属性一样,只是增加了目标Bean对源Bean属性变化的"反对权利"。

   Java Bean组件技术是建立在Java基础上的组件技术,它继承了其的所有特点(如跨平台和面向对象),又引进了其它组件技术的思想,这两个方面恰好是其能成为后起之秀的主要原因。它所能支持的属性如相关属性和约束属性是其它组件技术所不能及的。

·3、扩展javaBean属性机制

   无论是设计模式中值对象、视图助手,MVC框架中的模型(Model),还是Enterprise Bean中的会话Bean,实体Bean,都和javaBean属性息息相关。JavaBean组件属性的优点我们前面已经总结过,随着J2EE平台在企业应用中的广泛使用,JavaBean组件属性的缺陷也就显露了出来:无法满足企业应用动态变化的需要,原因在于javaBean属性是编译时的语言特性,它必须遵行一套命名规则和设计魔板。比如我按照某个企业的要求设计出了2000个实体Bean来满足该企业对信息系统中业务数据模型的需要,过了一定时间后,他们的业务发生了一定的变化,要对数据模型扩充一部分数据项,可想而知我会有多辛苦。

扩展javaBean属性机制定义了五种属性访问策略,使得属性的访问代码像脚本一样在运行时决定,另外一个进步就是它支持List和Map属性的元素属性,也就是扩展javaBean属性机制它不把一个Bean的某个List和Map成员看成一个整体属性,而是动态地把这个List和Map成员的元素看成属性,这样无疑提供了一种无限扩展Bean属性的能力,为解决由于数据项变化带来的设计和实现的变更提供了技术基础。

· 3.1 五种属性访问格式

   Common-beanutils 1.6中的propertyUtils实用类使用Java语言的内省反射功能实现扩展属性的设置器和获取器。propertyUtils定义了引用一个特定Java bean属性的五种格式:

   1、简单属性,格式beanName.propName。propName标识了JavaBean beanName的一个属性,这个属性的获取器和设置器的方法是通过JavaBean的标准内省功能决定的。如果要改变简单属性的值,必须要有设置器操作,可以想象成类似调用beanName.[getpropName()|setpropName(value)];

   2、嵌套属性,格式beanName.propName1.propName2.propName3。像简单属性一样,第一个propName1元素被用来选择一个属性获取器方法,在这个方法返回的对象上使用propName2的获取器方法返回下一个对象,最后这个对象的属性propName3被访问或设置,可以想象成类似调用beanName.getpropName1().getpropName2().[getpropName3()|setpropName3(value)];

   3、索引属性,格式beanName.propName[index]。属性propName1可以是一个数组, java.util.List或者JavaBean beanName有索引属性获取器和设置器操作。bean只需propName的获取器方法,可以想象成类似调用beanName. [getpropName (index)|setpropName(index,value)];

   4、映射属性,格式beanName. propName(key)。propName是一个java.util.Map实现。bean只需propName的获取器方法,可以想象成类似调用beanName. getpropName ().[get("key")|set("key",value);

   5、组合属性,格式beanName. propName1.propName2[index].propName3(key)。

·3.2 代码解释

   为了更有效和直观的解释扩展属性的使用,在这里列出了两段代码,一段代码是Java Bean 代码,一段为propertyUtils以五中格式访问扩展属性的代码。

· 3.2.1 扩展属性Java Bean

   下面是支持这些扩展属性的Java Bean代码:

CCCCCC" class="code">//TestBean.java
import java.util.*;
import java.io.*;
public class TestBean {
private String dupproperty[] =
{ "Dup 0", "Dup 1", "Dup 2", "Dup 3", "Dup 4" };
//propertyUtils只需要该索引属性的一个获取器操作就能
//使用get/setIndexedproperty方法访问和设置索引和元素值
public String[] getDupproperty() {
System.out.println("getDupproperty");
return (this.dupproperty);
}
//下面的方法对propertyUtils的get/setIndexedproperty方法不关键,有则会调用这些方法
public String getDupproperty(int index) {
System.out.println("getDupproperty index");
return (this.dupproperty[index]);
}

public void setDupproperty(int index, String value) {
System.out.println("setDupproperty index value");

this.dupproperty[index] = value;
}

public void setDupproperty(String dupproperty[]) {
System.out.println("setDupproperty du[]");
this.dupproperty = dupproperty;
}
//这是一个索引属性,除了支持"[]"型的数组属性外,还支持申明为List类型的属性
/**
* A List property aclearcase/" target="_blank" >ccessed as an indexed property.
*/
private static List listIndexed = new ArrayList();

static {
listIndexed.add("String 0");
listIndexed.add("String 1");
listIndexed.add("String 2");
listIndexed.add("String 3");
listIndexed.add("String 4");
}

public List getListIndexed() {
return (listIndexed);
}

//嵌套属性
private TestBean nested = null;
public TestBean getNested() {
System.out.println("getNested");
if (nested == null)
nested = new TestBean();
return (nested);
}

//这是一个映射属性,必须申明为Map类型,propertyUtils只需要该属性的一个获取器操作就能
//使用get/setMappedproperty方法访问和设置键和值
private Map hash = null;
public Map getHash(){
System.out.println("getHash");
if (hash == null) {
hash = new HashMap();
hash.put("First Key", "First Value");
hash.put("Second Key", "Second Value");
}
return (hash);
}
//下面的方法对在common-beanutils 1.6.1中propertyUtils
  的getMappedproperty方法不起作用,中不调用这些方法,
//而且不支持嵌套的映射属性
//propertyUtils.setMappedproperty(bean,
  "nested.hash(Fifth Key)", "Fifth Value"); don't work!!

public Object getHash(String Key){
System.out.println("getHash Key");
return hash.get(Key);
}

public void setHash(String Key,Object value){
System.out.println("setHash Key value ");
hash.put(Key,value);
}
//这是一个简单属性,想在propertyUtils中修改必须有设置器操作
private String sample = null;
public String getSample() {
return sample;
}
public void setSample(String sample){
this.sample = sample;
}
}


(未完待续)

原文转自:http://www.ltesting.net