天天看点

使用PF4J实现插件化系统-入门

在进行业务平台型系统开发时,常常遇到接口大致相同,但是不同的业务的场景,其实现却有所不同。在分工方面,不同的业务场景,可能是不同的开发人员。这时就可以通过插件化的方式,针对不同的业务场景,实现不同的插件,来满足业务的需求。

pf4j是一个java轻量级的插件框架,使用pf4j可以轻松的将一个java应用转成一个插件化的应用。其拥有最小的依赖关系和很强的扩展性。

目前pf4j的最新是1.3.0。以下示例我们都以这个版本为例。

工程结构

插件化的工程结构如上:

api:定义可扩展的接口,其他插件实现这里所定义的接口。在实际的工程中,定义可扩展点的接口是比较难的地方

app:运行程序,这里是程序的入口。插件直接拷贝至指定的目录,app就可以找到指定的插件

plugins:插件模块,这里实现api中所定义的接口。在实际的工程中,这部分可以是单独的代码库,其依赖api以及项目的一些基础模块

定义可扩展接口

我们先来定义api的接口

这里我们定义了一个greeting接口。

以上我们继承了extensionpoint接口,用于标记这个接口是提供一个扩展点。pf4j任何在接口和抽象类都可以继承它。

实现插件

接下来我们实现插件

@extension

public class chinesegreeting implements greeting {

}<code>`</code>

以上就实现了中文版的插件。

同样英文版插件如下:

在以上代码中,我们使用了defaultpluginmanager插件管理器,在实际使用中,也可以自己是插件管理器。在这里我们读取/app/plugins目录下的所有的插件。

第二步,加载插件。这里会把所有的插件的class加载到pluginclassloader中,为避免冲突,每个插件都有自己的pluginclassloader。

第三步,启动插件。这里很简单就是把所有的插件调用start方法,启动插件,并且把插件的状态设置成started

第四步,运行插件。这里我们通过获取所有greeting的实现运行插件。pluginmanager还有一些其他接口,满足我们不同的业务场景。

运行

对以上插件进行打包,并把插件拷贝至指定的目录,运行以上main方法,结果如下