COM/DCOM、CORBA和Java Beans的比较

  一、相关背景的比较

 COM/DCOM

 为了适应更加复杂应用的需要,Microsoft公司推出了构件对象模型COM,COM支持同一台计算机上不同进程间对象的调用;由于分布式处理系统的广泛应用和与CORBA竞争的需要,Microsoft公司于1997年推出了COM的分布式版本,即DCOM,支持对象间通过网络(包括局域网、广域网、因特网)进行通信。

CORBA

 CORBA(Common Object Request Broker Architecture公共对象请求代理体系结构)是由OMG工业集团定义的分布对象计算模型和系统结构。OMG与1990年提出了一个对象管理结构(OMA),这是CORBA的最原始的构想及基础。在OMA的基础上,1991年一些大公司联合提出了CORBA1.1版。目前有不少公司从事CORBA的实现工作,并推出了基于CORBA的产品。
CORBA仅是一个分布对象规范,没有限定使用何种程序设计语言,其目的是不使CORBA束缚在某种特定程序设计语言上。用不同语言书写的对象,只要符合CORBA规范,就可以相互调用。但由于CORBA规范仅是一个书面的说明,各公司对其理解未必一致,规范中也有不少部分没有做统一规定,由厂家自行决定,因此各厂家基于CORBA的产品未必相互兼容。


Java Beans

 Java Beans是于1996年提出的基于Java语言的分布对象模型,其构件叫Bean。Bean就是以Java语言中的类和对象为基础定义的。当初,Java Beans主要为一些软件构造工具提供一些可视化构件。后经不断扩充,发展成为一种通用分布对象模型。但是,Java Beans不如CORBA、DCOM成熟,还在不断完善之中。

二、基本概念的比较

 COM/DCOM

 COM/DCOM对象模型设计的指导思想是健壮、高效和切实可行。COM对象具有多个接口,通过每个接口可以访问一组成员函数。成员函数相当于方法。每个对象拥有自己的数据,表示对象的状态。数据只能通过接口访问,用户和应用程序不能越过接口访问数据。每个接口仅包含其所属成员变量函数的调用说明及引用它的指针。成员函数的实现不是对象的一部分,一般可以有两种方法实现:一是用动态链接库DLL实现,二是作为一个可执行模块EXE实现。不管哪一种实现,成员函数都可以动态调用,直接执行,不需要编译连接。甚至调用者所用的程序设计语言与实现成员函数所用的程序设计语言也可以是不同的。用DLL实现时,在调用成员函数前必须将DLL加载到本地进程的地址空间,不能跨进程空间进行访问。而EXE模块不受这个限制,可以跨进程访问。

 在COM对象的多个接口中,有一个接口是每个对象必备的该接口被命名为Iunknown,接口名前面加字母I,以便识别。

 COM/DDCOM也有类的概念,类也看成是一种对象,称为类对象。由于COM/DCOM不支持继承的概念,一个对象的所有接口及其成员函数都已在对象中定义,在引用对象时不必到其所属的类或其祖先类中查询有关的内容。只有在创建一个对象(即类的一个实例)时,才用到类中的内容。在COM中,除了类以外,还有类型(type)的概念。类型比类更抽象,它与实现无关。而类中可含有一些与实现有关的属性,诸如支持它的软件名称、所用的图表等。例如一个复合文件可以定义成一个类型,但这种类型可用不动的字处理软件、电子表格软件、多媒体软件来实现,形成不同的类,可用不同的图表表示。用户可以根据运行环境在同一类型中选择合适的类。


CORBA

 CORBA的对象模型基本上按OMG所定义的公共对象模型COM(不同于微软的COM),支持类、封装、继承和多态,是一个功能比较完备的对象模型。对象或类之间可按客户/服务器方式互相调用。每个对象或类即可以作为客户,也可以作为服务器,有时还可以兼作客户和服务器。
客户对象和服务器对象只通过消息交互作用。客户对象向服务器对象发出请求,服务器对象响应客户对象的请求完成一定的操作,并返回操作结果和必要的信息。它们只通过消息往来,不必了解与请求无关的功能。即使客户对象或服务对象重新实现,只要接口的语法和语义不变,不影响用户的使用。

 客户和服务器的通信方式一般有两种:常用的是同步方式,即客户提交请求后,客户要等到服务器放操作执行完毕并返回操作结果或信息后,才继续运行;另一种方式是异步方式,即客户提交请求后,可继续运行。

