SpringBoot集成pf4j實現(xiàn)插件開發(fā)功能的代碼示例
1.什么是pf4j?
一個插件框架,用于實現(xiàn)插件的動態(tài)加載,支持的插件格式(zip、jar)。
核心組件
- **Plugin:**是所有插件類型的基類。每個插件都被加載到一個單獨的類加載器中以避免沖突。
- **PluginManager:**用于插件管理的所有方面(加載、啟動、停止)。您可以使用內(nèi)置實現(xiàn)作為JarPluginManager, ZipPluginManager, DefaultPluginManager(它是一個JarPluginManager+ ZipPluginManager),或者您可以從AbstractPluginManager(僅實現(xiàn)工廠方法)開始實現(xiàn)自定義插件管理器。
- **PluginLoader:**加載插件所需的所有信息(類)。
- **ExtensionPoint:**是應(yīng)用程序中可以調(diào)用自定義代碼的點。這是一個java接口標(biāo)記。任何 java 接口或抽象類都可以標(biāo)記為擴(kuò)展點(實現(xiàn)ExtensionPoint接口)。
- **Extension:**是擴(kuò)展點的實現(xiàn)。它是一個類上的 Java 注釋
場景
有一個spring-boot
實現(xiàn)的web應(yīng)用,在某一個業(yè)務(wù)功能上提供擴(kuò)展點,用戶可以基于SDK實現(xiàn)功能擴(kuò)展,要求可以管理插件,并且能夠在業(yè)務(wù)功能擴(kuò)展點處動態(tài)加載功能。
2.代碼工程
實驗?zāi)康?/h3>
實現(xiàn)插件動態(tài)加載,調(diào)用 卸載
Demo整體架構(gòu)
- pf4j-api:定義可擴(kuò)展接口。
- pf4j-plugins-01:插件項目,可以包含多個插件,需要實現(xiàn) plugin-api 中定義的接口。所有的插件jar包,放到統(tǒng)一的文件夾中,方便管理,后續(xù)只需要加載文件目錄路徑即可啟動插件。
- pf4j-app:主程序,需要依賴 pf4j-api ,加載并執(zhí)行 pf4j-plugins-01 。
pf4j-api
導(dǎo)入依賴
<dependency> <groupId>org.pf4j</groupId> <artifactId>pf4j</artifactId> <version>3.0.1</version> </dependency>
自定義擴(kuò)展接口,集成 ExtensionPoint ,標(biāo)記為擴(kuò)展點
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; @SpringBootApplication public 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 里面的mian函數(shù),可以看到插件加載,調(diào)用以及卸載情況
4.引用
https://github.com/pf4j/pf4j-spring
到此這篇關(guān)于SpringBoot集成pf4j實現(xiàn)插件開發(fā)功能的代碼示例的文章就介紹到這了,更多相關(guān)SpringBoot pf4j插件開發(fā)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Java Lambda表達(dá)式與匿名內(nèi)部類的聯(lián)系和區(qū)別實例分析
這篇文章主要介紹了Java Lambda表達(dá)式與匿名內(nèi)部類的聯(lián)系和區(qū)別,結(jié)合實例形式分析了Java Lambda表達(dá)式與匿名內(nèi)部類功能、用法、區(qū)別及操作注意事項,需要的朋友可以參考下2019-10-10java編寫一個花名隨機(jī)抽取器的實現(xiàn)示例
這篇文章主要介紹了java編寫一個花名隨機(jī)抽取器的實現(xiàn)示例,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03java 注解annotation的使用以及反射如何獲取注解
這篇文章主要介紹了java 注解annotation的使用以及反射如何獲取注解的相關(guān)資料,需要的朋友可以參考下2017-01-01