一种加载插件的方法及电子终端与流程

文档序号:18213220发布日期:2019-07-19 22:27阅读:106来源:国知局
一种加载插件的方法及电子终端与流程

本申请涉及软件工程领域,尤其涉及一种加载插件的方法及电子终端。



背景技术:

在软件开发过程中,一款优秀的软件产品一定会具有一定的扩展能力,以满足不断变化的需求。

故而,在软件开发的过程中,就要考虑如何能够实现在将来的某个时间点为软件接入新的功能。例如apachelog4j2这款在java技术领域广泛使用的高性能日志框架。apachelog4j2日志框架就提供了基于其自定义的java注解的插件加载机制。但是,apachelog4j2是基于自定义注解的插件加载机制,需要为自定义的插件配置注解处理器,以解析apachelog4j2自定义的注解,然后生成响应的插件配置文件,才能为log4j2日志框架扩展新的功能。由此可见,目前提供的加载插件的机制十分复杂,



技术实现要素:

本发明了提供了一种加载插件的方法及电子终端,以解决或者部分解决目前提供的加载插件的机制复杂的技术问题。

为解决上述技术问题,本发明提供了一种加载插件的方法,所述方法包括:

获得插件配置文件,所述插件配置文件中包含多个插件,所述插件配置文件中的多个插件都对应一个插件接口,所述插件接口中定义的规则用来规范实现所述插件配置文件中的所有插件的调用;

解析所述插件配置文件,获得所述插件配置文件中的多个插件;

基于所述插件接口中定义的规则对所述插件配置文件中的多个插件进行排序,并基于所述排序加载对应顺序的插件。

优选的,所述获得插件配置文件,包括:

每隔预设时间间隔扫描电子终端的系统的classpath路径,进而获得所述插件配置文件。

优选的,所述插件配置文件中的多个插件具体包含:单独插件和插件组;

其中,所述单独插件是单独执行功能的插件;所述插件组中包含有多个插件,所述插件组内各插件在功能上相互协作。

优选的,所述插件接口中定义的规则具体包括:

所述插件配置文件中的多个插件状态监控规则;

所述插件配置文件中的多个插件各自的启动顺序;

所述插件配置文件中的多个插件各自的执行逻辑;

所述插件配置文件中的多个插件各自的退出逻辑。

优选的,所述解析所述插件配置文件,获得所述插件配置文件中的多个插件,具体包括:

依次创建plugindefine实例解析所述插件配置文件,使用map数据结构保存所述插件配置文件解析后获得的各插件;

使用java的反射接口api加载插件名称pluginname对应的类class实例化各插件。

优选的,所述使用java的反射接口api加载插件名称pluginname对应的类class实例化各插件之后,所述方法还包括:

采用list数据结构对实例化后的各插件进行保存。

优选的,所述基于所述插件接口中定义的规则对所述插件配置文件中的多个插件进行排序,并基于所述排序加载对应顺序的插件,具体包括:

按照所述插件配置文件中的多个插件各自的启动顺序,对所述插件配置文件中的多个插件进行排序,进而获得所述插件配置文件中的多个插件各自的排列顺序;

基于所述插件配置文件中的多个插件各自的排列顺序和所述插件配置文件中的多个插件各自的执行逻辑启动对应的插件。

本发明公开了一种电子终端,包括:

获得模块,用于获得插件配置文件,所述插件配置文件中包含多个插件,所述插件配置文件中的多个插件都对应一个插件接口,所述插件接口中定义的规则用来规范实现所述插件配置文件中的所有插件的调用;

解析模块,用于解析所述插件配置文件,获得所述插件配置文件中的多个插件;

加载模块,用于基于所述插件接口中定义的规则对所述插件配置文件中的多个插件进行排序,并基于所述排序加载对应顺序的插件。

优选的,所述获得模块,具体用于每隔预设时间间隔扫描系统的classpath路径,进而获得所述插件配置文件。

优选的,所述插件配置文件中的多个插件具体包含:单独插件和插件组;

其中,所述单独插件是单独执行功能的插件;所述插件组中包含有多个插件,各插件在功能上相互协作。

优选的,所述插件接口中定义的规则具体包括:

所述插件配置文件中的多个插件状态监控规则;

所述插件配置文件中的多个插件各自的启动顺序;

所述插件配置文件中的多个插件各自的执行逻辑;

所述插件配置文件中的多个插件各自的退出逻辑。

优选的,所述解析模块,具体包括:

创建模块,用于依次创建plugindefine实例解析所述插件配置文件,使用map数据结构保存所述插件配置文件解析后获得的各插件;

