首页  

pf4j 例子说明     所属分类 pf4j 浏览量 131
PF4J
Java轻量级插件框架,可实现动态加载,执行,卸载外部插件(支持jar zip)



核心组件
Plugin  
所有插件的基类 ,每个插件被加载到一个单独的类加载器中避免冲突

PluginManager
管理插件 加载 启动 停止
内置实现 JarPluginManager, ZipPluginManager, DefaultPluginManager(JarPluginManager+ ZipPluginManager)
AbstractPluginManager( 实现工厂方法) 自定义插件管理器

PluginLoader  

ExtensionPoint  java接口标记  ,java 接口 或 抽象类 可标记为扩展点(实现ExtensionPoint接口)

Extension   java注解  扩展点的实现 



plugin-api 定义可扩展接口 ,插件实现 放到一个单独的 plugin-core 模块中,然后打成jar包,放到主程序 plugin-app 的 plugins目录 plugins 插件目录,存放插件的jar包 从该目录加载插件 plugin-app 主程序,依赖 plugin-api ,加载并执行 plugins
自定义扩展接口,继承 ExtensionPoint ,标记为扩展点 public interface Greeting extends ExtensionPoint { String getGreeting(); } 使用 @Extension注解 自定义类扩展类,实现扩展接口 @Extension public class WelcomeGreeting implements Greeting { public String getGreeting() { return "Welcome"; } } 如果想控制插件的生命周期,可自定义类 继承 plugin public class WelcomePlugin extends Plugin { public WelcomePlugin(PluginWrapper wrapper) { super(wrapper); // you can use "wrapper" to have access to the plugin context (plugin manager, descriptor, ...) } @Override public void start() { System.out.println("WelcomePlugin.start()"); } @Override public void stop() { System.out.println("WelcomePlugin.stop()"); } @Override public void delete() { System.out.println("WelcomePlugin.delete()"); } } MANIFEST.MF 插件信息 Manifest-Version: 1.0 Archiver-Version: Plexus Archiver Created-By: Apache Maven Built-By: decebal Build-Jdk: 1.6.0_17 Plugin-Class: org.pf4j.demo.welcome.WelcomePlugin Plugin-Dependencies: x, y, z Plugin-Id: welcome-plugin Plugin-Provider: Decebal Suiu Plugin-Version: 0.0.1 主程序加载插件 public static void main(String[] args) { ... // create the plugin manager // or new ZipPluginManager() / new DefaultPluginManager() PluginManager pluginManager = new JarPluginManager(); // start and load all plugins of application pluginManager.loadPlugins(); pluginManager.startPlugins(); // retrieve all extensions for "Greeting" extension point List greetings = pluginManager.getExtensions(Greeting.class); for (Greeting greeting : greetings) { System.out.println(">>> " + greeting.getGreeting()); } // stop and unload all plugins pluginManager.stopPlugins(); pluginManager.unloadPlugins(); ... }

上一篇     下一篇
guice根据名字注入消除歧义

scala函数式与非函数式写法比较

scala Int 与 Integer的区别

Maven 打包 定制 manifest

pf4j 实例

Jooq 简介及实例