一、JavaBeans产生的背景 进入90年代以来,软件构件与软件构件化技术已成为工业界普遍接受的提高软件质量、可靠性与软件生产力的一种行之有效的方法和技术。所谓软件构件化技术是指用装配可重用软件构件(Software component)的方法来建立应用系统,或开发客户定制的系统。其第一代典型产品是Microsoft公司的Visual Basic,它与VBX构件和基于表格的应用结合,已成功地开发出不同类型的应用。继Visual Basic之后,Borland公司的Delphi增加了强有力的数据访问构件,扩充了面向对象构件的功能。这使得基本构件装配应用开发模型成为一种深入到软业界的新的应用开发模式与开发环境。 1994年12月,Sun公司提出了Java的构件模型Java Beans。JavaBeans是一种用纯Java编写的、独立于平台的、可移植的构件模型,这是Sun公司与业界领袖人物合作的结果。由于J ava的独立于平台的能力,使开发者只要编写一次可重用的构件,就可以到处运行。JavaBean s成为沟通各种软件构件模型的桥梁,为开发者构造可在Microsoft的Active X、OpenDoc,Ne tscape的Live Connect等环境中运行的构件提供无缝的连接手段。Beans与Java的关系相当于OCT/Active X与OLE、Live Object与OpenDoc的关系。有的Bean是可视化构件,可以加入到可视化编程工具的表格中;有的是实现一些基础性工作的非可视对象。可以把大量的Bean装配起来,构造出一个简单的Java小应用程序,而不需做任何编程工作;也可以把Bean打包(Pac kage),组成成千上万行的应用代码,从而构造一个复杂的企业应用。 二、Java的构件模型JavaBeans 构件模型是为开发者定义软件构件而建立的体系结构和API集,使得开发者可通过软件构件的动态组合来建立应用系统。 构件模型由构件(Component)与容器(Container)两种主要成份构成。构件是软件的具有可重用特性的基本部件,它的范围相当广泛,小的构件有像按钮之类的GUI元素,中等规模的有如具有列表功能的小应用程序(Applet),而大的构件可以是HTML浏览器这样的完整的应用系统。容器类似于装配车间,是一种存放相关构件的"器皿",用于安排构件、实现构件间的交互,其形式也是多种多样的,如表格(Form)、页面(Page)、框架(Frame)、外壳(Shell)等。另外,容器也可以作为另一个容器的构件。构件模型能提供多种服务。 1.JavaBeans的构件Bean Java的构件Bean是可在构造工具(Builder tool)中进行可视化操作的可重用的软件。实际上,有些Bean具有可视化外观,而有些却不具有可视化外观,但它们有一个共同点,那就是在构造工具中都是可视的。 Java的Bean可分成两类:第一类Bean称为颗粒型Bean,它相当于建筑用的砖块或预制板, 通过构造工具把各种Bean构件组装起来,构成一个合乎客户要求的特定应用程序或应用系统;第二类Bean类似于传统的应用部件,一般将这些应用型Bean组装在一个或多个复合文档中。复合文档指的是由多种类型的对象构成的文档。例如,一个具有列表功能的Bean可以内嵌在Web页面中,此Web页面就是一个复合文档,页面中可以包含各种各样的对象,如图像、声音、文本等。 人们应当看到,这两类Bean是相互交叉的。例如,在上面谈到的具备表格功能的Bean既可以作为颗粒型Bean使用,也可以作为应用型Bean(因为它已具有了某些应用的功能)存在于复合文档中。 许多Bean都有GUI表示,但也有不具有GUI表示的Bean,它们仍能调用方法、触发事件、保存状态等,它们也可以在GUI构件工具环境中,通过标准属性表格或定制方式进行编辑,只是这些Bean本身不具有屏幕显示功能。这些Bean既可以在GUI应用中作为共享资源,又可以在组建服务器应用中作为无GUI外观的构件。在建立应用的工具中,它们仍可以可视化的形式表示, 甚至有GUI定制器对其进行配置。 构造工具也是多种多样的,如Web页面构造器、可视应用构造工具、GUI元素构造器、服务器应用构造工具等。构造工具也可以分为几类:有些工具具有可视化操作功能,类似于Vis ual C++的可视化操作;有些工具为用户编写进行Bean交互和控制的Java类提供方便;有些工具提供了一个简单的脚本语言(Scripting language),以便于描述Bean构件间的相互联系。 需要指出的是Bean与类库(Class Libraries)不同。Bean的最重要的特征是可视化地操作与定制功能。而类库主要是为编程者提供某种功能,它并不具有可视化操作的优点。 2.构件模型提供的服务 构件模型主要提供以下6种服务: (1)构件接口的暴露与显示(Component Interface Exposure and Discovery) 在构件模型中,为实现构件之间以及构件与容器之间的交互,构件就必须将自身的接口公开。例如,在一个在线银行服务中,在其Web页面上定义了两个Java Bean构件(Web页面作为这两个构件的容器):获取基于利率的数据的构件(称作Bean1)和绘图构件(称作Bean2)。由于B ean2向Bean1袒露了自身的接口(如绘制样条图接口和绘制曲线图接口),则Bean1可以通过调用Bean2相应的接口来选择相应的图。故尽管各个构件是在不同的环境下使用不同的构造工具创建的,但它们却可以通过"构件接口的暴露与显示"机制实现构件间的动态交互。 (2)构件的特性 构件的特性(Component Properties) 是指一个构件的公共属性(Publi c attributes),它们或者直接反映构件的状态,或者直接影响构件的状态。例如,按钮的"背景颜色"是按钮构件的公共属性。构件模型将构件的公共属性向构件所在的环境公开,这样可以通过方法调用来获取或修改这些属性,如可以调用"Color get Foreground()"方法来读取按钮的背景色,又可以通过调用"void setForeground(Color c)"方法改变背景色。 (3)事件处理 事件处理(Event Handling)机制的作用是激活事件、广播事件,将事件传递给相应的构件。例如,在上面谈到的在线银行服务中,Web页面提供了一个按钮,让用户选择绘制样条图还是曲线图。当用户双击按钮时,就会产生一个事件,并将事件传送给绘图构件, 绘图构件就会按要求绘图了。 除了系统定义的事件(如双击鼠标)外,还可以定义构件本身的事件。例如,在银行帐户构件中定义了"数据改变"事件,当帐户内的数据改变时,则激发"数据改变"事件。此事件可以通知其他构件,以作出相应的反应,如发出警报、改变可视的内容或激发另外的处理过程。 (4)持久性 持久性(Persistence) 是将构件的状态存储在一个较稳定的地方的机制。构件的状态存储在容器的相关描述中,同时又储存在与其他构件的关系的描述中。例如,若用户可以将其帐户信息和选择的绘图类型等状态存储在在线银行的Web页面中,那么持久性机制有利于快速及正确地保存及访问这些状态。 (5)应用构造器的支持(Application Builder Support) 它是构件向应用开发工具显示自身属性和行为的机制。利用这些接口,开发工具可以决定构件的属性和行为(事件、方法等)。开发工具通过构件检察器、编辑器等使得应用开发者很容易将不同的构件集成一个应用。应用开发者还可以通过这些机制修改构件的状态和外观,建立构件间的联系。 例如,在构建上述在线银行服务应用时,应用开发者可以利用适当的编辑器来定义按钮的外观(大小、颜色、标题等)和绘图的缺省类型。应用开发者还可以利用其他的开发工具的某些机制,定义按钮的"双击"事件与绘图构件的"绘图类型"属性的关系。 (6)构件的打包(Component Packaging) 由于Java Bean要在网络环境下使用,故必须提供将分布在网络各处的资源"打包"成一个构件的机制。Java的构件模型将JAR(Java ARchiv e)文件格式作为提供"打包"功能的技术手段。JAR可将任何构件资源,例如声音、图像、帮助文件等,打成一个构件包,此构件仅有一个入口。
三、JavaBeans的相关问题
1.Bean在设计阶段与运行阶段的比较 因为要使每个Java Bean构件都能在各种各样的环境中运行,所以我们需要区分设计阶段(Design time)与运行阶段(Run time)。 设计阶段的信息和运行阶段的代码的区别往往非常大。例如,一个"写"构件,通过提供具有"Wizard"风格的定制器的一系列选项来指导用户进行构件的定制,则可大大减小Bean应用阶段的代码。故我们希望将设计阶段的Bean的有关代码与运行阶段代码分开来。这样,在运行阶段使用Bean,就不需下载它的所有开发阶段代码。解决的方法之一是可以将设计阶段接口与运行阶段接口定义在不同的类中。
2.Java Bean的安全问题 Java Bean完全符合标准的Java安全模型,它既不扩展,也不减少。当一个Bean作为不可信任的小应用程序(Untrusted applet)的一部分时,必须受到标准Applet的安全制约,并且不能对任意文件进行访问,也不能与任意网络上的主机相连。但当Java Bean作为独立的Java应用程序的一部分,或作为可信任的Applet(Tructed applet)的一部分时,允许正常地访问文件或网络上的主机。建议将Bean作为不可信任的Applet的一个部件进行开发。与之相关的Bea n API涉及以下几个方面: (1)内部检查(Introspection)/映象(Reflection) Bean的开发者必须假定在设计阶段可以无限制地访问高级的内部检查API和低级的映象API,而在应用阶段则有较多的限制。例如,标准的JDK安全管理机制甚至允许可信任的应用访问私有的域和方法,但只允许不可信任的应用访问公有的域和方法。内部检查和映象机制使得Bean把数据结构提供给程序和程序员。例如,开发工具可以提供一个对象检查器,使程序员可以考察一个Bean的方法、实例变量、特性和接口。 (2)持久性(Persistence)在开发阶段和应用阶段中,Bean应同为串行流或非串行流。但在应用环境中,希望将Bean作为线性流,并由其应用创建和控制,但是应用不能控制线性流从何处读和写往何处。 (3)GUI的合并(GUI Merging) 在不可信任的Applet中不允许执行Bean的GUI与父应用的GUI合并。例如,在当多个Bean被嵌套在一个不可信任的Applet中,各个Bean的菜单条可以进行合并,但是此应用的顶层菜单条应与其他的菜单条分开。 3.Java Bean的本地活动和远程访问 Java Bean构件的本地活动(Local activation)是在与其容器相同的地址空间内进行的。例如,若容器为一Java应用,则其所包含的Bean就在与其容器相同的虚拟机中运行;若容器不为Java应用,则Java Bean将在与应用直接相关的Java虚拟机上运行。 另外,Java Bean构件被设计成可以在WWW上运行。如下图所示,对于开发者来讲,3种最重要的网络访问机制为:图1 Java三种网络访问机制 (1) Java远程方法调用(Java RMI,Java Remote Method Invocation) 应用的客户端和服务器端都是参照分布式系统接口实现的,而分布式系统接口能被自动地、透明地从客户端传送到服务器端,这使得编写分布式应用变得简单容易。可以预见,Java RMI将成为在网络环境下编写构件Bean的十分流行的方法。 (2)Java IDL 它实现了工业标准OMG CORBA分布对象模型,所有的系统接口都是用CORBA IDL定义的,Java桩(Stub)可以由IDL接口产生,这使得Java Bean能够与IDL服务器相互调用。因为CORBA提供了一个多语言、多厂商的分布式计算环境,所以Java IDL使得Java Bean客户端能与Java IDL服务器或非Java IDL服务器对话。 (3)JDBC 作为Java数据库的一种API,JDBC使得Bean构件能够访问SQL数据库,这些数据库既可以放在客户端,也可以放在远程数据库服务器上。Bean可以提供对于特定数据库的数据表格的剪裁。
四、工业界对JavaBeans的反应 JavaBeans构件规范的发布,引起了国际上主要信息厂商的浓厚兴趣和响应。 Apple和IBM 公司决定与Javasoft公司一起,为实现Beans和CI实验室的OpenDoc的互操作而努力。 Javasoft和Netscape正设法在Navigator的Live Connect容器中使用JavaBeans. 微软提出将在Internet Explorer 4.0中支持JavaBeans,并准备集成Active X构件和Be an构件。 为此,Sun感到振奋,认为这反映了用户对JavaBeans的需求。 因为在网络环境下,大多数公司和开发者不能再局限于开发在某种特定平台上运行的构件,它们纷纷转向JavaBeans。但熟悉Active X的开发者,则希望提供一些工具来将沟通Active X与JavaBeans,于是,出现了Active X桥。 最近,Sun已发行了Active X桥的测试版。 Sun、IBM、Lotus将为加速开发者向JavaBeans过渡开展技术合作。Sun计划采用Lotus的InfoBus技术作为信息共享和在Bean之间传递信息的标准。InfoBus实现了数据的动态交换技术。基于InfoBus应用的Bean构件可以分为3类: (1)数据生产者(Data producer)它对消费者的数据要求作出反应。 (2)数据消费者(Data Consumer)。 (3)数据控制者(Data Controller) 作为InfoBus的交通控制,它处理数据生产者流向 消费者的数据流。Lotus称。"InfoBus大大地简化了JavaBeans应用"。Sun也很高兴看到工业上的这种变革。InfoBus作为JavaBeans规范说明的扩展,令开发者可以方便的创建新的动态应用。