Java Beans

 与其它分布对象模型一样,Java Beans是以对象作为基本构件。类是对象的模板,而对象(即Bean)是有类生成的一个实例。类中可有多种构造对象的函数。如果生成对象时,不指明具体的构造函数,仅指明类名,则用下面的接口调用:new <Class nama> ()。这就表示用类中的缺省构造函数Constructor()生成对象。在Java Beans中,一组对象相互联系,相互作用,有公共的接口,服务于某一应用目的,则这组对象组成一个容器。以上的概念和方法与CORBA、DCOM相类似。

三、技术内容及特点的比较

 COM/DCOM

 1. 全局唯一标识符
   在COM/DCOM对象模型中,对象的每个接口、每个类对象、每个类型都有一个全局唯一标识符,为了保证标识符的唯一性,COM/DCOM用128位的整数作为全局的唯一标识符。
 
 2. 代码复用和继承
   从健壮性考虑,COM/DCOM对象模型中没有采用继承的概念,但是并不影响代码的复用,它的包含/委托机制就可以体现代码复用的作用。从长远来看,作为一个通用系统对象模型,COM/DCOM增加继承机制是必要的,问题在于克服继承带来的负面影响。

 3. 多接口和对象的演化
   由于COM/DCOM的接口是不可改变的,所以要有变化,只能新增一个接口。COM/DCOM允许多个接口并存,这样也就不用使用版本的概念,而用同一个对象的多个接口来区分。多接口也增强了对象的开放性,任何用户可以在自己选择的对象上定义其需要的新接口。

 4. 持久数据及其操作
   这里的持久数据指存储在磁盘上的数据,在COM/DCOM中,仍借用文件系统中的功能,不过要把文件系统的有关功能映射成对象的接口。在COM/DCOM中有两种持久数据对象:一是存储对象;二是流对象。存储对象和流对象的数据可有两种访问模式:一是直接方式;二是事务方式。

 5. 持久数据智能名
   在访问磁盘上的持久数据时,用户往往只给出数据名,而由文件系统或数据库系统根据数据名去寻找数据,这个过程叫做数据名与数据的绑定。为了在COM/DCOM中实现数据的绑定功能,专门创建了一个类对象,叫Moniker。

 6. COM/DCOM库
   COM/DCOM库与所用的平台有关,对不同的平台,有相应的COM/DCOM库。

CORBA

 1. 结构概况
   CORBA的结构分为客户方、服务方、ORB、对象服务、公共设施、IDL源文件、实现仓库等部分。ORB是连接各方的核心。客户应用程序的请求交给ORB(客户方),ORB可为客户选择合适的服务器和方法代码,在服务方执行。服务方返回用户的操作结果或信息也由ORB转交。

 2. 调用方式
   在CORBA中,客户向服务器提交请求的过程叫调用。为了形成请求,客户程序至少提供两种数据:一是操作名称及其参数;二是对象引用。应用程序设计者须按IDL的格式将操作的接口定义于OMG IDL文件中。为了用这些数据形成请求,CORBA提供了存根型调用和动态调用两种机制。
 3. 服务器方的CORBA软件
   当客户的请求提交给ORB后,ORB按其所选的服务器和方法,通过对象适配器OA引导到相应方法的实现程序。对象适配器OA通过服务器构架调用方法。下面是对这些构件的功能的描述:
对象适配器OA:是ORB与服务器中具体实现通信的连接软件;
服务器构架:当对象适配器OA选择并激活相应的类以后,服务器构架通过服务器构架中的子程序,将请求的操作映射成相应方法的实现并通知服务器,在服务器控制下执行方法。
实现仓库:实现仓库中含有定位和激活对象的信息,是对象访问和具体实现相结合的手段,正像接口仓库是对象访问与具体接口相结合的手段。
 4. 在异构数据集成中的应用    由于各种数据源有各自的用户接口,若要通过ORB相互访问,必须提供面向对象的接口。为此,对每种数据源,都要加上一个包装器。包装器实质上就是一个用户接口转换器。因为对象模型是很通用的模型,各种数据源都可以用等效的对象接口替代。不过包装器实现起来有简单和复杂之分。例如,OODB的包装器实现起来就比较简单,而WWWDE的包装器实现起来就比较复杂。

 5.CORBA规范的技术特点
