启动与关闭生命周期
本章依据 TioApplication 和 TioApplicationContext 当前 nexus.io 源码。用于理解配置顺序,不要求业务工程复制这些内部实现。
启动入口
TioApplication.run(...) 创建 TioApplicationContext,调用其 run 并返回 Context。可传入主类进行扫描,也可以显式传入 BootConfiguration。
import nexus.io.context.Context;
import nexus.io.tio.boot.TioApplication;
public class Application {
public static void main(String[] args) {
Context context = TioApplication.run(Application.class, args);
// 在需要管理应用生命周期的场景保存 context;关闭时调用 context.close()。
}
}
当前实现的关键顺序
EnvUtils.load(args)加载有效配置,启动框架线程工具。- 按主类和可用 AOP 组件进行扫描,准备 HTTP 配置、各类路由器及服务器对象。
- 若传入
BootConfiguration,调用它的config()。 - 执行扫描类的初始化注解,读取配置阶段安装的 Handler、拦截器等扩展。
- 初始化 HTTP 分发器。
- 调用服务器监听器的
beforeStart;允许监听时启动服务器并调用afterStarted。 - 监听分支中继续处理控制器扫描、路由日志和已启用的 Swagger 生成。
因此显式配置阶段可以取得 TioBootServer.me().getRequestRouter() 注册业务 Handler。不要在任意静态初始化块中假设路由器已经存在,也不要让同一初始化逻辑既由 BootConfiguration 调用,又被注解重复执行。
当前控制器扫描还发生在启动监听之后。不能仅凭端口已打开就断言所有控制器均已就绪,应等待启动完成并请求实际接口验证。
不监听模式的边界
SERVER_LISTENING_ENABLE 对应的配置控制是否启动网络监听。它仍会执行前面的配置过程,不能替代“无副作用测试模式”。数据库、邮件客户端或其他自定义配置可能已被初始化;当前控制器扫描又位于监听分支内,因此不监听模式也不能完整验证 HTTP 路由。
仅初始化测试配置可使用 TioBootTest,真实网络测试见 HTTP 集成测试。
关闭与异常
Context.close() 当前依次尝试服务器监听器 beforeStop、停止服务器、停止框架线程工具、关闭可用的 AOP 容器,再调用 afterStopped。业务创建的连接池、线程池和客户端需要通过所用框架扩展的关闭机制管理,不能假设任意 new 出来的资源都会被识别。
restart(primarySources, args) 调用关闭后重新启动。不要将进程内缓存、会话或未提交任务视为可跨重启保留。
部分启动失败分支会调用 System.exit(1),部分配置异常由 BOOT_EXCEPTION_EXIT 控制。测试启动失败场景时宜使用独立 JVM,避免测试执行器被一起结束。生产启动失败应修复原始配置或依赖错误,不能只关闭退出行为后继续对外服务。
