核心概念
本页讲清 0.2 的三个基础模型:作用域树、生命周期、依赖声明。其余手册页会引用这里的结论,不再重复解释。
作用域树
作用域(Scope)是资源的归属单元。框架启动时创建一棵作用域树:根作用域持有核心服务,每个插件在安装(主体执行)时获得一个从根作用域派生的子作用域。
text
rootScope(核心服务、插件 share 提升的服务)
├── 插件 A 的子作用域(A 自己的登记)
└── 插件 B 的子作用域(B 自己的登记)作用域的规则只有三条:
- 父链读取:
get/has/list先查本作用域,未命中沿父链向上逐层委托。因此插件可以读到根作用域的全部服务,但读不到兄弟插件的登记。 - 登记归属:
set/register/provide登记的资源归属调用时所在的作用域。子作用域的登记不污染父作用域;要对全框架提供服务,用share提升到根作用域(见 编写服务)。 - 显式销毁:
dispose()是唯一的销毁入口,可等待且幂等。销毁顺序先子后父——父作用域销毁时,所有子作用域先按创建逆序销毁。
插件拿到的 Context 是绑定到其子作用域的使用者视图:读取与登记都委托给该子作用域,作用域的创建与销毁由框架控制。
生命周期
每个作用域持有独立的生命周期(Lifecycle),状态机为:
text
PENDING → STARTING → ACTIVE → STOPPING → STOPPED
失败时进入 → FAILED
STOPPED / FAILED 可再次 start(enable/disable 开关的底座)
dispose() 进入终态 DISPOSED,拒绝一切后续操作四个钩子阶段:
onStart:随启动按注册顺序执行;钩子持久保留,STOPPED 后再次启动会重新触发;onBeforeStop:停止时最先执行(用于停止前的通知);onStop:清理钩子,按注册逆序执行,同样持久保留;onDispose:终态钩子,仅dispose()时执行一次。
关键语义:所有清理都是可等待的。插件的禁用、卸载,框架的停止,都会等待钩子完成;单个钩子失败不阻断其余清理,失败最终汇总抛出。
依赖声明
插件通过 inject 声明依赖,按名字解析:
- 名字命中作用域中登记的服务:作为服务依赖。实例沿父链经
context.get()读取。 - 名字命中已安装的插件:作为插件依赖。仅约束启动顺序(被依赖方先启动、后停止),不注入实例。
- 都不命中:视为缺失依赖,插件进入"等待依赖"状态——install 挂起主体、enable 标记期望启用,依赖补齐后自动迁移。
框架按依赖拓扑排序启动插件,停止时按拓扑逆序;依赖消失时级联停止、恢复时级联重启。细节见 依赖与诊断。
从 Container 到 Scope
0.1 的 Container 在 0.2 已完全移除,作用域是唯一的资源管理入口。0.1 代码的迁移方法见 0.1 → 0.2 迁移指南。