引入了代理的概念
所实现的客户方程序与服务器方程序的完全分离
将分布计算同面向对象的概念相互结
提供了软件总线的机制
分层的设计原则与实现方法
Java Beans

 1. 对象级的状态保留
 Java Beans生成的对象若不特别申明,则只存在于内存中。当对象中断运行时,对象的状态可能从内存消失,如果对象再恢复运行,则需重新生成并初始化。为此,Java Beans提供了状态保留功能,只要在生成对象时加上申明implements java.io.serializable或implements java.io.Externalizable。前一种申明表示在对象中断运行时调用运行环境中的工具软件保留对象状态,在对象中并无保留对象状态的方法;后一种申明表示在对象中断运行时有对象本身的方法保留对象状态,主要用于对保留方式有特殊要求的场合,例如有些属性值可以免于保留。

 2. 内省和核心反射
 Java Beans通过Introspector类的Core Reflection API到类中直接读取类及方法的定义,通过Introspector类所获得的类的属性、事件和方法的定义都保存在名为Bean Info的对象中。若要查询一个类的定义,只要访问Bean Info对象即可。

 3. 多线程控制
 Java语言具有多线程控制功能,为了解决临界区访问冲突的问题,在Java Beans中用Synchronized语句定义临界区。当线程执行到临界区时,它必须先取得临界区的锁,才能执行临界区中的代码。如果没有申请到锁,该线程须排队等待,从而实现临界区的互斥功能。

 4. 安全措施
 当运行来源不明的Beans时,很可能使用户的计算机系统遭到有意无意的破坏。为了防止破坏,Java Beans在下面四个环节采取了安全措施:
Java语言及其编译器;字节码检测器;类加载器;安全管理软件。

以上在“相关背景”、“基本概念”、“技术内容及特点”三个方面分别对COM/DCOM、CORBA和Java Beans进行了对比,随着技术的进步,它们还会产生更多的共性和特色,同时也会为我们系统的开发带来更多的便利。

