最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

SpringBoot集成pf4j實現(xiàn)插件開發(fā)功能的代碼示例

 更新時間:2024年07月11日 08:42:39   作者:HBLOG  
pf4j是一個插件框架,用于實現(xiàn)插件的動態(tài)加載,支持的插件格式(zip、jar),本文給大家介紹了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)記為擴展點(實現(xiàn)ExtensionPoint接口)。
  • **Extension:**是擴展點的實現(xiàn)。它是一個類上的 Java 注釋

場景

有一個spring-boot實現(xiàn)的web應(yīng)用,在某一個業(yè)務(wù)功能上提供擴展點,用戶可以基于SDK實現(xiàn)功能擴展,要求可以管理插件,并且能夠在業(yè)務(wù)功能擴展點處動態(tài)加載功能。

2.代碼工程

實驗?zāi)康?/h3>

實現(xiàn)插件動態(tài)加載,調(diào)用 卸載

Demo整體架構(gòu)

  • pf4j-api:定義可擴展接口。
  • 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>

自定義擴展接口,集成 ExtensionPoint ,標(biāo)記為擴展點

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://pf4j.org/

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必須學(xué)會的類的繼承與多態(tài)

    Java必須學(xué)會的類的繼承與多態(tài)

    這篇文章主要介紹了Java類的繼承與多態(tài)的相關(guān)資料,幫助大家更好的理解和學(xué)習(xí)Java,感興趣的朋友可以了解下
    2020-08-08
  • 一文詳解SpringBoot中CommandLineRunner接口

    一文詳解SpringBoot中CommandLineRunner接口

    Spring Boot的CommandLineRunner接口是一個函數(shù)式接口,用于在Spring Boot應(yīng)用程序啟動后執(zhí)行一些初始化操作,它提供了一個run方法,該方法在應(yīng)用程序啟動后被調(diào)用,本文給大家詳細介紹了SpringBoot中CommandLineRunner接口,需要的朋友可以參考下
    2023-10-10
  • 詳解Java多線程與并發(fā)

    詳解Java多線程與并發(fā)

    多線程是一個進程在執(zhí)行過程中產(chǎn)生多個更小的程序單元,這些更小的單元稱為線程,這些線程可以同時存在,同時運行,一個進程可能包含多個同時執(zhí)行的線程。多線程是實現(xiàn)并發(fā)機制的一種有效手段。進程和線程一樣,都是實現(xiàn)并發(fā)的一個基本單位。
    2021-06-06
  • Springboot異步事件配置和使用示例詳解

    Springboot異步事件配置和使用示例詳解

    Spring框架提供了一套事件處理機制,允許應(yīng)用在各個組件之間傳遞狀態(tài)信息,自定義事件通常繼承自ApplicationEvent類,Springboot通過自動配置簡化了異步處理的配置,實現(xiàn)開箱即用,Spring事件模型核心是觀察者模式,適用于解耦和提高響應(yīng)速度
    2024-10-10
  • 使用java實現(xiàn)猜拳小游戲

    使用java實現(xiàn)猜拳小游戲

    這篇文章主要為大家詳細介紹了使用java實現(xiàn)猜拳小游戲,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07
  • Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標(biāo)點輸入無效的完美解決方法

    Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標(biāo)點輸入無效的完美解決方法

    Mac OS X 下基于 Java 的程序會出現(xiàn)中文標(biāo)點輸入無效的問題,在中文輸入法狀態(tài),可以輸入中文字,但輸入中文標(biāo)點最后上去的是英文標(biāo)點.這篇文章主要介紹了Mac OS X 下 IntelliJ IDEA、jEdit 等 Java 程序中文標(biāo)點輸入無效的完美解決方法,需要的朋友可以參考下
    2016-10-10
  • java9學(xué)習(xí)系列之安裝與jshell使用

    java9學(xué)習(xí)系列之安裝與jshell使用

    2017年9月21日,千呼萬喚始出來,Java9終于發(fā)布了。作為自己天天接觸的“對象”,還是應(yīng)該多花點心思去了解她。后續(xù)再進一步了解詳細特性。下面這篇文章主要給大家介紹了關(guān)于java9學(xué)習(xí)系列之安裝與jshell使用的相關(guān)資料,需要的朋友可以參考下。
    2017-09-09
  • Spring中@Transactional(rollbackFor=Exception.class)屬性用法介紹

    Spring中@Transactional(rollbackFor=Exception.class)屬性用法介紹

    這篇文章介紹了Spring中@Transactional(rollbackFor=Exception.class)屬性的用法,對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-12-12
  • 如何使用Java將word解析出來(包含格式和圖片)

    如何使用Java將word解析出來(包含格式和圖片)

    今天遇到一個讀取word模板內(nèi)容的需求,下面這篇文章主要給大家介紹了關(guān)于如何使用Java將word解析出來,包含格式和圖片,文中通過代碼介紹的非常詳細,需要的朋友可以參考下
    2023-12-12
  • Java面試題沖刺第二十二天-- Nginx

    Java面試題沖刺第二十二天-- Nginx

    這篇文章主要為大家分享了最有價值的三道關(guān)于Nginx的面試題,涵蓋內(nèi)容全面,包括數(shù)據(jù)結(jié)構(gòu)和算法相關(guān)的題目、經(jīng)典面試編程題等,感興趣的小伙伴們可以參考一下
    2021-08-08

最新評論

闽清县| 隆化县| 南漳县| 宁远县| 定兴县| 永吉县| 钟山县| 通化县| 凌云县| 汶川县| 库车县| 特克斯县| 石河子市| 延庆县| 塔河县| 交口县| 兴城市| 仙游县| 二连浩特市| 西乌| 辰溪县| 沙河市| 灵寿县| 安多县| 灌南县| 琼海市| 积石山| 城市| 综艺| 沿河| 那曲县| 凤山市| 大厂| 临安市| 育儿| 武冈市| 郧西县| 台前县| 广饶县| 台山市| 邳州市|