组件的集成方法及装置 【技术领域】
本发明涉及计算机技术领域,具体而言,涉及一种组件的集成方法及装置。
背景技术
近些年,随着信息技术的广泛应用,软件功能越来越复杂。典型的企业应用通常基于3层架构。从后端到前端分别是数据访问层、业务逻辑层和界面表示层。其中,业务逻辑层通常是由强类型静态语言技术来实现,如Java和C#技术等。在比较复杂的企业应用中,模块与模块之间的往往存在业务上的耦合,直观地表现在业务逻辑层的代码就是,在一个方法中,存在着调用其它各个模块服务的代码,由于一个方法本身包含的处理逻辑在开发期就已经确定了下来,这使得应用的开发者没有办法根据需要来定制页面中的界面逻辑包含的范围,并根据特定的需要,来方便的增加或者减少已经有方法中包含的服务调用代码。
在相关技术中,主要涉及三种组件的集成方法:
1.传统开发方式:开发者会在开发期就确定了各个方法的逻辑,比如一个应用程序包含三个模块A、B和C,其中在模块A内,开发者开发了一个通用功能a,这个功能需要调用另外两个模板的服务方法。
2.OSGi方案:由JCP组织(ww.jcp.org)提出的JSR-291。目前最成熟的应用是Eclipse。通过OSGi方案能够支持组件独立开发和发布,并通过管理器可进行组件的安装、应用、禁用和卸载,而不需要重启系统。
3.SCA方案:由OSOA组织提交的SCA方案。目前没有成熟应用。通过SCA方案可以支持组件独立开发和发布,并且能通过管理工具进行服务编排组织成为新的服务。
以下针对不同场景,分析三种方法的应用过程:
场景一:进行全新开发时。
1.传统开发方式:分别开发三个模块;开发功能a时,在功能a中分别调用模块B和C的程序接口。
2.OSGi方案:分别开发三个模块;开发功能a时,在功能a中设置调用点,分别调用模块B和C的程序接口;通过插件管理器将功能a的调用点结合B和C的程序接口。
3.SCA方案:分别开发三个模块;开发功能a时,在功能a中设置调用点,分别调用模块B和C的程序接口;通过服务编排工具将功能a的调用点结合B和C的程序接口。
场景二:需要新增加一个模块时。
1.传统开发方式:开发新的模块;修改功能a代码,新增调用新模块的程序接口。
2.OSGi方案:开发新的模块;通过插件管理器将功能a的调用点添加新模块的程序接口。
3.SCA方案:开发新的模块;通过服务编排工具将功能a的调用点添加新模块的程序接口。
场景三:需要删除一个模块时。
1.传统开发方式:修改功能a代码,删除掉原来的调用该模块的程序代码。
2.OSGi方案:通过插件管理器将功能a的调用点去除模块的程序接口。
3.SCA方案:通过服务编排工具将功能a的调用点去除模块的程序接口。
场景四:需要部署B模块的定制修改时。
1.传统开发方式:修改功能a代码,修改原有调用B模块代码为新代码。
2.OSGi方案:通过插件管理器发布新增新的程序接口为fragment类型。但是无法屏蔽调用点本身。
3.SCA方案:通过服务编排工具将功能a的调用点去除原有模块的程序接口,新增新的程序接口,但是无法屏蔽调用点本身。
场景五:需要调整同步执行策略为异步执行策略时。
1.传统开发方式:修改功能a代码,修改调用代码方式为异步执行方式。
2.OSGi方案:不支持。
3.SCA方案:不支持。
场景六:需要调整执行的事务控制策略。
1.传统开发方式:修改功能a代码,修改原有的代码调用事务控制方式。
2.OSGi方案:不支持。
3.SCA方案:通过修改配置文件,调整事务控制方式。
从上面的六个应用开发过程常见的场景中可以看出:在传统开发方式下为了新增加、减少或者调整一个模块,开发者需要频繁地修改功能a,在修改中稍有不慎,将对整个应用的运行造成影响,导致系统运行可靠性低。其方案对于模块灵活增加或者减少的支持非常不好,每块模块的变动都要影响整个应用,使系统不便于维护。这样,如上面的场景,功能a成为了耦合各个模块的问题滋生点之一。而OSGi方案和SCA方案,开发过程相对容易,但存在部分场景不支持的情况。
因此,无论OSGi还是SCA方案都对系统开发是强侵入,一旦使用就变成强绑定,对后续方案切换带来巨大影响;同时对系统开发和测试带来一定的困难,也使得系统不便于维护。
针对相关技术中组件集成方案存在着影响系统可靠性和可维护性的不足并且不支持有些场景的应用的问题,目前尚未提出有效的解决方案。
【发明内容】
本发明实施例的主要目的在于提供一种组件地集成方法,以解决现有技术中的组件的集成方案所存在的影响系统可靠性和可维护性的不足、并且不支持有些场景的应用的问题。
为了实现上述目的,根据本发明的一个方面,提供了一种组件的集成方法。
本发明的组件的集成方法包括:根据预存的代理程序的定义格式以及适配程序的定义格式,分别生成对应于第一组件的调用接口的代理程序以及对应于第二组件的实现程序的适配程序,并保存所述代理程序和所述适配程序之间的对应关系;所述第一组件调用所述代理程序,所述代理程序根据所述对应关系确定自身对应的适配程序并调用所述适配程序,该适配程序调用自身对应的第二组件的实现程序,以实现第一组件与第二组件的集成。
优选地,所述代理程序的定义格式包括代理程序的标识和接口类型;所述适配程序的定义格式包括适配程序的标识和对应的代理程序的接口类型,以及所述实现程序的获取方式。
优选地,分别生成对应于第一组件的调用接口的代理程序以及对应于第二组件的实现程序的适配程序之后,所述方法还包括:确认不需调用所述第二组件;删除保存的所述适配程序的定义格式。
优选地,分别生成对应于第一组件的调用接口的代理程序以及对应于第二组件的实现程序的适配程序之前,所述方法还包括:保存第一组件的代理程序的定义格式以及所述适配程序的定义格式。
优选地,保存第一组件的代理程序的定义格式以及所述适配程序的定义格式包括:根据系统支持的集成类型来保存代理程序的定义格式和适配程序的定义格式。
优选地,第一组件调用所述代理程序之前,所述方法还包括:保存所述代理程序与适配程序的有效性信息;代理程序根据所述对应关系确定自身对应的适配程序包括:所述代理程序调用中介服务程序;所述中介服务程序根据所述有效性信息确认所述代理程序为有效,然后根据所述有效性信息和所述对应关系调用有效的适配程序。
为了实现上述目的,根据本发明的另一方面,提供了一种组件的集成装置。
本发明的组件的集成装置包括:生成模块,用于根据所述代理程序的定义格式以及所述适配程序的定义格式,分别生成对应于第一组件的调用接口的代理程序以及对应于第二组件的实现程序的适配程序;存储模块,用于存储所述代理程序和所述适配程序之间的对应关系;调用模块,用于使所述代理程序根据所述对应关系确定自身对应的适配程序并调用所述适配程序,以及使所述适配程序调用自身对应的第二组件实现程序,以实现第一组件与第二组件的集成。
优选地,所述装置还包括:保存模块,用于保存所述代理程序的定义格式以及所述适配程序的定义格式。
优选地,所述存储模块还用于保存所述代理程序与适配程序的有效性信息;并且所述装置还包括:中介服务模块,用于根据所述有效性信息确认代理程序为有效,然后根据所述有效性信息和所述对应关系调用有效的适配程序;以及,所述调用模块具体用于使所述代理程序调用所述中介服务模块以调用有效的适配程序,以及使所述适配程序调用自身对应的第二组件实现程序,以实现第一组件与第二组件的集成。
优选地,所述装置还包括确认模块,用于确认不需调用第二组件;并且保存模块还用于确认模块确认后删除保存的适配程序的定义格式;存储模块还用于确认模块确认后在保存的有效性信息中设置对应于第二组件实现程序的适配程序为无效。
通过本发明,采用根据预存的代理程序的定义格式以及适配程序的定义格式,分别生成对应于第一组件的调用接口的代理程序以及对应于第二组件的实现程序的适配程序;第一组件调用代理程序,代理程序根据对应关系确定自身对应的适配程序,该适配程序调用自身对应的第二组件的实现程序,以实现第一组件与第二组件的集成,解决了现有技术中的组件集成方案所存在的影响系统可靠性和可维护性的不足、并且不支持有些场景的应用的问题,进而达到了提高应用程序的灵活性以及提高系统的可靠性和可维护性的效果。
【附图说明】
此处所说明的附图用来提供对本发明的进一步理解,构成本申请的一部分,本发明的示意性实施例及其说明用于解释本发明,并不构成对本发明的不当限定。在附图中:
图1是根据本发明实施例的组件的集成方法的基本步骤流程图;
图2是根据本发明实施例的第一组件、代理程序、适配程序以及第二组件的关系示意图;
图3是根据本发明实施例的组件的集成方法的具体步骤流程图;
图4是根据本发明实施例的组件的集成装置的基本结构示意图;
图5是根据本发明实施例的组件的集成装置的第二种结构示意图;
图6是根据本发明实施例的组件的集成装置的第三种结构示意图。
【具体实施方式】
需要说明的是,在不冲突的情况下,本申请中的实施例及实施例中的特征可以相互组合。下面将参考附图并结合实施例来详细说明本发明。
图1是根据本发明实施例的组件的集成方法的基本步骤流程图。
需要说明的是,该图中示出的步骤可以在诸如一组计算机可执行指令的计算机系统中执行,并且,虽然在流程图中示出了逻辑顺序,但是在某些情况下,可以以不同于此处的顺序执行所示出或描述的步骤。
如图1所示,该方法包括如下的步骤S102和步骤S104:
步骤S102:生成对应于第一组件的调用接口的代理程序以及对应于第二组件的实现程序的适配程序,并保存生成的代理程序与适配程序之间的对应关系。在本步骤中,具体是根据预存的代理程序的定义格式以及适配程序的定义格式来生成代理程序和适配程序。
步骤S104:第一组件通过调用代理程序来实现第一组件与第二组件的集成。在本步骤中,在第一组件调用代理程序之后,该被调用的代理程序根据代理程序与适配程序之间的对应关系确定自身对应的适配程序并调用该适配程序,该适配程序调用自身对应的第二组件的实现程序,以实现第一组件与第二组件的集成。
图2是根据本发明实施例的第一组件、代理程序、适配程序以及第二组件的关系示意图。
本实施例中的第一组件、代理程序、适配程序以及第二组件的关系如图2所示,从该图中可以看出,本实施例中第一组件与第二组件之间呈现一种松耦合的关系,这样在组件集成时无需对组件本身作过多的修改,而是可以灵活地生成所需的代理程序与适配程序,一方面提高了系统的可靠性,另一方面也使得系统的可维护性得到了增强。
图3是根据本发明实施例的组件的集成方法的具体步骤流程图。
如图3所示,该方法包括如下的步骤S302至步骤S314:
步骤S302:保存第一组件的代理程序的定义格式以及适配程序的定义格式。
在本步骤中,代理程序的定义格式包括代理程序的标识和接口类型,适配程序的定义格式包括适配程序的标识和对应的代理程序的接口类型,以及实现程序的获取方式。这里的获取方式,例如可以是实现程序的标识,根据该标识,系统能够获取所述实现程序;也可以是实现程序的名称,根据该名称,系统能够把所述实现程序加载实例化。下面举两个集成类型的例子对代理程序的定义格式以及适配程序的定义格式作出说明。
集成类型一:事件和监听器。
其中,事件是代理程序,监听器为适配程序,其对应关系为1:n,此处n为不小于0的整数。
事件的定义规格如下:
<component:event id=″commandDefinitionEvent″
interface=″com.ruijie.dot.event.CommandDefinitionEvent″/>
表示这个事件全局唯一id标识是“commandDefinitionEvent”,而接口类型为CommandDefinitionEvent。
监听器的定义规格如下:
<component:listener id=″commandDefinitionEventListener″
event=″type:com.ruijie.dot.event.CommandDefinitionEvent″
listener=″class:com.ruijie.dot.listener.CommandDefinitionListener″/>
表示模块B中存在一个ID标识是“commandDefinitionEventListener”的监听器,对应的事件是上面提到的“commandDefinitionEvent”,对应的程序是“com.ruijie.dot.listener.CommandDefinitionListener”。
集成类型二:依赖和适配器。
其中,依赖是代理程序,适配器为适配程序,其对应关系为1:m,其中,m=0或1。
依赖的定义规格如下:
<component:dependency id=″topoPerformanceProvider″
interface=″com.ruijie.topology.internal.TopoPerformanceProvider″/>
表示这个事件全局唯一id标识是“topoPerformanceProvider”,而接口类型为TopoPerformanceProvider。
适配器的定义规格如下:
<component:adapter id=″topoPerformanceProviderAdapter″
interface=″com.ruijie.topology.internal.TopoPerformanceProvider″
adapter=″class:com.ruijie.topology.integration.TopoPerfProviderImpl″/>
上述XML文档可以保存在组件的集成配置文件中。在系统能够支持多种集成类型的情况下,可以是根据当前需要的一种或多种集成类型来保存对应于其中每种集成类型的代理程序的定义格式以及适配程序的定义格式。
步骤S304:生成对应于第一组件调用接口的代理程序以及对应于第二组件实现程序的适配程序。在本步骤中,扫描当前所有组件的集成配置文件,根据文件中的内容生成代理程序和适配程序。本步骤通常在系统启动之后首先进行。
步骤S306:保存代理程序和适配程序之间的对应关系。这里的代理程序和适配程序是步骤S304中生成的,二者的对应关系可以保存在集成关系注册库中。
步骤S308:第一组件通过调用接口调用代理程序。
步骤S310:代理程序根据和适配程序之间的对应关系确定自身对应的适配程序并调用该适配程序。这里的代理程序为步骤S308中调用的代理程序。在本步骤中,代理程序可以通过调用中介服务程序来确定自身对应的适配程序,并且该中介服务程序可以判断适配程序的有效性。在本实施例中,在第一组件调用代理程序之前保存代理程序与适配程序的有效性信息;当代理程序调用中介服务程序后,该中介服务程序根据所述有效性信息确认代理程序为有效,然后根据所述有效性信息和代理程序与适配程序之间的对应关系获得所有有效的适配程序,接下来调用这些适配程序。对于这里的有效性信息,可以是根据系统支持的集成类型确定所述代理程序与适配程序的有效性信息然后保存。例如以下面的方式进行保存:
<component:event-disable event=”commandDefinitionEvent”/>
<component:listener-disablelistener=”commandDefinitionEventListener”/>
本实施例中引入代理程序与适配程序有效性的属性,这样能够通过对代理程序与适配程序有效性的设置来实现对二者的有选择性地调用,从而有助于组件集成的优化。
步骤S312:适配程序调用自身对应的第二组件实现程序。这里的适配程序为步骤S310中确定的适配程序。至本步骤,实现了第一组件与第二组件的集成。在本步骤之后,如果确认不再需要集成第二组件时,可以继续执行步骤S314。
步骤S314:对第二组件的相关内容作出修改。在本步骤中可以删除保存的适配程序的定义格式,或者在所述适配程序的有效性信息中设置对应于第二组件实现程序的适配程序为无效。在需要集成第二组件时,还可将适配程序有效性信息修改为有效,这样能够灵活地实现对第二组件的取舍。此外也可以移除第二组件的所有信息,以节省系统的存储空间。
图4是根据本发明实施例的组件的集成装置的基本结构示意图。
如图4所示,该装置包括生成模块41、存储模块42和调用模块43,其中:
生成模块41用于根据第一组件的代理程序的定义格式以及适配程序的定义格式,分别生成对应于第一组件调用接口的代理程序以及对应于第二组件实现程序的适配程序;
存储模块42用于保存代理程序和适配程序之间的对应关系;
调用模块43,用于使代理程序根据代理程序与适配程序的对应关系确定自身对应的适配程序并调用所述适配程序,以及使适配程序调用自身对应的第二组件实现程序,以实现第一组件与第二组件的集成。
图5是根据本发明实施例的组件的集成装置的第二种结构示意图。
如图5所示,该装置可以进一步包括保存模块44,用于保存第一组件的代理程序的定义格式以及适配程序的定义格式。该保存模块44可进一步用于根据系统支持的集成类型确定代理程序的定义格式和适配程序的定义格式然后保存。
图6是根据本发明实施例的组件的集成装置的第三种结构示意图。
图6中的组件的集成装置同样包含存储模块42,与图4和图5相比,图6中的组件的集成装置还包含中介服务模块45。在图6中,存储模块42还可以用于保存代理程序与适配程序的有效性信息。
中介服务模块45用于根据有效性信息确认代理程序为有效,然后根据代理程序与适配程序的有效性信息和代理程序与适配程序的对应关系来调用有效的适配程序,在此处可以是获得所有有效的适配程序。这样,调用模块43还用于调用中介服务模块45以调用有效的适配程序,以及使适配程序调用自身对应的第二组件实现程序,以实现第一组件与第二组件的集成。
图6所示的组件集成装置可以进一步包括确认模块,用于确认不需调用第二组件。这样,保存模块44可进一步用于在确认模块确认后删除保存的适配程序的定义格式,存储模块42也可以进一步用于在确认模块确认后,在保存的有效性信息中设置对应于第二组件实现程序的适配程序为无效。
从以上的描述中,可以看出,应用本实施例的技术方案,解除了模块间的应用程序逻辑耦合,从而提高了应用程序的灵活性,避免了已有组件技术方案的侵入性问题,提高了系统的可靠性和可维护性。本实施例中的技术方案可以适配现有组件标准方案,有效利用现有标准的成果,开发者也可以根据需要灵活地调整系统包含的模块,从而支持各种场景的应用,能够更好地满足用户的需求。
显然,本领域的技术人员应该明白,上述的本发明的各模块或各步骤可以用通用的计算装置来实现,它们可以集中在单个的计算装置上,或者分布在多个计算装置所组成的网络上,可选地,它们可以用计算装置可执行的程序代码来实现,从而,可以将它们存储在存储装置中由计算装置来执行,或者将它们分别制作成各个集成电路模块,或者将它们中的多个模块或步骤制作成单个集成电路模块来实现。这样,本发明不限制于任何特定的硬件和软件结合。
以上所述仅为本发明的优选实施例而已,并不用于限制本发明,对于本领域的技术人员来说,本发明可以有各种更改和变化。凡在本发明的精神和原则之内,所作的任何修改、等同替换、改进等,均应包含在本发明的保护范围之内。