实例模块,用于使用java的反射接口api加载插件名称pluginname对应的类class实例化各插件。

优选的,所述电子终端还包括:

存储模块,用于使用java的反射接口api加载插件名称pluginname对应的类class实例化各插件之后,采用list数据结构对实例化后的各插件进行保存。

优选的,所述加载模块,具体包括:

排序模块,用于按照所述插件配置文件中的多个插件各自的启动顺序,对所述插件配置文件中的多个插件进行排序,进而获得所述插件配置文件中的多个插件各自的排列顺序;

启动模块,用于基于所述插件配置文件中的多个插件各自的排列顺序和所述插件配置文件中的多个插件各自的执行逻辑启动对应的插件。

本发明公开了一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现上述方法的步骤。

本发明公开了一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现上述方法的步骤。

通过本发明的一个或者多个技术方案,本发明具有以下有益效果或者优点:

本发明公开了一种加载插件的方法及电子终端,通过获得插件配置文件,所述插件配置文件中包含多个插件。所述插件配置文件中的多个插件都对应一个插件接口,利用了插件接口对大量的插件进行归类。另外,所述插件接口中定义的规则用来规范实现所述插件配置文件中的所有插件的调用。故而解析所述插件配置文件,获得所述插件配置文件中的多个插件之后,可以基于所述插件接口中定义的规则对所述插件配置文件中的多个插件进行排序,并基于所述排序加载对应顺序的插件。由此可见,本发明的插件配置文件由于对应有一个插件接口和多个插件,因此在加载插件时,只需要按照插件接口定义的插件处理规则进行加载即可,不需要解析大量的注解,并且不需要配置注解处理器,更加的简洁和灵活,无需进行繁琐的配置。

附图说明

图1为本发明实施例中一种加载插件的方法的实施过程图;

图2为本发明实施例中电子终端的示意图。

具体实施方式

为了使本申请所属技术领域中的技术人员更清楚地理解本申请,下面结合附图,通过具体实施例对本申请技术方案作详细描述。

由于目前的插件加载机制中,需要为自定义的插件配置注解处理器,用来解析apachelog4j2自定义的注解,然后生成响应的插件配置文件以进行插件加载,配置过程和加载过程都特别复杂。故而本发明公开了一种加载插件的方法,将插件的定义抽象为插件接口,将大量的插件按照插件接口进行划分,同一个插件接口对应的多个插件看做是同类插件,并且将对应属于同类的多个插件配置为一个插件配置文件。因此,每个插件配置文件对应有一个插件接口和多个插件,而这多个插件实际上都是对应一个插件接口的插件。具体的,插件接口中定义有插件处理规则,用来规范实现对应的多个插件的调用。通过上述配置方式可知,本发明的插件配置文件由于对应有一个插件接口和多个插件,因此在加载插件时,只需要按照插件接口定义的插件处理规则进行加载即可,不需要解析大量的注解,并且不需要配置注解处理器,更加的简洁和灵活,无需进行繁琐的配置。

为了进一步说明和解释本发明,参看图1,公开了一种加载插件的方法,该方法包括:

步骤11,获得插件配置文件。

在插件配置文件中,对应有一个插件接口和多个插件,也就是说,所述插件配置文件中的多个插件都对应一个插件接口。

而所述插件接口中定义有插件处理规则,用来规范实现所述插件配置文件中的所有插件的调用。

在具体的实施过程中,由于每个插件都定义了一个独立的功能,该功能是可插拔,即开发者可以根据需要选择是否在系统中引入和移除插件。系统中的其他功能不会受到引入和移除插件所影响。

而本发明实施例利用了插件接口,将插件配置文件中的多个插件对应一个插件接口,也就是说,在该插件配置文件中的所有插件的调用都必须通过插件接口进行调用,并且遵循插件接口中的插件处理规则。

插件接口对插件的定义进行了抽象,插件接口的定义如下所示。

publicinterfacebootservice{

booleanison();

intorder();

voidboot()throwsthrowable;

voidshutdown()throwsthrowable;

}

该插件接口定义了4种规则:

所述插件配置文件中的多个插件状态监控规则;

所述插件配置文件中的多个插件各自的启动顺序;

所述插件配置文件中的多个插件各自的执行逻辑;

所述插件配置文件中的多个插件各自的退出逻辑。

具体来说,插件接口中的ison定义的是多个插件状态监控规则,用于判断各插件是否启动,其具有boolean类型的返回值,true则表示启动该插件。

order定义的是多个插件各自的启动顺序,可以基于order()的返回值对各插件进行排序,例如定义序号小的优先启动或者序号大的优先启动等等,具体的顺序本发明不做限制。

