什么是 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)文件才可以看到效果
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。