1.什麽是pf4j?
一個外掛程式框架,用於實作外掛程式的 動態載入 ,支持的外掛程式格式(zip、jar)。
核心元件
場景
有一個 spring-boot 實作的web套用,在某一個業務功能上提供擴充套件點,使用者可以基於SDK實作功能擴充套件,要求可以管理外掛程式,並且能夠在業務功能擴充套件點處動態載入功能。
2.程式碼工程
實驗目的
實作外掛程式動態載入,呼叫 解除安裝
Demo整體架構
pf4j-api
匯入依賴
<dependency> <groupId>org.pf4j</groupId> <artifactId>pf4j</artifactId> <version>3.0.1</version></dependency>
自訂擴充套件介面,整合 ExtensionPoint ,標記為擴充套件點
package com.et.pf4j;import org.pf4j.ExtensionPoint;public interface Greeting extends ExtensionPoint { String getGreeting();}
打包給其他專案參照
pf4j-plugins-01
如果你想要能夠控制外掛程式的生命周期,你可以自訂類整合 plugin 重新裏面的方法
/* * Copyright (C) 2012-present the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */package org.pf4j.demo.welcome;import com.et.pf4j.Greeting;import org.apache.commons.lang.StringUtils;import org.pf4j.Extension;import org.pf4j.Plugin;import org.pf4j.PluginWrapper;import org.pf4j.RuntimeMode;/** * @author Decebal Suiu */public class WelcomePlugin extends Plugin { public WelcomePlugin(PluginWrapper wrapper) { super(wrapper); } @Override public void start() { System.out.println("WelcomePlugin.start()"); // for testing the development mode if (RuntimeMode.DEVELOPMENT.equals(wrapper.getRuntimeMode())) { System.out.println(StringUtils.upperCase("WelcomePlugin")); } } @Override public void stop() { System.out.println("WelcomePlugin.stop()"); } @Extension public static class WelcomeGreeting implements Greeting { @Override public String getGreeting() { return "Welcome ,my name is pf4j-plugin-01"; } }}
打成jar或者zip包,方便主程式載入
pf4j-app
載入外掛程式包
package com.et.pf4j;import org.pf4j.JarPluginManager;import org.pf4j.PluginManager;import org.springframework.boot.autoconfigure.SpringBootApplication;import java.nio.file.Paths;import java.util.List;@SpringBootApplicationpublic class DemoApplication {/* public static void main(String[] args) { SpringApplication.run(DemoApplication. class, args); }*/ public static void main(String[] args) { // create the plugin manager PluginManager pluginManager = new JarPluginManager(); // or "new ZipPluginManager() / new DefaultPluginManager()" // start and load all plugins of application //pluginManager.loadPlugins(); pluginManager.loadPlugin(Paths.get("D:\\IdeaProjects\\ETFramework\\pf4j\\pf4j-plugin-01\\target\\pf4j-plugin-01-1.0-SNAPSHOT.jar")); pluginManager.startPlugins(); /* // retrieves manually the extensions for the Greeting. class extension point List<Greeting> greetings = pluginManager.getExtensions(Greeting. class); System.out.println("greetings.size() = " + greetings.size()); */ // retrieve all extensions for "Greeting" extension point List<Greeting> greetings = pluginManager.getExtensions(Greeting. class); for (Greeting greeting : greetings) { System.out.println(">>> " + greeting.getGreeting()); } // stop and unload all plugins pluginManager.stopPlugins(); //pluginManager.unloadPlugins(); }}
以上只是一些關鍵程式碼,所有程式碼請參見下面程式碼倉庫
程式碼倉庫
3.測試
執行DemoApplication.java 裏面的main函數,可以看到外掛程式載入,呼叫以及解除安裝情況
4.參照