#[initializer]Expand description
业务作用:把完整 Initialization trait impl 登记为业务二进制内的静态 initializer,
并与 Service 启动 Hook 动态登记的 initializer 合并成同一份冻结计划。
本属性只能标注安全、正向、无 impl 泛型参数的 Initialization trait impl,不能标注单个方法、
固有 impl、unsafe impl 或其它 trait。被登记的实例会严格参与三轮全局屏障:全部 before 完成后
才进入全部 initialize,全部 initialize 完成后才进入全部 after。
§执行阶段
Service 模式的时序为:业务 UserHook 完成登记并冻结 initializer 计划,组件完成 Prepare
(包括 migration 和出站依赖门禁),然后调用条件工厂并执行三轮 initializer 屏障。只有全部成功后,
Runner 才进入 Seal、组件 Ready、staged task 激活和 mark_ready();因此 initializer 执行期间
Web/WS listener、consumer 和服务发现尚未对外接流。
Batch 模式只收集静态 one-shot initializer,在组件 Prepare 之后、业务工作负载被 poll 之前
执行条件工厂和三轮屏障;hosted initializer 会被拒绝,Batch 工作负载中也不能动态补登记
initializer。hosted initializer 暂存的长期任务只在 Service 的组件 Ready 全部成功后交给
Supervisor,任务主体还会继续等待 mark_ready(),不会与初始化阶段并发执行。
§属性
name = "...":可选。应用内唯一的 canonical 身份,只允许 ASCII 小写字母、数字、_、-、., 长度为 1..=128 字节。省略时从 impl 的实现类型名派生 kebab-case,例如OrderCacheInitialization派生为order-cache-initialization;无法稳定派生时必须显式声明。 派生结果仍是依赖名、日志字段和指标 label 使用的稳定业务身份,重命名实现类型会同步改变该身份; 需要跨发布保持依赖引用和观测连续性时必须显式填写name。order = ...:可选i32整数字面量,默认100000。依赖条件相同且当前都可执行时,数值越小 越先执行;数值相同按name升序消除平局。requires依赖边始终优先于order,低order不能越过尚未完成的依赖。requires = ["..."]:可选,默认空。声明本项执行前必须成功启用并完成同阶段调用的 initializer, 最多 32 项;缺失、重复、自依赖或依赖环都会拒绝启动。kind = "one-shot" | "hosted":可选,默认"one-shot"。hosted只允许 Service 模式, 并可在after暂存 Ready 后启动的长期任务或 readiness;one-shot只执行有界初始化。factory = path:可选异步条件工厂。签名必须为async fn(Application) -> ApplicationResult<Option<T>>;Some(T)启用本项,None表示条件未命中,Err阻止应用接流。省略时实现类型必须实现Default。
§示例
#[derive(Default)]
struct OrderCacheInitialization;
#[nasa::initializer(order = 200, requires = ["schema"])]
impl nasa::application::Initialization for OrderCacheInitialization {
// 实现 before / initialize / after 中实际需要的阶段。
}参数说明:
attr:name/order/requires/kind/factory元数据。item:无 impl 泛型参数的安全、正向Initializationtrait impl。
返回:原 trait impl、类型擦除工厂和 linkme 静态描述;合同非法时返回定位到属性或 impl 的编译错误。