插件的实现及使用


通过在一个实现了IPlugin接口的类上声明@Plugin注解来创建插件启动类,其将被插件工厂加载和管理,一个插件包可以包括多个插件启动类,每个插件启动类可以实现自己的业务接口对外提供服务;@Plugin注解来创建插件启动类,其将被插件工厂加载和管理,一个插件包可以包括多个插件启动类,每个插件启动类可以实现自己的业务接口对外提供服务;

  • @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.

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