插件的实现及使用
通过在一个实现了IPlugin接口的类上声明@Plugin
注解来创建插件启动类,其将被插件工厂加载和管理,一个插件包可以包括多个插件启动类,每个插件启动类可以实现自己的业务接口对外提供服务;
-
@Plugin
注解参数说明:id:插件唯一ID,若未填写则使用初始化类名称进行MD5加密后的值做为ID;
name:插件名称,默认为"";
alias:插件别名,默认为"";
author:插件作者,默认为"";
email:联系邮箱,默认为"";
version:插件版本,默认为"1.0.0";
automatic:是否加载后自动启动运行,默认true;
description:插件描述,默认为"";
-
IPlugin接口方法说明:
init:插件初始化;
getPluginContext:返回插件环境上下文对象;
isInited:返回插件是否已初始化;
isStarted:返回插件是否已启动;
startup:启动插件;
shutdown:停止插件;
destroy:销毁插件对象;
插件框架提供了一个封装了IPlugin接口的AbstractPlugin抽象类,建议直接继承,示例代码:
@Plugin public class DemoPlugin extends AbstractPlugin { // 根据需要重写父类方法... }
结合业务接口的插件示例:
// 定义一个业务接口 public interface IBusiness { void sayHi(); } @Plugin(id = "demo_plugin", name = "DemoPlugin", author = "有理想的鱼", email = "suninformaiton#163.com", version = "1.0") public class DemoPlugin extends AbstractPlugin implements IBusiness { @Override public void startup() throws Exception { super.startup(); // System.out.println("started."); } @Override public void shutdown() throws Exception { super.shutdown(); // System.out.println("shutdown."); } public void sayHi() { System.out.println("Hi, from Plugin."); } }
插件的使用
上面我们已经创建了一个DemoPlugin插件并且实现了IBusiness业务接口,下面介绍如何使用插件和调用业务接口方法:
public static void main(String[] args) throws Exception { YMP.get().init(); try { DemoPlugin _plugin = (DemoPlugin) Plugins.get().getPluginFactory().getPlugin("demo_plugin"); // 或者 // _plugin = Plugins.get().getPluginFactory().getPlugin(DemoPlugin.class); // _plugin.sayHi(); // IBusiness _business = Plugins.get().getPluginFactory().getPlugin(IBusiness.class); _business.sayHi(); } finally { YMP.get().destroy(); } }
执行结果:
Hi, from Plugin. Hi, from Plugin. shutdown.
注:同一个插件可以实现多个业务接口,若多个插件实现同一个业务接口,根据插件加载顺序,最后加载的插件实例对象将替换前者;