应用生命周期¶
Cullinan 的生命周期现在通常由当前活动的 Application 驱动;它会装配并持有
一个 ApplicationContext 和一个 WebRuntime。
主要阶段¶
- 发现模块 ——
Application.run()收集根模块图及其声明的包归属 - 装配运行时 —— 创建
ApplicationContext与WebRuntime候选实例 - 校验与预热 —— 执行健康检查、
refresh()、router/dispatcher 绑定与 warmup hooks - 激活 —— 原子切换活动运行时,并让旧运行时进入 draining
- 处理请求 —— request scope 与中间件围绕请求绑定的应用快照运行
- Drain 与关闭 —— 待飞行中的请求完成后,旧上下文执行 shutdown,运行时关闭
生命周期钩子¶
受管组件可实现:
on_post_construct()on_startup()on_shutdown()on_pre_destroy()
同样支持 _async 后缀的异步版本。
顺序控制¶
若组件必须先于其他组件启动或延后关闭,可实现 get_phase()。较低 phase 会更早启动、但在关闭时更晚执行。
请求作用域¶
request scope 依赖绑定到当前请求上下文。适配器会在分发前把活动 runtime
绑定到请求上下文,并在分发结束后释放。运行时切换期间,Application.current() 会在
该请求结束前持续返回请求绑定的应用快照。
Reload 与 draining¶
Application.reload() 会先构建新的候选运行时,只有在校验与预热成功后才切换为
活动运行时。旧运行时会进入 DRAINING,继续服务已有请求,并在请求计数归零后
真正关闭。
中间件桥接¶
应用启动阶段可把旧式 middleware 注册桥接进 gateway pipeline,使历史模块仍能参与请求处理,而新代码统一走 Web Runtime。