# plugin **Repository Path**: flowerlan/plugin ## Basic Information - **Project Name**: plugin - **Description**: 插件模块 - **Primary Language**: Java - **License**: Apache-2.0 - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-09-20 - **Last Updated**: 2021-09-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # Plugin-Frame ## 1.概述 Plugin Frame是一套通用插件集成框架。 ## 2.设计思想 插件化开发思想。(参考 java SPI) 插件化开发具有2个明显的特点。 **1.可扩展** 插件通过接口的方式进行扩展。 **2.可插拔** 插件可以动态的添加或者移除。 ## 3.基本概念 ### 3.1插件分类 插件分为两类: 一类为本地插件,即classpath下的实现。 一类为三方插件,即jar包。 对于第三方实现的插件,我们约束如下: 1. 插件对应的依赖放在同级的lib目录下。 2. 如果不需要加载此插件,则在同级目录下新建一个.ignore文件,空文件,标识该插件不需要加载。 ## 4.适用场景 适用于各种插件化开发的场景,例如: 1.ETL平台的Task插件 2.调度平台的Job插件 2.数据源的Datasource插件 ## 5.使用 ### 5.1 定义插件的接口 ```java public interface IPluginInterface { void run(); } ``` ### 5.2定义插件的注解 注解用于描述插件的属性。 ```java @Documented @Retention(RetentionPolicy.RUNTIME) @Target(ElementType.TYPE) public @interface Job { String id(); String name(); String description() default ""; String category(); } ``` ### 5.3定义插件类型 通过泛型绑定3.1定义的接口类型。 通过构造函数绑定3.2定义的注解类型。 ```java public class IPluginType extends BasePluginType { public static IPluginType iPluginType = new IPluginType(Job.class); public IPluginType(Class annotation) { super(annotation); } public static IPluginType getInstance() { return iPluginType; } @Override protected String extractId(Annotation annotation) { return ((Job) annotation).id(); } @Override protected String extractName(Annotation annotation){ return ((Job) annotation).name(); } @Override protected String extractCategory(Annotation annotation) { return ((Job) annotation).category(); } @Override protected String extractDescription(Annotation annotation) { return ((Job) annotation).description(); } } ``` ### 5.4开发新插件 添加插件对应的注解。 实现插件对应的接口。 > 通过注解扫码插件,没有添加注解的插件将不会被注册。 > > 通过注解的ID标识插件,通过ID可以获取对应的插件实例。 ```java @Job( id = "plugin1", name = "插件一" ) public class Plugin1 implements IPluginInterface { @Override public void run() { System.out.println("从jar中加载"); } } ``` 将开发好的插件打成jar,放入"./jars"目录中。 ### 5.5 注册插件类型 ```java IPluginType pluginType = IPluginType.getInstance(); // 添加插件的目录 pluginType.addFolder(new Folder("./jars")); // 添加监听器 pluginType.addListener(new PluginListener() { @Override public void onAdd(PluginInterface pluginInterface) { System.out.println("插件被添加"); } @Override public void onRemove(PluginInterface pluginInterface) { System.out.println("插件被移除"); } @Override public void onChange(PluginInterface pluginInterface) { System.out.println("插件被修改"); } }); PluginRegistry registry = PluginRegistry.getInstance(); // 注册该插件类型 registry.register(IPluginType.getInstance()); ``` ### 5.6获取插件实例 ```java // 获取插件 PluginInterface pluginInterface = registry.getPluginById(IPluginType.class, "plugin1"); // 加载插件实例并调用 IPluginInterface iPluginInterface = registry.loadClass(pluginInterface); iPluginInterface.run(); ``` # Features ## 1.动态管理插件的生命周期 ### 支持动态添加插件 ### 支持停止现有插件 ## 2.支持第三方以jar包的形式提供插件 ## 3.插件间实现依赖隔离