tio-boot整合hotswap-classloader实现热加载方法实例

 更新时间:2023年12月19日 08:59:35   作者:李通  
这篇文章主要为大家介绍了tio-boot整合hotswap-classloader实现热加载方法实例,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪

什么是 hotswap-classloader?

hotswap-classloader 是一款由开发者 litongjava 创建的 Java 动态类加载器。这个工具的核心功能是支持在 Java 应用运行时动态地更换或更新类定义,而无需重启整个JVM。这种热替换(hot swapping)的能力对于开发过程中的迭代和测试尤其有价值,因为它大大减少了等待应用重启的时间。

什么是 tio-boot?

tio-boot 是一个基于 Java 的网络编程框架,用于简化网络应用的开发。它提供了一套丰富的 API 和工具,使开发者能够更容易地构建和部署网络服务和应用。tio-boot 支持多种网络协议,并且提供了高性能和可扩展性。

为什么将 hotswap-classloader 和 tio-boot 结合使用?

结合使用 hotswap-classloader 和 tio-boot 可以为 Java 网络应用开发带来以下几个关键优势:

  • 快速迭代和测试:通过使用 hotswap-classloader,开发者可以在不重启服务器的情况下实时更新类文件,从而实现快速迭代和即时测试。
  • 提升开发效率:减少了重启应用程序所需的时间,开发者可以更加专注于代码的编写和改进,从而提高工作效率。
  • 适合敏捷开发:在敏捷开发模式下,需要频繁地进行更改和测试。hotswap-classloader 的动态加载能力使得这一过程更加流畅和高效。

总的来说,结使用 hotswap-classloader 和 tio-boot 不仅提高了开发效率,而且增强了网络应用开发的灵活性和便利性。这对于希望快速迭代和改进其网络应用的开发团队来说,是一个非常有价值的组合。

整合 hotswap-classloader,开启热加载有两种方式,

  • 在启动中使用 TioApplicationWrapper 启动
  • 启动配置类配置 hotswap-classloader

这里重点介绍第二种方式

如何在开发环境下使用 hotswap-classloader 和 tio-boot 实现动态类加载。

1. 添加 hotswap-classloader 依赖

首先,您需要在您的 Java 项目中添加 hotswap-classloader 依赖。在项目的 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>

这将确保您的项目能够使用 hotswap-classloader

2. 创建启动类

创建一个简单的启动类 HelloApp 来使用 tio-boot 启动您的应用。这个类将定义一个基本的 HTTP 请求路径和一个处理方法:

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

这个类中的 main 方法将启动 tio-boot,而 index 方法将响应根路径的 HTTP 请求。

3. 配置类加载器

创建 HotSwapClassLoaderConfig 类以配置动态类加载器。这个配置类在服务器启动之前设置自定义的类加载器,以便于开发环境下的热替换:

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);
    }
  }
}

这里的配置逻辑将检查应用环境,并在开发环境下设置自定义的类加载器。

4. 实现服务器监听器

创建 MyServerListener 类,该类实现了 TioBootServerListener 接口。在服务器启动完成后,这个类将启动 HotSwapWatcher 来监听类文件的变化:

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) {
        // 使用反射执行下面的代码
         log.info("start hotSwapWatcher");
        hotSwapWatcher = new HotSwapWatcher(new TioBootRestartServer());
        hotSwapWatcher.start();
      }
    }
  }
}

在 afterStarted 方法中,如果处于开发环境,则启动 HotSwapWatcher

5. 注册服务器监听器

最后,编写 TioBootServerListenerConfig 类来在启动前将 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 能够正确注册并在应用启动时被调用。

6.测试加载效果

如果是Eclipse IDE,保持一个文件即可测试加载效果,如果是IDEA环境需要再运行时手动编译(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实现热加载方法实例的详细内容,更多关于tio-boot hotswap-classloader热加载的资料请关注脚本之家其它相关文章!

相关文章

  • java单元测试JUnit框架原理与用法实例教程

    java单元测试JUnit框架原理与用法实例教程

    这篇文章主要介绍了java单元测试JUnit框架原理与用法,结合实例形式较为详细的分析了java单元测试JUnit框架的概念、原理、使用方法及相关注意事项,需要的朋友可以参考下
    2017-11-11
  • Java通俗易懂系列设计模式之模板模式

    Java通俗易懂系列设计模式之模板模式

    这篇文章主要介绍了Java通俗易懂系列设计模式之模板模式,想了解设计模式的同学,可以仔细看一下
    2021-04-04
  • java通过DelayQueue实现延时任务

    java通过DelayQueue实现延时任务

    本文主要介绍了java通过DelayQueue实现延时任务,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-07-07
  • 理解JDK动态代理为什么必须要基于接口

    理解JDK动态代理为什么必须要基于接口

    这篇文章主要介绍了理解JDK动态代理为什么必须要基于接口,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-10-10
  • 深入解析Spring Cloud内置的Zuul过滤器

    深入解析Spring Cloud内置的Zuul过滤器

    这篇文章主要给大家深入的介绍了Spring Cloud内置的Zuul过滤器的相关资料,文中给大家介绍的很详细,相信对大家具有一定的参考价值,需要的朋友们下面来一起看看吧。
    2017-02-02
  • 详解SpringMVC Controller介绍及常用注解

    详解SpringMVC Controller介绍及常用注解

    本篇文章主要介绍了SpringMVC Controller介绍及常用注解,小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-06-06
  • Java集合中的LinkedHashSet源码解读

    Java集合中的LinkedHashSet源码解读

    这篇文章主要介绍了Java集合中的LinkedHashSet源码解读,在LinkedHashMap中,双向链表的遍历顺序通过构造方法指定,如果没有指定,则使用默认顺序为插入顺序,即accessOrder=false,需要的朋友可以参考下
    2023-12-12
  • 详解Java中方法重写和方法重载的6个区别

    详解Java中方法重写和方法重载的6个区别

    方法重写和方法重载都是面向对象编程中,那么方法重写和方法重载有哪些区别,本文就详细的来介绍一下,感兴趣的可以了解一下
    2022-01-01
  • 如何将Java打开CSV文件到JTable展示

    如何将Java打开CSV文件到JTable展示

    本文主要介绍了如何将Java打开CSV文件到JTable展示,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2023-03-03
  • 在IntelliJ IDEA中.idea文件是什么可以删除吗

    在IntelliJ IDEA中.idea文件是什么可以删除吗

    相信有很多小伙伴,在用idea写java代码的时候,创建工程总是会出现.idea文件,该文件也从来没去打开使用过,那么它在我们项目里面,扮演什么角色,到底能不能删除它呢?这篇文章主要介绍了在IntelliJ IDEA中.idea文件是什么可以删除吗,需要的朋友可以参考下
    2024-01-01

最新评论