///////////////////////////////////

 组合软件是新一代软件技术发展的标志,它的提出很自然,为了提高软件生产力、不草率地开发应用程序、设计开发人员应尽可能地利用可重用的软件组件、组装构造新的应用软件系统。

  追根求源,由软件模块组件组织合成软件的思想早在70年代就已提出了,函数就是一种组件,函数通过参数来适应不同应用需求的变化,Ada语言的模块package就是一种组件,实现了内部细节掩藏,模块通过接口规范说明进行连接和组装,package还提供了类属机制,使模块通过类属参数,适应不同应用需求的变化。但是,传统软件系统结构的局限性,以过程为中心设计的功能模块,其扩充和复用的能力都较差,对模块进行应用重组的困难很多。从80年代开始的面向对象技术的研究,使组合软件又萌发出新的生命力。面向对象的软件,以数据为中心设计,对象类既具有模块的封装性和类属等特性,还具有继承特性,极大地提高了类的可扩充性和可再用能力。对象类较之于传统软件的功能模块而另具有的优点是:
   (1)易于理解,具有完整的语义特征;
   (2)易于扩充和修改,具有较高的通用性和适应性;
   (3)易于构造组装,具有规范的外部接口。

  开发应用组件必须遵循标准,以保证软件组件的互操作性,只有遵循统一的标准,不同厂商的、不同时期的、不同程序设计风格的、不同编程语言的、不同操作系统的、不同平台上的软件或软件部件才能进行交流与合作。为此,OMG(ObjectManageGroup)提供了一个对象标准CORBA,它定义了一个网连对象的接口,使得对象可以同时工作。基于CORBA的对象请求代理ORB为客户机/服务器开发提供了中间件的新格式。

  令人称奇的是,作为OMG成员的微软公司却撇开CORBA而另辟了COM(ComponetObjectModel),即组件对象模型,并把COM定位成基于对象的软件开发模型,尽管COM被认为是微软鼓噪出来的技术,但支持COM的开发工具却不断增多,其中大部分来自于微软,包括VisualBasic和VisualC++。

   面对组件领域内缺乏一个统一的、用于开发应用组件的标准这种局面,开发人员应怎么办呢?COM和CORBA谁更胜一筹?本文先介绍CORBA和COM,然后分析比较这两个标准及其组件的优劣势,相信读者在读完本篇文章之后,会做出自己的判断和取舍定笃。

   一、公共对象请求代理结构:CORBA标准

   全球性网络使线上的所有设备和软件成为全球共享的浩瀚的资源,计算机环境也从集中式发展到分布式环境,开放式系统的发展使用户能够透明地应用由不同厂商制造的不同机型不同平台所组成的异构型计算资源,因此,分布式处理和应用集成自然而然地成为人们的共同要求,那么什么是分布式处理和应用集成呢?它们的功能和关键技术是什么呢?简单地讲,分布式处理和应用集成就是指在异构的、网络的、物理性能差别很大的、不同厂商的、不同语言的信息资源的基础上构建信息共享的分布式系统,并且能够有效地进行应用系统和分布式处理的集成。分布式处理的关键在于定义可管理的软件构件,即面向对象技术中的“对象”。应用集成的关键在于为跨平台、跨机种、跨编程语言的产品提供统一的应用接口。OMG组织针对当今信息产业的要求,公布了CORBA标准,即公共对象请求代理体系结构(Common Object Request Broker Architecture),这是一个具有互操作性和可移植性的分布式面向对象的应用标准。
   CORBA的核心是对象请求代理ORB,它提供对象定位、对象激活和对象通讯的透明机制。客户发出要求服务的请求,而对象则提供服务,ORB把请求发送给对象、把输出值返回给客户。ORB的服务对客户而言是透明的,客户不知道对象驻留在网络中何处、对象是如何通讯、如何实现以及如何执行的,只要他持有对某对象的对象引用,就可以向该对象发出服务请求。

  CORBA允许用户以两种不同的方式提出对象请求:
1)静态调用:
  通过给定接口的存根,在编译了对象代码后,进入客户端的程序。因此,静态调用必须在编译时就知道对象及其类型。

2)动态调用:
  通过ORB的动态调用接口DII,在运行时生成访问对象的代码。

  不管客户以哪一种形式提出请求,ORB的任务是:找出所要对象的位置,激活该对象,向对象传递此请求。对象执行所请求的服务后,把输出值返回给ORB,然后再由ORB返回给客户。

CORBA的重要概念是:
1.对象连接
  CORBA广泛地支持对象的实现,在单服务器系统中也可以实现由接口定义语言定义的接口。ORB的灵活性既可以直接集成已有的应用,又不会使新对象受某些原则的制约。

  对象连接提供了有不同类型对象实现时,使用ORB服务的方法,服务包括:对象引用、方法调用、安全控制、对象实现的激活与静候等。

2.接口定义语言(IDL)
  CORBA用IDL来描述对象接口,IDL是一种说明性语言,它的语法类似于C++。

  IDL提供的数据类型有:基本数据类型、构造类型、模板类型、和复合类型、操作说明。这些类型可以用来定义变元的类型和返回类型,操作说明则可以用来定义对象提供的服务。

  IDL还提供模块构造,其中可以包含接口,而接口是IDL各类型中最重要的,它除了描述CORBA对象以外,还可以用作对象引用类型。

  IDL提供了接口继承性,派生接口可以继承其基类接口所定义的操作与类型。IDL的接口继承性有其特殊性,此处不赘述。

  总之,CORBA的IDL是一种说明性语言,描述面向对象系统开发所遵循的接口与实现相分离的基本原则。
3.动态调用接口

  把IDL说明编译成面向对象程序设计语言的实代码后,客户可以调用已知对象的操作。在某些应用中,用户并不了解应用接口编译信息,但也要求调用对象的操作,这时就要动态调用接口来调用用户的操作了。例如,图形用户接口应支持用户浏览接口公共库,以获得每个对象所支持的操作信息,用户可根据自己的需求从浏览对象中挑选出所需的对象操作,具体的对象操作的调用实际上是用动态调用接口来完成的。

