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