boot定义的是多个插件各自的执行逻辑。具体来说,每个插件启动之后如何运行具有各自的执行逻辑,当然,各插件的执行逻辑是不同的。例如,插件表示一个后台服务,boot定义的是实现该后台服务的启动逻辑。

shutdown定义的是多个插件各自的退出逻辑,也就是插件如何退出的逻辑。假设该插件表示一个后台服务,shutdown则是实现该后台服务的退出逻辑,若后台服务以线程的方式运行,那么在该方法中可实现停止线程运行,并释放相应的资源(如数据库连接池或网络连接等)。

由此可见,插件接口实际上定义了多个插件的状态监控规则、各自的启动顺序、各自的执行逻辑、各自的退出逻辑。因此,在解析插件配置文件获得其包含的多个插件之后,则会按照插件接口中的插件处理规则处理各插件,包括插件的加载顺序、插件的运行逻辑、退出等等,后续会进行详细的说明。

而在获得插件配置文件之前,本发明实施例还包括:配置插件配置文件。

在配置插件配置文件的过程中,插件采用配置文件的方式,配置文件的名称使用:插件接口的包名加上插件接口的接口名的形式,假设bootservice为插件接口的接口名,插件接口的包名为a.b.c。则配置文件的名字需要定义为a.b.c.bootservice,在该配置文件中配置多个插件,例如:a.b.c.bootservicea,a.b.c.bootserviceb等等。

另外,所述插件配置文件中的多个插件具体包含:单独插件和插件组;其中,所述单独插件是单独执行功能的插件;所述插件组中包含有多个插件,所述插件组内的各插件在功能上相互协作。比如插件a生产数据,插件b消费插件a生产的数据。此时可以将插件a和插件b定义到同一个插件组中。

这样在加载插件的时候,如果插件组中的任意一个插件加载失败(具体表现为采用java语言的反射机制实例化插件失败)。那么该插件组下的所有插件都不会被加载。以下给出插件配置示例。

a.b.c.bootservice

group1=e.f.g.bootservicea

group1=e.f.g.bootserviceb

group2=e.f.g.bootservicec

其中a.b.c.bootservice为插件的配置文件名。在该插件配置文件中定义了三个插件,bootservicea和bootserviceb属于插件组group1,bootservicec属于插件组group2。

进一步的,由于插件配置文件放到电子终端的系统的classpath路径下。故而,在获得插件配置文件的具体实施过程中,每隔预设时间间隔扫描系统的classpath路径,进而获得所述插件配置文件。在扫描到插件配置文件后进入到下一个处理环节。

步骤12,解析所述插件配置文件,获得所述插件配置文件中的多个插件。

具体来说,解析所述插件配置文件,获得所述插件配置文件中的多个插件,具体包括:依次创建plugindefine实例解析所述插件配置文件,使用map数据结构保存所述插件配置文件解析后获得的各插件;使用java的反射接口api加载插件名称pluginname对应的类class实例化各插件。

在具体的解析过程中,首先会读取获得的插件配置文件,对于读取到的每行内容,都会创建一个plugindefine实例来与之对应,并使用map数据结构保存插件配置文件中的解析结果(其中,map的key为插件的组名,value为插件名,插件名采用插件的包名加上插件的类名的方式定义)。在该步骤中,在解析插件配置文件的过程中,实际上是将获得的多个插件按照一定的规则进行存储,以便于后续的解析。其次,使用java的反射接口api加载pluginname对应的类class并实例化插件。在实例化插件的时候会检测插件的类型是否是插件配置文件名所表示的插件接口类型。插件实例化后采用list数据结构进行保存(对于插件的ison方法返回false(错误)的插件则不会保存在list数据结构中)。

步骤13,基于所述插件接口中定义的规则对所述插件配置文件中的多个插件进行排序,并基于所述排序加载对应顺序的插件。

在具体的实施过程中,按照所述插件配置文件中的多个插件各自的启动顺序,对所述插件配置文件中的多个插件进行排序,进而获得所述插件配置文件中的多个插件各自的排列顺序;基于所述插件配置文件中的多个插件各自的排列顺序和所述插件配置文件中的多个插件各自的执行逻辑启动对应的插件。

也就是说,在启动插件之前需要先对插件进行排序,排序的依据是插件的order方法的返回值,然后插件加载根据排序后的插件顺序依次执行插件的boot方法以启动插件。如果在插件加载程序在加载插件的boot方法时遇到了异常,则该异常会阻止程序的正常启动。

