3.9 什么是框架
从应用自己编排全部基础流程走到框架控制主流程、应用填充扩展点,沿生命周期、配置、回调和收尾边界诊断框架误用。
学习目标
- 能沿启动框架、读取配置、创建扩展、回调应用和统一收尾追踪一次框架生命周期
- 能解释框架的控制反转、默认控制流、扩展点和资源管理边界,并与库的主动调用区分
- 能在正常、边界和故障场景中回答:绕过生命周期私建关键对象时,配置、资源释放或横切能力在哪里失效
为什么需要这一机制
本页依据刘欣《码农翻身》(2018 年第 1 版)及出版社公开书目信息,独立重构 3.9 什么是框架。正文、代码、图示、实验和练习都是本课程重新设计的教学材料,不复制原书正文、插图、练习答案或代码。
3.9 什么是框架 不能停在“有很多工具的模板”。真实系统要解决的变化是从 应用自己编排全部基础流程 到 框架控制主流程,应用填充扩展点;可执行机制是:框架提供生命周期、默认控制流和扩展点,应用代码在约定时机被回调;库则通常由应用主动调用。
三个会让框架使用失真的陷阱
一个目录节点到框架证据
3.9 什么是框架
在 ↡由框架拥有主流程和生命周期,应用通过扩展点在约定时机被回调的程序结构。 中,控制流方向与库相反:框架决定何时启动、创建、回调和收尾,应用填充被允许的扩展点。合同可写成
这不是禁止应用逻辑,而是要求应用逻辑进入已声明的生命周期。若应用自己调用基础流程,配置、拦截和资源管理就不再由框架保证。
启动框架
↡加载框架运行时、注册基础能力并建立后续生命周期可以依赖的上下文的阶段。先建立上下文和控制流。应用应观察启动版本、环境、扩展注册和失败原因,而不是在启动前私取内部对象。
读取配置
↡在框架规定的阶段解析环境、配置和对象关系,并把结果绑定到运行时上下文的阶段。决定应用使用哪些依赖和策略。配置失败应在创建关键对象前暴露,不能等到业务回调才产生难以解释的空值。
创建扩展
↡根据配置和扩展点创建应用对象、注入依赖并登记其生命周期责任的阶段。是应用参与框架的入口。手动 new 一个同名对象可能缺少代理、拦截、配置和销毁回调,因此必须保留创建证据。
回调应用
↡框架在约定时机把请求、事件或生命周期上下文交给应用扩展执行的阶段。体现控制反转。回调参数、线程、事务、异常和重入约束都属于合同;应用不能假设它拥有整个主流程。
统一收尾
↡框架在正常关闭或故障退出时按注册顺序释放资源、提交或回滚状态并报告结果的阶段。让资源责任可追踪。实验要验证异常回调后连接、事务、线程和临时对象都回到基线。
最小可重放实现
baseline = framework.start(config)
extension = framework.createExtension(baseline, contract)
result = framework.invoke(extension, request)
assert framework.close(baseline).resources_released
assert replay(clean_state, request) == result这段实现草图只表达框架生命周期合同,不复制原书叙事或代码。实际运行时应保存配置版本、上下文、扩展、回调、资源 owner、异常和收尾结果,使另一位读者能够从干净状态重放。
五步复核一次框架生命周期
1. 启动框架并固定上下文
记录运行时版本、环境、启动顺序和上下文 ID。先预测正常请求会经过哪些生命周期阶段,再运行一次;启动失败应在应用回调前可诊断。
Lab
框架生命周期与控制反转实验
先预测框架何时创建和收尾,再切换配置边界与绕过入口并保存资源轨迹。
框架创建对象并在正常关闭时释放全部资源
start → config=ok → extension=managed → callback=ok → close=resources-zero
判定
accept:控制反转与收尾合同成立
当前样本:生命周期闭环;保存上下文 ID、配置版本、对象 ID、回调、资源 owner、首错和复位轨迹。
正常、边界与故障证据矩阵
| 样本 | 只改变的变量 | 预期判定 | 必存证据 |
|---|---|---|---|
| 正常 | 生命周期、配置、扩展和回调均由框架管理 | 回调完成,收尾释放资源 | 上下文 ID、对象 ID、阶段、资源 owner |
| 边界 | 配置缺项、扩展版本或回调异常改变 | 在明确阶段拒绝并执行收尾 | 配置来源、首错、回滚、资源计数 |
| 故障 | 私建对象或绕过框架入口 | 标记横切能力和生命周期缺失 | 创建路径、代理/拦截、关闭状态、复位轨迹 |
故障诊断:先分开控制流、对象图与资源收尾
- 启动侧:查版本、环境、上下文 ID 和注册顺序;不要在框架未启动时取内部对象。
- 配置侧:查来源、优先级、必填项、依赖和生效阶段;默认值不能遮住配置失败。
- 扩展侧:查创建路径、注入、代理、拦截和 owner;私建对象常常绕过横切能力。
- 回调/收尾侧:查线程、事务、异常、资源计数和关闭顺序;回调成功不等于生命周期成功。
如果事务或监控没有生效,先比较容器创建与手动构造的对象;如果异常后连接泄露,沿资源 owner 查统一收尾;如果配置改了却不生效,查读取阶段和上下文版本。每次只改变一个生命周期边界,并重放可信基线。
术语表
名词解释
本章出现的专业名词,用大白话再讲一遍。
- 3.9 什么是框架
由框架拥有主流程和生命周期,应用通过扩展点在约定时机被回调的程序结构。
- 启动框架
加载运行时、注册基础能力并建立后续生命周期上下文的阶段。
- 读取配置
在规定阶段解析配置和对象关系并绑定到运行时上下文的阶段。
- 创建扩展
根据配置创建应用对象、注入依赖并登记生命周期责任的阶段。
- 回调应用
框架在约定时机把请求或事件交给应用扩展执行的阶段。
- 统一收尾
在正常关闭或故障退出时释放资源、提交或回滚状态并报告结果的阶段。
练习
练习
问题 1(3.9 什么是框架): 框架和库都能复用代码,为什么控制流方向是区分它们的重要证据?
问题 2(启动框架、读取配置、创建扩展): 一个应用对象手动构造后能正常返回结果,为什么仍可能不是框架认可的对象?
问题 3(回调应用、统一收尾): 设计一次回调抛错实验,说明如何证明框架在异常路径仍完成资源收尾。
本页小结
3.9 什么是框架 的关键不是工具数量,而是控制反转:框架拥有启动、配置、对象创建、回调与收尾,应用填充扩展点。完成标准是定位绕过生命周期造成的首个偏离,并证明正常与异常路径的资源和横切状态都能在复位后回到基线。