4.接口公用库

  接口公用库持久地存储IDL的接口说明,借助于接口公用库,可以实现对象继承性层次结构的导航,并且提供了有关对象支持的所有操作的描述。接口公用库最常见的功能是为接口浏览器提供信息,帮助应用开发者找出潜在的可重用的软件部件。ORB可以利用接口公用库检查运行时的操作参数类型,但接口公用库的基本功能是提供类型信息,为动态调用接口发送请求提供信息支持。

   二、组件对象模型:COM标准
   COM是微软公司推出的与CORBA抗衡的产品,在设计开发COM时,微软把COM定位成基于对象的程序设计模型,旨在促进软件的互操作性,实际上它是基于OLE的组件标准,COM采用了OLE的对象请求代理,定义了OLE组件对象及应用之间的接口。
 

  COM所涉及的重要概念有:

   1.COM接口
   COM的应用程序之间以及应用程序与系统之间是要相互交流信息和相互作用的,其相互作用是通过一系列的函数实现的,这些函数就叫作“接口”或“界面”。COM接口是组件与组件之间缔结的契约,提供了特定层次上的服务或功能性。
   COM接口提供了以下的便利:
   ·无需重新编译,对象就可以增添新的功能;
   ·能够透明地向另一个过程或另一台机器上的对象发送RPC调用;
   ·诸如C、C++、Pascal、Ada和Smalltalk等凡是支持指针结构并通过指针能显式地或隐式地调用函数的程序设计语言都能够创建并使用COM对象。
   COM定义了一种特殊的接口IUnknown来实现一些基本功能,所有对象均支持此基本接口,该接口的方法是QueryInterface,它允许对象的用户在运行时动态地确定COM对象是否支持某一个接口。
   COM的接口定义语言是COMIDL(Interface Definition Language),它是OSFDCE所采用的IDL的一种简单扩展,DCE,即分布式计算环境,是OSF(Open Software Foundation)组织提供的一组独立于各平台的中间件服务,它使得分布的应用程序得以协调运行。
   开发人员可以使用COMIDL来创建对COM对象的接口方法的说明。

   2.用GUID来标识对象和接口
   未来的分布式对象系统可能大到拥有数百万个接口,而软件的组成部件是必须唯一标识的。在大型复杂系统中,如果仅用便于人类阅读的名称来标识组件的话,那么几乎是100%要出现名字冲突现象的。为了避免这种事件的发生、解决名字冲突问题,COM采用了全局唯一的标识符GUID(Globally Unique Identifier),每个GUID都有128位整数并能确实保证标识符在空间世界和时间世界中的唯一性。COM的GUID和OSFDCE的UUID(Universally Unique Idenfifiers)是完全等同的。

   3.摒弃继承性而采用聚类
   微软认为在松散耦合的、分散的、逐步改善的对象系统中,继承性是造成很多麻烦的根源,但微软也承认如果程序设计人员都能控制继承性层次,那么实现继承是一个十分有用的技术,且紧耦合也不会带来太多的麻烦。不过微软还是认为在实现层次上看,对象与对象之间的契约是不言明且有二义性的,当父或子组件改变了实现,那么与其有关的组件的行为就成为非定义行为了。
   COM提供了两种机制来取代实现继承性,这两种代码重用机制叫作抑制/代理和聚类,在前一种机制中,一个对象(外部对象)只要把内部使用的对象当作服务提供者来使用就可以使自己(外部对象)成为其他对象的客户了,外部对象的客户是绝不能看到内部对象的,这就是说某个对象的内部对象对于该对象的客户来说是完全隐藏的,这正是封装性的体现。
   在聚类机制中,一个聚类对象实际上是一个合成对象,由外部对象和内部对象合成,外部对象把内部对象直接呈现给外部对象的客户,这时内部对象就象外部对象中的一部分一样,所以说聚类机制是一种特殊的抑制/代理机制。

   4.本地透明性和远端透明性
   COM允许客户透明地与对象通讯,客户在与对象通讯时并不知道对象在何处,客户访问对象完全是通过接口指针的,指针当然是在过程中的,而且每一次对接口的调用都要先与过程中的EJB 是部署在服务器上的可执行组件或商业对象。

猜你喜欢

转载自blog.csdn.net/TOP_SC/article/details/5976314