精品欧美一区二区三区在线观看 _久久久久国色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技術棧公眾號

妺妺窝人体色777777| 51国偷自产一区二区三区| 四季av中文字幕| 精品国产一区二| 亚洲va欧美va人人爽| 日韩免费毛片| 亚洲成人一级片| 爽好多水快深点欧美视频| 日韩中文字幕在线免费观看| 18禁一区二区三区| 国产电影一区二区三区爱妃记| 亚洲欧美另类久久久精品2019| 久久久久久久久一区| 91中文字幕在线播放| 99av国产精品欲麻豆| 自拍偷拍亚洲一区| 给我免费观看片在线电影的| 亚洲欧洲二区| 在线观看亚洲专区| 久久久久日韩精品久久久男男| 国产精品三级在线观看无码| 精品国产伦一区二区三区观看说明| 欧美午夜精品在线| 99久热在线精品视频| 麻豆app在线观看| 东方aⅴ免费观看久久av| 国产精品欧美激情| 欧美videossex极品| 欧美日本三区| 久久精品中文字幕| 欧美性受xxxx黑人| 亚洲区小说区| 亚洲精品国产精品乱码不99按摩 | 欧美精品在线视频| 国内外免费激情视频| 免费在线中文字幕| 一区二区三区中文在线| 在线视频91| 在线观看麻豆| 日本一区二区三区在线不卡| 久久99精品久久久久久久青青日本 | 精品写真视频在线观看| 国产精品第一视频| 国产美女www| 爽爽淫人综合网网站| 清纯唯美日韩制服另类| 日韩乱码一区二区| 亚洲精品四区| 91超碰caoporn97人人| 久久久久久免费观看| 在线中文字幕第一区| 日韩在线视频观看| 开心激情五月网| 欧美激情电影| 久久精品国产2020观看福利| 永久免费看片直接| 亚洲成人精品| 欧美激情精品久久久久久黑人| 中文字幕另类日韩欧美亚洲嫩草| 91成人网在线观看| 欧美成人中文字幕在线| 久久久久久久福利| 亚洲国产日韩在线| 国产91|九色| 亚洲精品国产精品国自产网站按摩| 老司机亚洲精品| 国产精品日日做人人爱| 一级特黄aaa大片在线观看| 久国产精品韩国三级视频| 91精品国产综合久久久久久蜜臀 | 户外露出一区二区三区| 欧美在线观看视频一区二区三区| 久久这里只精品| 国产在线一区不卡| 精品国产髙清在线看国产毛片| 精品国产人妻一区二区三区| 国产欧美日韩在线一区二区| 精品国产一区二区三区在线观看| 国产大片免费看| 99精品热视频只有精品10| 91av视频在线| 中文文字幕一区二区三三| 激情成人综合网| 国产精品制服诱惑| 成人精品一区二区| 一卡二卡欧美日韩| 国产精品少妇在线视频| 色婷婷成人网| 精品不卡在线视频| 91资源在线播放| 激情欧美日韩| 国产一区视频在线| 色婷婷av一区二区三区之红樱桃 | 香蕉免费一区二区三区在线观看| 亚洲国产精品电影| 国产黄色录像片| 国产精品亚洲产品| 91视频国产一区| 日本在线视频1区| 亚洲美女视频在线观看| 国产男女无遮挡| 亚洲2区在线| 国产午夜精品视频| 日操夜操天天操| 狠狠狠色丁香婷婷综合久久五月| 精选一区二区三区四区五区| 麻豆视频在线免费观看| 欧美视频裸体精品| 免费欧美一级片| 成人黄色小视频| 97超碰蝌蚪网人人做人人爽| 99国产成人精品| 国产夜色精品一区二区av| www插插插无码免费视频网站| 国产精品成人国产| 精品无人区乱码1区2区3区在线 | 波多野结衣a v在线| 欧美福利一区| 91久久嫩草影院一区二区| 青青青免费视频在线2| 亚洲国产精品久久久久秋霞影院| 爱情岛论坛成人| 九色精品91| 8x海外华人永久免费日韩内陆视频| 国产精品综合在线| 国产精品女主播在线观看| 日韩久久一级片| 老司机aⅴ在线精品导航| 久久99久久99精品中文字幕| 中文字幕+乱码+中文字幕明步| 91影院在线免费观看| 国产freexxxx性播放麻豆| 国产精品麻豆| 久久精品最新地址| 91精品视频免费在线观看 | 欧美黄色一级网站| 精品一区二区三区欧美| 亚洲成人18| 精品国产欧美日韩一区二区三区| 亚洲女人天堂视频| 六月丁香婷婷综合| 91理论电影在线观看| 97成人在线免费视频| 成人在线超碰| 久久青草精品视频免费观看| 成人午夜免费福利| 亚洲国产一区二区在线播放| 毛茸茸free性熟hd| 国产模特精品视频久久久久| 久久99久久99精品蜜柚传媒| 国产伦久视频在线观看| 国产视频精品自拍| 天天射天天干天天| 中文字幕国产一区| 中文av字幕在线观看| 婷婷色综合网| av资源站久久亚洲| 都市激情久久综合| 亚洲精品国产美女| 在线免费观看国产精品| 中文字幕av不卡| 五月天视频在线观看| 一区二区三区毛片免费| 99热最新在线| 九色porny自拍视频在线播放| 日韩精品视频中文在线观看| 亚洲另类在线观看| 国产精品全国免费观看高清| 久久无码人妻一区二区三区| 99精品视频免费| 婷婷久久伊人| 亚洲国产中文在线| 4438全国成人免费| 日本三级视频在线观看| 日韩三级av在线播放| 日本在线播放视频| 亚洲欧洲日韩一区二区三区| 国产人成视频在线观看| 视频一区二区三区在线| 大桥未久一区二区| 青草久久视频| 成人免费视频网址| 日韩激情电影| 精品国产一区二区三区久久久| 成人小说亚洲一区二区三区| 色婷婷一区二区| 国产盗摄一区二区三区在线| 99久久久久久99| 天天操天天干天天做| 在线国产欧美| 亚洲亚洲精品三区日韩精品在线视频 | 欧美午夜一区| 婷婷五月色综合| 国产91精品入| 国产日韩av在线| 美女网站在线看| 久久成人精品视频| 精品久久av| 精品嫩草影院久久| 中文字幕在线视频免费| 亚洲亚洲人成综合网络| 欧美aaa级片| 91在线免费播放| 国产在线视频三区| 男女激情视频一区| 欧美性大战久久久久xxx| 在线一区电影| 一区二区三区视频在线播放| 欧美电影免费网站| 99www免费人成精品| 免费一区二区三区四区| 欧美一区三区三区高中清蜜桃| 97影院秋霞午夜在线观看| 在线观看欧美日韩国产| 欧洲成人av| 亚洲精品国产品国语在线| 精品久久久中文字幕人妻| 欧美吞精做爰啪啪高潮| 久久久久久久久久久影院 | 黄色大全在线观看| 精品国产成人av| 久久久久久久久久久久国产| 日韩一区欧美一区| 天天舔天天操天天干| 91麻豆国产精品久久| 久久无码专区国产精品s| 精品在线免费视频| 孩娇小videos精品| 免费欧美在线视频| 我看黄色一级片| 日韩电影在线观看一区| 久久久久人妻精品一区三寸| aa级大片欧美三级| 国产二级片在线观看| av成人天堂| av天堂永久资源网| 在线亚洲一区| 夫妻免费无码v看片| 亚洲国产黄色| 久久久久久久午夜| 国产一区二区三区的电影| 亚洲 自拍 另类小说综合图区| 91精品电影| 欧美一级黄色录像片| 婷婷亚洲图片| av 日韩 人妻 黑人 综合 无码| 围产精品久久久久久久| 中国女人做爰视频| 欧美激情1区2区| 人妻av无码专区| 日韩天堂av| 蜜臀久久99精品久久久酒店新书| 久久久久久久波多野高潮日日| 噼里啪啦国语在线观看免费版高清版| 日韩高清在线电影| 一二三级黄色片| 国产精品99久久久久| 国产综合内射日韩久| 成人久久18免费网站麻豆| 国产黄色三级网站| 国产日韩三级在线| 黄色录像一级片| 一区二区三区在线视频观看| 日本网站在线免费观看| 日韩欧亚中文在线| 91tv国产成人福利| 精品国产91洋老外米糕| 久热av在线| 久久精品91久久香蕉加勒比| 日本aa在线| 国产a∨精品一区二区三区不卡| 99re66热这里只有精品4| 91亚洲人电影| 国产成人一二片| 日韩欧美精品一区二区三区经典| 99久久精品费精品国产风间由美| 国产免费内射又粗又爽密桃视频| 亚洲第一毛片| 成人性生交免费看| 成人一区二区三区视频| 我想看黄色大片| 亚洲一区二区视频在线观看| 免费无码国产精品| 精品成人一区二区| 成人高清网站| 国内成人精品视频| 巨大黑人极品videos精品| 国产一区免费在线| 久久裸体网站| 波多野结衣家庭教师在线播放| 精品制服美女丁香| 亚洲第一成人网站| 夜夜揉揉日日人人青青一国产精品| 免费黄色网址在线| 欧美一区二区三区四区久久| 国产视频三级在线观看播放| 欧美国产日韩在线| 国产精品66| 欧美二级三级| 欧美日韩一区二区国产| 在线免费观看视频黄| 99久久综合精品| 99精品久久久久| 欧美日韩在线播放| 欧美在线一卡| 97视频在线播放| 欧美成人精品午夜一区二区| 手机看片福利永久国产日韩| 亚洲欧洲午夜| 欧洲成人午夜精品无码区久久| 国产精品午夜春色av| 国产又粗又爽视频| 精品国产免费一区二区三区香蕉| 天堂аⅴ在线地址8| 日本国产高清不卡| 久久综合五月婷婷| 妺妺窝人体色www看人体| 麻豆精品一区二区综合av| 欧美性xxxx图片| 五月开心婷婷久久| 亚洲精品久久久狠狠狠爱| 欧美成人免费网| 91成人在线网站| 一区二区三区精品国产| 男男视频亚洲欧美| 阿v天堂2014| 91久久精品一区二区| 日本五码在线| 欧美一区二区三区四区在线| 国产精品115| 成人免费a级片| 成人动漫中文字幕| 国产精品99无码一区二区| 欧美一区二区高清| 成人福利网站| 91国产在线免费观看| 亚洲精品97| 中文字幕制服丝袜| 夜夜揉揉日日人人青青一国产精品| 国产www免费观看| 欧美插天视频在线播放| 日韩在线亚洲| 免费人成在线观看视频播放| 国产91色综合久久免费分享| 欧美三根一起进三p| 欧美一级电影网站| 日本在线视频www鲁啊鲁| www 成人av com| 一区二区高清| 日本精品在线观看视频| 欧美午夜丰满在线18影院| 精品电影在线| 91久久精品日日躁夜夜躁国产| 欧美 日韩 国产一区二区在线视频 | 日韩视频在线一区| 国产va免费精品观看精品| 肉大捧一出免费观看网站在线播放| 国产一区二区三区香蕉| 久久免费播放视频| 日韩电影网在线| 日本中文字幕一区二区| 秋霞在线一区二区| 成熟亚洲日本毛茸茸凸凹| 久草视频在线观| 亚洲一区www| 日韩精品一级| 国产午夜伦鲁鲁| 欧美国产日韩精品免费观看| 国产精品污视频| 97视频在线观看播放| 欧美综合另类| 一起草最新网址| 欧美日韩中文在线| 欧洲日本在线| 国产精品免费一区二区三区| 久久男女视频| 一级性生活免费视频| 亚洲精品av在线| 男人亚洲天堂| 日本在线xxx| 国产精品美女久久福利网站| 蜜臀久久精品久久久久| 国产精品激情av电影在线观看| 亚洲国产一区二区三区在线播放| 国产一级伦理片| 欧美精品xxxxbbbb| 黄色18在线观看| 中日韩在线视频| 91欧美激情一区二区三区成人| 一级黄色大片免费| 97超级碰碰碰| 久久久9色精品国产一区二区三区| 中文字幕精品视频在线| 欧美日韩电影在线| 午夜影视一区二区三区| 法国空姐在线观看免费| 久久久久久免费| 神马久久精品综合| 亚洲精品按摩视频| 成人自拍视频|