插件的實(shí)現(xiàn)及使用

2018-12-24 22:30 更新

通過(guò)在一個(gè)實(shí)現(xiàn)了IPlugin接口的類上聲明@Plugin注解來(lái)創(chuàng)建插件啟動(dòng)類,其將被插件工廠加載和管理,一個(gè)插件包可以包括多個(gè)插件啟動(dòng)類,每個(gè)插件啟動(dòng)類可以實(shí)現(xiàn)自己的業(yè)務(wù)接口對(duì)外提供服務(wù);

  • @Plugin注解參數(shù)說(shuō)明:

    id:插件唯一ID,若未填寫(xiě)則使用初始化類名稱進(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:是否加載后自動(dòng)啟動(dòng)運(yùn)行,默認(rèn)true;

    description:插件描述,默認(rèn)為"";

  • IPlugin接口方法說(shuō)明:

    init:插件初始化;

    getPluginContext:返回插件環(huán)境上下文對(duì)象;

    isInited:返回插件是否已初始化;

    isStarted:返回插件是否已啟動(dòng);

    startup:?jiǎn)?dòng)插件;

    shutdown:停止插件;

    destroy:銷毀插件對(duì)象;

插件框架提供了一個(gè)封裝了IPlugin接口的AbstractPlugin抽象類,建議直接繼承,示例代碼:

@Plugin
public class DemoPlugin extends AbstractPlugin {
    // 根據(jù)需要重寫(xiě)父類方法...
}

結(jié)合業(yè)務(wù)接口的插件示例:

// 定義一個(gè)業(yè)務(wù)接口
public interface IBusiness {
    void sayHi();
}

@Plugin(id = "demo_plugin",
        name = "DemoPlugin",
        author = "有理想的魚(yú)",
        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)建了一個(gè)DemoPlugin插件并且實(shí)現(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.

:同一個(gè)插件可以實(shí)現(xiàn)多個(gè)業(yè)務(wù)接口,若多個(gè)插件實(shí)現(xiàn)同一個(gè)業(yè)務(wù)接口,根據(jù)插件加載順序,最后加載的插件實(shí)例對(duì)象將替換前者;

以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)