插件的實作及使用


透過在一個實現了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.

:同一個外掛程式可以實作多個業務接口,若多個外掛實作同一個業務接口,根據外掛程式載入順序,最後載入的外掛實例物件將取代前者;