Skip to content

启动与关闭生命周期 ​

本章依据 TioApplication 和 TioApplicationContext 当前 nexus.io 源码。用于理解配置顺序,不要求业务工程复制这些内部实现。

启动入口 ​

TioApplication.run(...) 创建 TioApplicationContext,调用其 run 并返回 Context。可传入主类进行扫描,也可以显式传入 BootConfiguration。

java
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()。
  }
}

当前实现的关键顺序 ​

  1. EnvUtils.load(args) 加载有效配置,启动框架线程工具。
  2. 按主类和可用 AOP 组件进行扫描,准备 HTTP 配置、各类路由器及服务器对象。
  3. 若传入 BootConfiguration,调用它的 config()。
  4. 执行扫描类的初始化注解,读取配置阶段安装的 Handler、拦截器等扩展。
  5. 初始化 HTTP 分发器。
  6. 调用服务器监听器的 beforeStart;允许监听时启动服务器并调用 afterStarted。
  7. 监听分支中继续处理控制器扫描、路由日志和已启用的 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,避免测试执行器被一起结束。生产启动失败应修复原始配置或依赖错误,不能只关闭退出行为后继续对外服务。

MIT Licensed