java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > tio-boot hotswap-classloader热加载

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

作者:李通

这篇文章主要为大家介绍了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 和 tio-boot 不仅提高了开发效率,而且增强了网络应用开发的灵活性和便利性。这对于希望快速迭代和改进其网络应用的开发团队来说,是一个非常有价值的组合。

整合 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热加载的资料请关注脚本之家其它相关文章!

您可能感兴趣的文章:
阅读全文