插件的實現(xiàn)及使用
通過在一個實現(xiàn)了IPlugin接口的類上聲明@Plugin
注解來創(chuàng)建插件啟動類,其將被插件工廠加載和管理,一個插件包可以包括多個插件啟動類,每個插件啟動類可以實現(xiàn)自己的業(yè)務(wù)接口對外提供服務(wù);
@Plugin
注解參數(shù)說明:id:插件唯一ID,若未填寫則使用初始化類名稱進(jìn)行MD5加密后的值做為ID;
name:插件名稱,默認(rèn)為"";
alias:插件別名,默認(rèn)為"";
author:插件作者,默認(rèn)為"";
email:聯(lián)系郵箱,默認(rèn)為"";
version:插件版本,默認(rèn)為"1.0.0";
automatic:是否加載后自動啟動運行,默認(rèn)true;
description:插件描述,默認(rèn)為"";
IPlugin接口方法說明:
init:插件初始化;
getPluginContext:返回插件環(huán)境上下文對象;
isInited:返回插件是否已初始化;
isStarted:返回插件是否已啟動;
startup:啟動插件;
shutdown:停止插件;
destroy:銷毀插件對象;
插件框架提供了一個封裝了IPlugin接口的AbstractPlugin抽象類,建議直接繼承,示例代碼:
@Plugin public class DemoPlugin extends AbstractPlugin { // 根據(jù)需要重寫父類方法... }
結(jié)合業(yè)務(wù)接口的插件示例:
// 定義一個業(yè)務(wù)接口 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."); } }
插件的使用
上面我們已經(jīng)創(chuàng)建了一個DemoPlugin插件并且實現(xiàn)了IBusiness業(yè)務(wù)接口,下面介紹如何使用插件和調(diào)用業(yè)務(wù)接口方法:
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(); } }
執(zhí)行結(jié)果:
Hi, from Plugin. Hi, from Plugin. shutdown.
注:同一個插件可以實現(xiàn)多個業(yè)務(wù)接口,若多個插件實現(xiàn)同一個業(yè)務(wù)接口,根據(jù)插件加載順序,最后加載的插件實例對象將替換前者;