精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

徹底解耦!Spring Boot 實現外部 Jar 動態加載與熱插拔式擴展架構

開發 前端
通過動態構建類加載器、讀取?spring.factories?并手動注冊 Bean,我們成功在 Spring Boot 中實現了外部 Jar 的插件化加載。

在大型系統中,業務快速變化、功能可插拔、模塊可裁剪成為主流趨勢。為此,我們可以基于 Spring Boot 實現一種插件式架構,支持動態加載外部 Jar 并熱插拔模塊功能,進一步實現架構解耦、運行期擴展、服務熱更新等目標。

本文將帶你深入實現一套完整的插件機制,加載目錄 /usr/local/java/plugins 中的 Jar 包,并將其中的 Spring Bean 自動注入主工程上下文中。

架構目標與實現思路

核心目標可以拆解為兩個步驟:

  1. 將 Jar 加載到 JVM
  2. 讓 Spring 識別并注冊其中的 Bean

Spring Boot 本身對類加載器有一定擴展能力,再結合自定義加載器和 spring.factories,便可輕松實現這一機制。

項目結構概覽

plugin-loader-demo/
├── plugin-host/                      # 主工程,負責加載插件
│   ├── src/main/java/com/icoderoad/host/
│   │   └── PluginHostApplication.java
│   │   └── loader/
│   │       ├── PluginClassLoader.java
│   │       ├── PluginScanner.java
│   │       └── PluginRegistrar.java
├── plugin-user-center/              # 插件模塊:用戶中心功能
│   ├── src/main/java/com/icoderoad/plugins/user/
│   │   ├── UserService.java
│   │   └── UserAutoConfiguration.java
│   └── resources/META-INF/spring.factories

主工程 plugin-host 的 pom.xml

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.icoderoad</groupId>
  <artifactId>plugin-host</artifactId>
  <version>1.0.0</version>


  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-starter</artifactId>
    </dependency>
  </dependencies>


  <build>
    <plugins>
      <plugin>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-maven-plugin</artifactId>
        <configuration>
          <layout>ZIP</layout>
        </configuration>
      </plugin>
    </plugins>
  </build>
</project>

插件模塊 plugin-user-center 的 pom.xml

<project>
  <modelVersion>4.0.0</modelVersion>
  <groupId>com.icoderoad.plugins</groupId>
  <artifactId>plugin-user-center</artifactId>
  <version>1.0.0</version>


  <dependencies>
    <dependency>
      <groupId>org.springframework.boot</groupId>
      <artifactId>spring-boot-autoconfigure</artifactId>
    </dependency>
  </dependencies>
</project>

插件加載器實現

PluginClassLoader:從目錄中加載外部 Jar

package com.icoderoad.host.loader;


public class PluginClassLoader extends URLClassLoader {
    public PluginClassLoader(URL[] urls, ClassLoader parent) {
        super(urls, parent);
    }


    public static PluginClassLoader fromDirectory(String dirPath) throws IOException {
        File[] jars = new File(dirPath).listFiles(f -> f.getName().endsWith(".jar"));
        if (jars == null) return new PluginClassLoader(new URL[0], Thread.currentThread().getContextClassLoader());


        URL[] urls = Arrays.stream(jars)
            .map(file -> {
                try {
                    return file.toURI().toURL();
                } catch (MalformedURLException e) {
                    throw new RuntimeException(e);
                }
            })
            .toArray(URL[]::new);


        return new PluginClassLoader(urls, Thread.currentThread().getContextClassLoader());
    }
}

PluginScanner:讀取插件 Jar 中的 spring.factories

package com.icoderoad.host.loader;


public class PluginScanner {
    public static List<Class<?>> scanAutoConfigClasses(ClassLoader pluginClassLoader) throws IOException, ClassNotFoundException {
        List<Class<?>> result = new ArrayList<>();
        Enumeration<URL> resources = pluginClassLoader.getResources("META-INF/spring.factories");


        while (resources.hasMoreElements()) {
            try (InputStream input = resources.nextElement().openStream()) {
                Properties props = new Properties();
                props.load(input);
                String classList = props.getProperty(EnableAutoConfiguration.class.getName());
                if (classList != null) {
                    for (String className : classList.split(",")) {
                        result.add(Class.forName(className.trim(), true, pluginClassLoader));
                    }
                }
            }
        }
        return result;
    }
}