作为一种可选的实施例,在基于所述插件接口中定义的规则对所述插件配置文件中的多个插件进行排序,并基于所述排序加载对应顺序的插件之后,所述方法还包括:基于所述插件接口中定义的多个插件各自的退出逻辑依次关闭多个插件。

而在jvm的shutdownhook中按照插件启动顺序的逆序一次调用插件的shutdown方法。也就是说,所述多个插件各自的退出逻辑和所述多个插件各自的启动顺序相反。

基于同一发明构思,下面的实施例介绍一种电子终端。

参看图2,该电子终端包括:

获得模块21,用于获得插件配置文件,所述插件配置文件中包含多个插件,所述插件配置文件中的多个插件都对应一个插件接口,所述插件接口中定义的规则用来规范实现所述插件配置文件中的所有插件的调用;

解析模块22,用于解析所述插件配置文件,获得所述插件配置文件中的多个插件;

加载模块23,用于基于所述插件接口中定义的规则对所述插件配置文件中的多个插件进行排序,并基于所述排序加载对应顺序的插件。

作为一种可选的实施例,所述获得模块21,具体用于每隔预设时间间隔扫描系统的classpath路径,进而获得所述插件配置文件。

作为一种可选的实施例,所述插件配置文件中的多个插件具体包含:单独插件和插件组;

其中,所述单独插件是单独执行功能的插件;所述插件组中包含有多个插件,所述插件组内的各插件在功能上相互协作。

作为一种可选的实施例,所述插件接口中定义的规则具体包括:

所述插件配置文件中的多个插件状态监控规则;

所述插件配置文件中的多个插件各自的启动顺序;

所述插件配置文件中的多个插件各自的执行逻辑;

所述插件配置文件中的多个插件各自的退出逻辑。

作为一种可选的实施例,所述解析模块22,具体包括:

创建模块,用于依次创建plugindefine实例解析所述插件配置文件,使用map数据结构保存所述插件配置文件解析后获得的各插件;

实例模块,用于使用java的反射接口api加载插件名称pluginname对应的类class实例化各插件。

作为一种可选的实施例,所述电子终端还包括:

存储模块,用于使用java的反射接口api加载插件名称pluginname对应的类class实例化各插件之后,采用list数据结构对实例化后的各插件进行保存。

作为一种可选的实施例,所述加载模块23,具体包括:

排序模块,用于按照所述插件配置文件中的多个插件各自的启动顺序,对所述插件配置文件中的多个插件进行排序,进而获得所述插件配置文件中的多个插件各自的排列顺序;

启动模块,用于基于所述插件配置文件中的多个插件各自的排列顺序和所述插件配置文件中的多个插件各自的执行逻辑启动对应的插件。

基于与前述实施例中同样的发明构思,本发明还提供一种计算机可读存储介质,其上存储有计算机程序,该程序被处理器执行时实现前文任一所述方法的步骤。

基于与前述实施例中同样的发明构思,本发明还提供一种计算机设备,包括存储器、处理器及存储在存储器上并可在处理器上运行的计算机程序,所述处理器执行所述程序时实现前文任一所述方法的步骤。

通过本发明的一个或者多个实施例,本发明具有以下有益效果或者优点:

本发明公开了一种加载插件的方法及电子终端,通过获得插件配置文件,所述插件配置文件中包含多个插件。所述插件配置文件中的多个插件都对应一个插件接口,利用了插件接口对大量的插件进行归类。另外,所述插件接口中定义的规则用来规范实现所述插件配置文件中的所有插件的调用。故而解析所述插件配置文件,获得所述插件配置文件中的多个插件之后,可以基于所述插件接口中定义的规则对所述插件配置文件中的多个插件进行排序,并基于所述排序加载对应顺序的插件。由此可见,本发明的插件配置文件由于对应有一个插件接口和多个插件,因此在加载插件时,只需要按照插件接口定义的插件处理规则进行加载即可,不需要解析大量的注解,并且不需要配置注解处理器,更加的简洁和灵活,无需进行繁琐的配置。

尽管已描述了本申请的优选实施例,但本领域内的普通技术人员一旦得知了基本创造性概念,则可对这些实施例作出另外的变更和修改。所以,所附权利要求意欲解释为包括优选实施例以及落入本申请范围的所有变更和修改。

显然,本领域的技术人员可以对本申请进行各种改动和变型而不脱离本申请的精神和范围。这样,倘若本申请的这些修改和变型属于本申请权利要求及其等同技术的范围之内,则本申请也意图包含这些改动和变型在内。

当前第1页1 2 
网友询问留言 已有0条留言
  • 还没有人留言评论。精彩留言会获得点赞!
1