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

tio-boot整合hotswap-classloader實(shí)現(xiàn)熱加載方法實(shí)例

 更新時(shí)間:2023年12月19日 08:59:35   作者:李通  
這篇文章主要為大家介紹了tio-boot整合hotswap-classloader實(shí)現(xiàn)熱加載方法實(shí)例,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪

什么是 hotswap-classloader?

hotswap-classloader 是一款由開(kāi)發(fā)者 litongjava 創(chuàng)建的 Java 動(dòng)態(tài)類加載器。這個(gè)工具的核心功能是支持在 Java 應(yīng)用運(yùn)行時(shí)動(dòng)態(tài)地更換或更新類定義,而無(wú)需重啟整個(gè)JVM。這種熱替換(hot swapping)的能力對(duì)于開(kāi)發(fā)過(guò)程中的迭代和測(cè)試尤其有價(jià)值,因?yàn)樗蟠鬁p少了等待應(yīng)用重啟的時(shí)間。

什么是 tio-boot?

tio-boot 是一個(gè)基于 Java 的網(wǎng)絡(luò)編程框架,用于簡(jiǎn)化網(wǎng)絡(luò)應(yīng)用的開(kāi)發(fā)。它提供了一套豐富的 API 和工具,使開(kāi)發(fā)者能夠更容易地構(gòu)建和部署網(wǎng)絡(luò)服務(wù)和應(yīng)用。tio-boot 支持多種網(wǎng)絡(luò)協(xié)議,并且提供了高性能和可擴(kuò)展性。

為什么將 hotswap-classloader 和 tio-boot 結(jié)合使用?

結(jié)合使用 hotswap-classloader 和 tio-boot 可以為 Java 網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)帶來(lái)以下幾個(gè)關(guān)鍵優(yōu)勢(shì):

  • 快速迭代和測(cè)試:通過(guò)使用 hotswap-classloader,開(kāi)發(fā)者可以在不重啟服務(wù)器的情況下實(shí)時(shí)更新類文件,從而實(shí)現(xiàn)快速迭代和即時(shí)測(cè)試。
  • 提升開(kāi)發(fā)效率:減少了重啟應(yīng)用程序所需的時(shí)間,開(kāi)發(fā)者可以更加專注于代碼的編寫和改進(jìn),從而提高工作效率。
  • 適合敏捷開(kāi)發(fā):在敏捷開(kāi)發(fā)模式下,需要頻繁地進(jìn)行更改和測(cè)試。hotswap-classloader 的動(dòng)態(tài)加載能力使得這一過(guò)程更加流暢和高效。

總的來(lái)說(shuō),結(jié)使用 hotswap-classloader 和 tio-boot 不僅提高了開(kāi)發(fā)效率,而且增強(qiáng)了網(wǎng)絡(luò)應(yīng)用開(kāi)發(fā)的靈活性和便利性。這對(duì)于希望快速迭代和改進(jìn)其網(wǎng)絡(luò)應(yīng)用的開(kāi)發(fā)團(tuán)隊(duì)來(lái)說(shuō),是一個(gè)非常有價(jià)值的組合。

整合 hotswap-classloader,開(kāi)啟熱加載有兩種方式,

  • 在啟動(dòng)中使用 TioApplicationWrapper 啟動(dòng)
  • 啟動(dòng)配置類配置 hotswap-classloader

這里重點(diǎn)介紹第二種方式

如何在開(kāi)發(fā)環(huán)境下使用 hotswap-classloader 和 tio-boot 實(shí)現(xiàn)動(dòng)態(tài)類加載。

1. 添加 hotswap-classloader 依賴

首先,您需要在您的 Java 項(xiàng)目中添加 hotswap-classloader 依賴。在項(xiàng)目的 pom.xml 文件中添加以下依賴配置:

<properties>
  <hotswap-classloader.version>1.2.0</hotswap-classloader.version>
  <tio-boot.version>1.2.4</tio-boot.version>
</properties>
<dependencies>
  <dependency>
    <groupId>com.litongjava</groupId>
    <artifactId>tio-boot</artifactId>
    <version>${tio-boot.version}</version>
  </dependency>
  <dependency>
    <groupId>com.litongjava</groupId>
    <artifactId>hotswap-classloader</artifactId>
    <version>${hotswap-classloader.version}</version>
  </dependency>
</dependencies>

這將確保您的項(xiàng)目能夠使用 hotswap-classloader

2. 創(chuàng)建啟動(dòng)類

創(chuàng)建一個(gè)簡(jiǎn)單的啟動(dòng)類 HelloApp 來(lái)使用 tio-boot 啟動(dòng)您的應(yīng)用。這個(gè)類將定義一個(gè)基本的 HTTP 請(qǐng)求路徑和一個(gè)處理方法:

package com.litongjava.tio.web.hello;
// 導(dǎo)入必要的類
@ComponentScan
@Controller
@RequestPath("/")
public class HelloApp {
  public static void main(String[] args) {
    tio-boot.run(HelloApp.class, args);
  }
  @RequestPath()
  public String index() {
    return "index4";
  }
}

這個(gè)類中的 main 方法將啟動(dòng) tio-boot,而 index 方法將響應(yīng)根路徑的 HTTP 請(qǐng)求。

3. 配置類加載器

創(chuàng)建 HotSwapClassLoaderConfig 類以配置動(dòng)態(tài)類加載器。這個(gè)配置類在服務(wù)器啟動(dòng)之前設(shè)置自定義的類加載器,以便于開(kāi)發(fā)環(huán)境下的熱替換:

package com.litongjava.tio.web.hello.config;
import com.litongjava.hotswap.kit.HotSwapUtils;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.jfinal.aop.annotation.BeforeStartConfiguration;
import com.litongjava.jfinal.aop.annotation.Initialization;
import com.litongjava.tio.boot.constatns.ConfigKeys;
import com.litongjava.tio.boot.utils.Enviorment;
import lombok.extern.slf4j.Slf4j;
@BeforeStartConfiguration
@Slf4j
public class HowSwapClassLoaderConfig {
  @Initialization
  public void configClassLoader() {
    Enviorment enviorment = Aop.get(Enviorment.class);
    String env = enviorment.get(ConfigKeys.appEnv);
    if ("dev".equals(env)) {
      // 獲取自定義的classLoalder
      ClassLoader hotSwapClassLoader = HotSwapUtils.getClassLoader();
      Thread.currentThread().setContextClassLoader(hotSwapClassLoader);
      log.info("hotSwapClassLoader:{}", hotSwapClassLoader);
    }
  }
}

這里的配置邏輯將檢查應(yīng)用環(huán)境,并在開(kāi)發(fā)環(huán)境下設(shè)置自定義的類加載器。

4. 實(shí)現(xiàn)服務(wù)器監(jiān)聽(tīng)器

創(chuàng)建 MyServerListener 類,該類實(shí)現(xiàn)了 TioBootServerListener 接口。在服務(wù)器啟動(dòng)完成后,這個(gè)類將啟動(dòng) HotSwapWatcher 來(lái)監(jiān)聽(tīng)類文件的變化:

package com.litongjava.tio.web.hello.config;
import com.litongjava.hotswap.watcher.HotSwapWatcher;
import com.litongjava.hotswap.wrapper.tio.boot.TioBootArgument;
import com.litongjava.hotswap.wrapper.tio.boot.TioBootRestartServer;
import com.litongjava.jfinal.aop.Aop;
import com.litongjava.jfinal.aop.AopManager;
import com.litongjava.tio.boot.constatns.ConfigKeys;
import com.litongjava.tio.boot.context.Context;
import com.litongjava.tio.boot.server.TioBootServerListener;
import com.litongjava.tio.boot.utils.Enviorment;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class MyServerListener implements TioBootServerListener {
  protected static volatile HotSwapWatcher hotSwapWatcher;
  @Override
  public void boforeStart(Class<?>[] primarySources, String[] args) {
  }
  @Override
  public void afterStarted(Class<?>[] primarySources, String[] args, Context context) {
    Enviorment enviorment = Aop.get(Enviorment.class);
    String env = enviorment.get(ConfigKeys.appEnv);
    if("dev".endsWith(env)) {
      TioBootArgument tioBootArgument = new TioBootArgument(primarySources, args, context, true);
      AopManager.me().addSingletonObject(tioBootArgument);
      if (hotSwapWatcher == null) {
        // 使用反射執(zhí)行下面的代碼
         log.info("start hotSwapWatcher");
        hotSwapWatcher = new HotSwapWatcher(new TioBootRestartServer());
        hotSwapWatcher.start();
      }
    }
  }
}

在 afterStarted 方法中,如果處于開(kāi)發(fā)環(huán)境,則啟動(dòng) HotSwapWatcher。

5. 注冊(cè)服務(wù)器監(jiān)聽(tīng)器

最后,編寫 TioBootServerListenerConfig 類來(lái)在啟動(dòng)前將 TioBootServerListener 添加到 Aop 容器中:

package com.litongjava.tio.web.hello.config;
import com.litongjava.jfinal.aop.annotation.Bean;
import com.litongjava.jfinal.aop.annotation.BeforeStartConfiguration;
import com.litongjava.tio.boot.server.TioBootServerListener;
@BeforeStartConfiguration
public class TioBootServerListenerConfig {
  @Bean
  public TioBootServerListener tioBootServerListener() {
    return new MyServerListener();
  }
}

這將確保 MyServerListener 能夠正確注冊(cè)并在應(yīng)用啟動(dòng)時(shí)被調(diào)用。

6.測(cè)試加載效果

