YMP-Online-Handbuch / 插件的实现及使用

插件的实现及使用

通过在一个实现了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.

:同一个插件可以实现多个业务接口,若多个插件实现同一个业务接口,根据插件加载顺序,最后加载的插件实例对象将替换前者;