基于复合连接器的插拔式构件组装方法研究
2009-03-08陈军良
陈军良
摘要:在基于构件的软件开发中,构件组装技术是关键。在一般组装过程中,构件积极主动的“参与”造成构件的复杂化。软件体系结构将连接器视为和构件同等重要的一阶实体。在当前基于软件体系结构的构件组装方法上,整合接口匹配和消息传递的构件组装技术的特点,提出了基于复合连接器模型的插拔式组装实现框架。从而简化构件的开发,提高组装效率。本文重点研究了复合连接器模型各部分的实现和插拔式组装算法,最后给出了一个面向Web应用的构件组装工具实例。
关键词:软件体系结构构件复合连接器插拔式组装
0引言
构件组装技术是基于构件的软件工程的核心,也是难点所在。构件组装就是通过现有的构件和组装机制,把构件组装成一个新的构件或新的系统。目前,构件组装技术的应用和研究正向着多角度、全方位的方向发展。软件体系结构(SA)是对软件总体结构的描述,即对其构件和构件间交互的高层组织的描述。基于构件的SA的设计已成为软件系统设计中的核心问题。基于SA构件组装方法有多种风格,例如程序代码生成技术、消息传递构件组装技术、利用连接器模型进行构件组装“等等。但是,软件体系结构最重要的一个贡献是将构件之间的交互显式的表示为连接器(connector),并将连接器视为和构件同等重要的一阶实体。体系结构风格既定义了构件及连接方式的各种属性,又规定了它们的组合规则和限制。因此,在基于SA构件的构件组装技术中,通常利用连接器进行构件组装。目前,北大提出的“连接子”,是利用连接器进行组装的典型,但是当系统中需要组装的构件功能多样时,其连接的数量就成为一个显著的问题,不仅每个构件需要定义大量的接口,而且还要生成很多连接器,从而造成系统代码的冗余。本文提出了基于复合连接器的插拔式构件组装方法。在组装成应用系统的过程中,构件处于很积极(passive)的状态,主动(active)的参与和完成组装,这样势必造成构件的复杂化。通过本文提到的复合连接器,①简化构件的开发,更多的去考虑构件的功能而不是其结构规范。这样可以使更多的人参与构件的开发,从而增加更多的构件资源。②构件与构件之间的关系转移到构件与连接器上,实现构件的插拔式组装。③提高组装效率,更好的理解组装的场景,明晰组装的流程。基于复合连接器的插拔式构件组装方法不仅可以清楚的描绘出构件之间的关系,而且也体现了页面视图方面的组装特点,可以很好的表现实际的web页面,比如页面的布局,页面的主题等。本文最后从实际项目出发,结合C2体系结构风格,并借鉴开源框架Struts技术,开发出基于复合连接器的插拔式构件组装系统。该系统设计符合J2EE规范,遵循插头插座式体系结构。
1基于复合连接器的插拔式构件组装的系统模型
1.1基于连接器的插拔式组装框架在基于B/s结构的系统中,为了实现插拔式组装,把连接器置于客户端和服务器之间。由于构件库放置在服务器上,所以首先由客户端发送消息告诉连接器需要的构件,再由连接器把消息传递给服务器,最后服务器根据消息做出选择。构件组装系统框架的实现可以分为以下六个部分:①用户(客户端)发出组装系统所需构件的请求,连接器收到消息,根据构件标识,生成构件地址,并以URL的形式传递给服务器:②服务器根据构件标识,在构件库中进行查找;③在查找过程中,根据构件描述文件中定义的标识,获取相应的构件信息;④根据构件信息,通过web部署文件的映射实例化构件;⑤服务器把实例化后的构件传递给连接器,连接器通过接口服务组装构件;⑥连接器把组装后的系统返回客户端。用户获取组装后的构件信息。
1.2连接器模型该体系中使用的连接器是一个自治的、可调度的软件实体,可以清楚地说明它所需要的和它所提供的服务。比简单连接器的实现更复杂,功能也更强大。同时,封装实施通信的协议和约束关系。待组装的构件只需插入到连接器的相应接口即可实现相互的连接。本文提到的插拔式连接器分为两部分:①插拔式接口:一个需求服务接口,一个提供服务接口。②通信实体:实现插入构件之间的通信,包括通信的协议、服务等。
要实现插拔式连接器需解决一个关键问题:如何使构件插拔式地使用该连接器,即构件与插拔式连接器的接口匹配问题。为了给用户一个直观的组装环境,使构件的位置相对于用户透明化,在组装构件时,仅告诉连接器该构件需要与哪个构件进行通信即可。这时连接器的作用是:接收到要组装的构件,发送消息到服务器(构件库),服务器接收到消息返回构件,构件根据组装描述文件,实例化构件,完成连接器与构件的服务和接口的匹配,最后实现构件组装。这样,构件之间不必知道各自的实现方式,只要插装到连接器上。就能实现相互间的衔接。连接器包括:构件规范性描述、消息分发器、对象模型、调用者API和其它服务接口。连接器各部分功能如下:①对象模型:为插拔式组装提出构件规范。②消息分发器:通过HTTP协议,使构件与连接器、连接器与服务器之间进行消息通信。消息分发器负责消息的传递,主要完成判断消息类型,传递消息内容等功能。③调用者API:连接器引用的服务,主要引用了构件的创建(插装)和销毁(拔出)等服务。④核心容器:进行插拔式组装提供的容器,包括了构件模板和视图模板,是连接器提供的接口服务和抽象类的集合。⑤其它服务接口:提供了核心功能外的其他接口,如日志管理接口、服务配置接口等,也为连接器扩展预留接口。
2构件组装实例
基于上述的思想,笔者实现了一个可视化的构件组装工具。组装工具主要包括构件管理和构件组装两部分,在插拔式构件组装系统中,构件分为4类:用户操作、内容管理、新闻、工具。每一类都包括了若干个构件。制作的构件都符合连接器与构件接口之间的规范,并使用XML对构件进行了统一描述,使用DOM树型结构显示在构件库界面上。系统提供了一个可视化的组装环境。在这个环境中,呈现为一个“白板”,而“白板”实际是连接器的表现形式。在组装时。随机挑选几个构件进行,包括时间构件、内容显示构件和用户登录构件。组装的主要流程如下:①从系统提供的一个主程序入口类——MainServlet类开始,传递待组装构件的消息,该类通过DOM技术加载构件描述文件。②连接器收到组装构件的消息更新消息并转发给服务器获取这些构件信息。③服务器接收到消息后,使用Map-ping方法映射到component class节点上,进行构件实例化。④调用getlnitParameter获取init-param视图节点信息,并把这些信息返回到连接器上。⑤如果要组装的构件的接口和连接器的接口匹配,构件就组装到连接器上;否则,组装失败。⑥最后,系统把组装好的web应用系统返回给用户。
3结束语
为了实现插拔式组装,论文研究了软件体系结构中的插头插座式体系结构、构件的规范化和接口匹配等技术。对比了现有的组装技术,设计了复合连接器和插拔式构件组装模型,并给出了插拔式组装系统的简单实现。