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)文件才可以看到效果
tio-boot文档
https://litongjava.github.io/tio-boot-docs/
以上就是tio-boot整合hotswap-classloader实现热加载方法实例的详细内容,更多关于tio-boot hotswap-classloader热加载的资料请关注脚本之家其它相关文章!