PluginRegistrar:注冊配置類到 Spring 容器

package com.icoderoad.host.loader;


public class PluginRegistrar {
    public static void registerPlugins(ConfigurableApplicationContext context, String pluginDir) throws Exception {
        PluginClassLoader loader = PluginClassLoader.fromDirectory(pluginDir);
        List<Class<?>> configClasses = PluginScanner.scanAutoConfigClasses(loader);


        BeanDefinitionRegistry registry = (BeanDefinitionRegistry) context.getBeanFactory();
        AnnotatedBeanDefinitionReader reader = new AnnotatedBeanDefinitionReader(registry);
        reader.setBeanClassLoader(loader);


        for (Class<?> clazz : configClasses) {
            reader.register(clazz);
        }
    }
}

主程序入口整合插件加載邏輯

package com.icoderoad.host;


@SpringBootApplication
public class PluginHostApplication {
    public static void main(String[] args) {
        ConfigurableApplicationContext context = SpringApplication.run(PluginHostApplication.class, args);
        try {
            PluginRegistrar.registerPlugins(context, "/usr/local/java/plugins");
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
}

插件模塊:UserService + 自動配置類

// com.icoderoad.plugins.user.UserService
public class UserService {
    public String getUsername() {
        return "Plugin User";
    }
}


// com.icoderoad.plugins.user.UserAutoConfiguration
@Configuration
public class UserAutoConfiguration {
    @Bean
    public UserService userService() {
        return new UserService();
    }
}

插件 spring.factories 配置

路徑:src/main/resources/META-INF/spring.factories

org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.icoderoad.plugins.user.UserAutoConfiguration

插件測試驗證代碼

在主應用中通過注入判斷插件是否成功加載:

@Autowired(required = false)
private UserService userService;


@PostConstruct
public void init() {
    if (userService != null) {
        System.out.println("插件加載成功:" + userService.getUsername());
    } else {
        System.out.println("插件未加載!");
    }
}

總結

通過動態構建類加載器、讀取 spring.factories 并手動注冊 Bean,我們成功在 Spring Boot 中實現了外部 Jar 的插件化加載。

優點:

  • 插件 Jar 可獨立開發部署
  • 插件可運行期動態加載
  • 支持 Spring 自動配置機制
責任編輯:武曉燕 來源: 路條編程
相關推薦

2021-10-18 12:04:22

Spring BootJava開發

2021-10-18 10:36:31

Spring Boot插件Jar

2024-08-09 08:46:00

Springjar 包YAML

2022-07-13 08:36:57

MQ架構設計模式

2025-05-12 04:01:00

2021-07-30 13:46:59

前端架構插件

2022-09-02 08:23:12

軟件開發解耦架構

2025-02-11 07:55:45

2025-05-20 07:13:22

Spring異步解耦Event

2020-11-20 15:22:32

架構運維技術

2025-07-04 09:31:56

2018-04-18 08:47:17

Alluxio構建存儲

2009-10-23 08:12:01

LinuxSCSI硬盤熱插拔

2017-12-26 15:52:31

MQ互聯網耦合

2017-11-15 09:32:27

解耦戰術架構

2024-10-18 08:00:00

SpringBoot框架開發

2025-08-18 03:00:00

AI智能體微軟

2023-11-20 23:02:36

Spring系統

2023-09-28 08:15:05

SpringBean加載

2025-06-06 01:00:00

Spring場景范式
點贊
收藏

51CTO技術棧公眾號

国产成人短视频在线观看| 肥臀熟女一区二区三区| 成人动漫免费在线观看| 在线不卡免费欧美| 久久国产精品视频在线观看| 国产有码在线| 国产激情一区二区三区四区| 欧美在线激情视频| 国精产品视频一二二区| 岛国av一区| 欧美日韩成人在线| www.亚洲天堂网| 奇米影视888狠狠狠777不卡| 国产一区二区三区精品欧美日韩一区二区三区 | 国产精品影音先锋| 日韩av色在线| 久久久久久国产精品免费播放| 素人啪啪色综合| 亚洲乱码国产乱码精品精的特点| 国产精品丝袜久久久久久不卡| 国产精品嫩草av| 最新亚洲国产| 91国偷自产一区二区使用方法| 国产三区精品| 国产乱码精品一区二三区蜜臂| 日本在线电影一区二区三区| 亚洲а∨天堂久久精品9966| 亚洲一级免费观看| а√在线天堂官网| 亚洲人成网站精品片在线观看| 成人中文字幕+乱码+中文字幕| 国产一区二区三区四区五区六区| 麻豆mv在线观看| 亚洲女同女同女同女同女同69| 91精品久久久久久久久久久久久| 日韩一级av毛片| 老司机凹凸av亚洲导航| 日韩视频一区二区三区在线播放| 日本丰满大乳奶| 第九色区av在线| 99亚偷拍自图区亚洲| 97久久精品午夜一区二区| 亚洲系列第一页| 日日夜夜精品视频免费| 欧美洲成人男女午夜视频| 久草视频免费在线播放| 综合激情一区| 欧美尺度大的性做爰视频| 懂色av蜜臀av粉嫩av永久| 欧美熟乱15p| 一区二区三区www| 最新中文字幕av| 国产一区二区三区日韩精品 | 日韩一级在线免费观看| 岛国av在线播放| 五月开心婷婷久久| 自慰无码一区二区三区| 午夜影视一区二区三区| 欧美午夜久久久| 日韩中文字幕组| 欧洲成人一区| 91福利国产精品| 无人在线观看的免费高清视频 | 91插插插插插插插插| 一区二区视频免费完整版观看| 国产日产欧美一区| 视频在线99| 欧美18hd| 亚洲午夜久久久| 91猫先生在线| 吉吉日韩欧美| 欧美人与禽zozo性伦| 国产大片一区二区三区| 18国产精品| 亚洲国产欧美一区| 少妇户外露出[11p]| 久久成人av| 日韩中文字幕亚洲| 免费看一级一片| 欧美一级视频| 国产欧美婷婷中文| 懂色av一区二区三区四区| 久久女同性恋中文字幕| 黄频视频在线观看| 1024在线看片你懂得| 91福利国产精品| 中国老熟女重囗味hdxx| 美女毛片一区二区三区四区| 中日韩午夜理伦电影免费| 国产精品久久久精品四季影院| 欧美少妇xxxx| 欧美成人三级视频网站| 欧美日韩精品区| 久久精品国内一区二区三区| 不卡视频一区二区| 国产精品一级伦理| 一区二区三区日韩欧美| 最近免费中文字幕中文高清百度| 国产夫妻在线播放| 欧美三级韩国三级日本一级| 中文字幕乱妇无码av在线| 欧美极品在线观看| 欧美激情一二区| 中文字幕在线一| av在线播放不卡| 免费观看中文字幕| 日本少妇一区| 日韩av网站导航| 日本一级片免费| 久久国产精品毛片| 草莓视频一区| 麻豆视频在线| 欧美性受xxxx| 国产精品无码永久免费不卡| 啪啪av大全导航福利综合导航| 久久午夜无码鲁丝片午夜精品| 美女一区二区在线观看| 一区二区三区亚洲| 成年人午夜视频| 国产尤物一区二区| 亚洲国产欧洲综合997久久 | 欧美猛交ⅹxxx乱大交视频| 久久久午夜影院| 国产毛片精品一区| 久久一区二区三区欧美亚洲| 男女在线视频| 欧美电影一区二区| 欧美福利第一页| 午夜亚洲伦理| 精品一区在线播放| 黑人玩欧美人三根一起进| 在线不卡的av| 国产wwwwxxxx| 精品伊人久久久久7777人| 日本午夜精品电影| 男人最爱成人网| 亚洲精品电影网| 日本中文字幕网| 高清在线观看日韩| 女女百合国产免费网站| 91国产一区| 久久天天躁狠狠躁夜夜躁| 一级黄色a视频| 中文一区二区在线观看| 成人免费xxxxx在线视频| 在线日韩网站| 日本精品视频在线观看| 欧美少妇另类| 91福利国产成人精品照片| 尤物视频最新网址| 一区二区日韩免费看| 狠狠色噜噜狠狠狠狠色吗综合| 精品视频三区| 91福利社在线观看| www..com.cn蕾丝视频在线观看免费版| 四虎8848精品成人免费网站| 国产精品高潮呻吟久久av野狼 | 久久 天天综合| 日韩福利视频| jizzyou欧美16| 中文字幕久久久| 91国在线视频| 一区二区三区毛片| 99久久久无码国产精品性波多| 成人羞羞网站| 成人av在线亚洲| 在线观看中文字幕的网站| 精品国产污污免费网站入口| 影音先锋亚洲天堂| 久久精品视频网| 免费看污黄网站| 在线成人直播| 黑人另类av| 国产69精品久久| 欧美人与性动交a欧美精品| 婷婷色在线视频| 欧洲av在线精品| 91高清免费观看| 波多野结衣91| 伊人国产在线视频| 中文字幕日韩一区二区不卡| 国产视频不卡| 免费在线观看一区| 精品自在线视频| 深夜福利在线观看直播| 欧美日韩亚洲综合在线| 一区二区视频免费看| 91在线视频播放| 天堂网在线免费观看| 中国精品18videos性欧美| 久久国产精品亚洲va麻豆| 欧美亚洲二区| 97视频在线观看免费| 在线观看av的网站| 精品国产乱码久久久久久久久| 国产67194| 91免费小视频| 欧美体内she精高潮| 久久99伊人| 免费极品av一视觉盛宴| 国产一区二区三区四区二区| 国产一区视频在线| 日韩理论视频| 久久99精品久久久久久琪琪| 国产高清视频免费最新在线| 日韩精品一区二区三区蜜臀| 最近中文字幕av| 婷婷综合另类小说色区| 国产午夜手机精彩视频| 国产三级欧美三级日产三级99| 成人性做爰aaa片免费看不忠| 国产在视频线精品视频www666| 日韩美女视频免费看| 国产福利在线播放麻豆| 亚洲午夜av久久乱码| 亚洲精品字幕在线观看| 欧美挠脚心视频网站| chinese国产精品| 亚洲成av人影院在线观看网| 青娱乐免费在线视频| 中文字幕制服丝袜一区二区三区| 涩涩网站在线看| 久久久久久一区二区| 国产www免费| 88国产精品视频一区二区三区| 亚洲在线一区二区| av成人免费| 国产精品video| 国产高清中文字幕在线| 九九热这里只有在线精品视| 久久综合之合合综合久久| 伊人久久五月天| 亚洲 国产 欧美 日韩| 精品国产成人在线影院| 国产成人毛毛毛片| 51久久夜色精品国产麻豆| 一级片在线观看视频| 欧美日韩国产首页在线观看| 在线观看一二三区| 欧美日韩三级一区二区| 姑娘第5集在线观看免费好剧| 亚洲三级在线看| 激情五月激情综合| 中文字幕中文字幕一区| 手机看片国产日韩| 国产三级精品在线| 天天操天天舔天天射| 欧美激情综合网| 你懂得视频在线观看| 日本一区二区久久| 成人午夜免费影院| 亚洲色图在线播放| 日本少妇高清视频| 亚洲国产美国国产综合一区二区| 无码人中文字幕| 亚洲天堂2014| 国产一级片网址| 黑丝美女久久久| 波多野结衣理论片| 精品视频色一区| 一区二区视频播放| 制服丝袜日韩国产| 欧美视频一二区| 亚洲乱码av中文一区二区| 国产三级在线免费| 中文字幕在线国产精品| 大片免费在线观看| 992tv成人免费影院| av激情成人网| 91久久久久久久一区二区 | 国产视频999| 日本伊人久久| 久久婷婷开心| 国产真人真事毛片| 成人影音在线| 国产欧美欧美| 欧美日韩国产成人高清视频| 成人免费观看视频大全| 久久久欧美一区二区| 婷婷综合六月| 亚洲一区二区免费在线| 国产精品网站在线看| 日韩免费电影一区二区三区| 99精品小视频| 久艹视频在线免费观看| 日韩在线观看一区二区| 青青草原播放器| 久久综合色之久久综合| 麻豆明星ai换脸视频| 五月激情综合网| 一炮成瘾1v1高h| 亚洲精品www| 男人影院在线观看| 91精品国产自产91精品| 一区二区三区日本视频| 精品视频一区在线| 亚洲精品成人| 成人在线看视频| 国产福利视频一区二区三区| 久久久久久久久久久久| 夜夜夜精品看看| 中文字幕乱码无码人妻系列蜜桃| 精品久久久久久久久久久| 高潮毛片又色又爽免费 | 午夜免费久久久久| 中文字幕在线视频久| 亚洲自拍偷拍网址| 精品一区二区三区中文字幕老牛| 欧美精品七区| 欧美日韩伊人| 午夜免费福利视频在线观看| 成人免费看视频| 国产午夜手机精彩视频| 精品视频资源站| 九色国产在线观看| 91极品视频在线| 97色成人综合网站| 天天做天天爱天天高潮| 喷水一区二区三区| www.av欧美| 欧美日韩一区二区免费视频| 亚洲av综合色区无码一区爱av| 亚洲精品wwww| 成人福利电影| 99re在线观看| 综合天堂久久久久久久| 亚洲一二三av| 国产日产精品一区| 亚洲天堂男人av| 亚洲精品在线观看www| 高清在线视频不卡| 国产成人免费观看| 亚洲欧美综合国产精品一区| 最新免费av网址| 中文字幕第一区| 怡春院在线视频| 国产午夜精品一区理论片飘花 | 欧洲专线二区三区| 国产91xxx| 福利视频网站一区二区三区| 中日韩一级黄色片| 欧美一区二区视频观看视频| 成人影院在线观看| www.av一区视频| 亚洲天堂成人| 精品国产人妻一区二区三区| 性做久久久久久免费观看| 日本精品久久久久| 91超碰caoporn97人人| 婷婷综合福利| 国产精品69页| 国产精品美女久久久久久久| 91欧美日韩麻豆精品| 欧美成人精品一区二区| 日韩一区二区三区色| 国产视频在线观看网站| 成人禁用看黄a在线| 男人的天堂一区| 精品丝袜一区二区三区| 性欧美videohd高精| 影音先锋亚洲视频| 国产成人在线免费| 午夜影院在线看| 国产一区二区激情| 超碰国产精品一区二页| 久久99久久久久久| 久久久九九九九| 一级黄在线观看| 久久乐国产精品| 精品国产不卡| 日本一本a高清免费不卡| 成人国产精品入口免费视频| 国产欧美综合一区| 成人高清视频在线| 无码人妻av免费一区二区三区 | 国产免费一区二区三区免费视频| 日韩电影中文字幕av| 综合毛片免费视频| 亚洲精品自在在线观看| 国产91高潮流白浆在线麻豆 | 91超薄肉色丝袜交足高跟凉鞋| 中文字幕乱码一区二区免费| 国产色综合视频| 97精品国产97久久久久久| 国产一区日韩| 国产伦理在线观看| 欧美主播一区二区三区| 免费在线国产视频| 亚洲精品视频一区二区三区| 成人中文字幕电影| 国产女优在线播放| 欧美激情喷水视频| 清纯唯美综合亚洲| 无码国产69精品久久久久网站| 亚洲精品免费在线观看| 日韩在线观看视频网站| 国产精品日本精品| 亚洲精品孕妇| 一区二区视频免费看| 在线观看欧美视频|