如果是Eclipse IDE,保持一個(gè)文件即可測(cè)試加載效果,如果是IDEA環(huán)境需要再運(yùn)行時(shí)手動(dòng)編譯(Build-->Recompile)文件才可以看到效果

源碼地址
https://github.com/litongjava/java-ee-tio-boot-study/tree/main/tio-boot-latest-study/tio-boot-env-study

tio-boot文檔

https://litongjava.github.io/tio-boot-docs/

以上就是tio-boot整合hotswap-classloader實(shí)現(xiàn)熱加載方法實(shí)例的詳細(xì)內(nèi)容,更多關(guān)于tio-boot hotswap-classloader熱加載的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • java微信紅包實(shí)現(xiàn)算法

    java微信紅包實(shí)現(xiàn)算法

    這篇文章主要為大家詳細(xì)介紹了java微信紅包實(shí)現(xiàn)算法,列出紅包的核心算法,具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2017-02-02
  • Java?for循環(huán)標(biāo)簽跳轉(zhuǎn)到指定位置的示例詳解

    Java?for循環(huán)標(biāo)簽跳轉(zhuǎn)到指定位置的示例詳解

    這篇文章主要介紹了Java?for循環(huán)標(biāo)簽跳轉(zhuǎn)到指定位置,本文通過(guò)實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-05-05
  • Java如何根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)

    Java如何根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù)

    這篇文章主要為大家詳細(xì)介紹了Java如何根據(jù)前端返回的字段名進(jìn)行查詢數(shù)據(jù),文中的示例代碼講解詳細(xì),感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-11-11
  • Springboot+hibernate實(shí)現(xiàn)簡(jiǎn)單的增刪改查示例

    Springboot+hibernate實(shí)現(xiàn)簡(jiǎn)單的增刪改查示例

    今天小編就為大家分享一篇Springboot+hibernate實(shí)現(xiàn)簡(jiǎn)單的增刪改查示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-08-08
  • SpringBoot?屬性配置中獲取值的方式

    SpringBoot?屬性配置中獲取值的方式

    這篇文章主要介紹了SpringBoot?屬性配置中獲取值的方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教
    2022-02-02
  • mybatis查詢語(yǔ)句揭秘之參數(shù)解析

    mybatis查詢語(yǔ)句揭秘之參數(shù)解析

    這篇文章主要給大家介紹了關(guān)于mybatis查詢語(yǔ)句之參數(shù)解析的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用mybatis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-04-04
  • SpringBoot測(cè)試類注入Bean失敗的原因及分析

    SpringBoot測(cè)試類注入Bean失敗的原因及分析

    SpringBoot 2.2版本前后測(cè)試類有所變化,2.2版本之后使用JUnit 5,導(dǎo)入注解@SpringBootTest和@Test來(lái)自junit.jupiter.api包;而2.2版本之前使用JUnit 4,需要額外導(dǎo)入@RunWith注解來(lái)自junit.runner包,無(wú)論哪個(gè)版本,都需確保測(cè)試類和啟動(dòng)類的包名一致
    2024-09-09
  • java敏感詞過(guò)濾的實(shí)現(xiàn)方式

    java敏感詞過(guò)濾的實(shí)現(xiàn)方式

    文章描述了如何搭建敏感詞過(guò)濾系統(tǒng)來(lái)防御用戶生成內(nèi)容中的違規(guī)、廣告或惡意言論,包括引入依賴、定義敏感詞類、非敏感詞類、替換詞類和工具類等步驟,并指出資源文件應(yīng)放在src/main/resources目錄下
    2025-12-12
  • java獲取時(shí)間的方法總結(jié)

    java獲取時(shí)間的方法總結(jié)

    以下是對(duì)java中獲取時(shí)間的幾種方法進(jìn)行了詳細(xì)的分析介紹,需要的朋友可以參考下
    2013-07-07
  • Sentinel初始化啟動(dòng)流程詳細(xì)介紹

    Sentinel初始化啟動(dòng)流程詳細(xì)介紹

    Sentinel是一個(gè)分布式系統(tǒng)的流量控制組件,它可以實(shí)現(xiàn)限流與流控及降級(jí)等功能,提高系統(tǒng)的穩(wěn)定性和可靠性,這篇文章主要介紹了Sentinel的初始化流程,感興趣想要詳細(xì)了解可以參考下文
    2023-05-05

最新評(píng)論

宁陵县| 泽州县| 永丰县| 八宿县| 新宾| 布尔津县| 兴化市| 连南| 芦溪县| 汾西县| 花莲市| 中超| 迁西县| 镶黄旗| 迭部县| 肥乡县| 清水河县| 姚安县| 安福县| 云安县| 云梦县| 四平市| 皋兰县| 百色市| 女性| 济源市| 枣强县| 都昌县| 宁化县| 中山市| 额敏县| 阜新市| 丹东市| 贵德县| 德州市| 寿光市| 福建省| 昭苏县| 通州市| 扎兰屯市| 外汇|