當前位置: 華文世界 > 科技

Spring Boot整合pf4j實作外掛程式開發功能

2024-09-06科技

1.什麽是pf4j?

一個外掛程式框架,用於實作外掛程式的 動態載入 ,支持的外掛程式格式(zip、jar)。

核心元件

  • Plugin: 是所有外掛程式型別的基礎類別。每個外掛程式都被載入到一個單獨的類載入器中以避免沖突。
  • PluginManager: 用於外掛程式管理的所有方面(載入、啟動、停止)。您可以使用內建實作作為JarPluginManager, ZipPluginManager, DefaultPluginManager(它是一個JarPluginManager+ ZipPluginManager),或者您可以從AbstractPluginManager(僅實作工廠方法)開始實作自訂外掛程式管理器。
  • PluginLoader: 載入外掛程式所需的所有資訊(類)。
  • ExtensionPoint: 是應用程式中可以呼叫自訂程式碼的點。這是一個java介面標記。任何 java 介面或抽象類都可以標記為擴充套件點(實作ExtensionPoint介面)。
  • Extension: 是擴充套件點的實作。它是一個類上的 Java 註釋
  • 場景

    有一個 spring-boot 實作的web套用,在某一個業務功能上提供擴充套件點,使用者可以基於SDK實作功能擴充套件,要求可以管理外掛程式,並且能夠在業務功能擴充套件點處動態載入功能。

    2.程式碼工程

    實驗目的

    實作外掛程式動態載入,呼叫 解除安裝

    Demo整體架構

  • pf4j-api:定義可延伸介面。
  • pf4j-plugins-01:外掛程式計畫,可以包含多個外掛程式,需要實作 plugin-api 中定義的介面。所有的外掛程式jar包,放到統一的資料夾中,方便管理,後續只需要載入檔目錄路徑即可啟動外掛程式。
  • pf4j-app:主程式,需要依賴 pf4j-api ,載入並執行 pf4j-plugins-01 。
  • 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(); }}

    以上只是一些關鍵程式碼,所有程式碼請參見下面程式碼倉庫

    程式碼倉庫

  • https://github.com/Harries/springboot-demo
  • 3.測試

    執行DemoApplication.java 裏面的main函式,可以看到外掛程式載入,呼叫以及解除安裝情況

    4.參照

  • https://pf4j.org/
  • https://github.com/pf4j/pf4j-spring