新紫导航网-网站收录-自动收录网址,全站导航网
免费加入

热度:

编号:66513

分类:电影视频

加入:2025-05-07 11:49:12

点入:2025-05-15 06:47:26

备案:-

名称:-

SEO更新时间
2025-05-15T06:47:29

百度权重:百度权重0
百度移动:百度移动0
360 权重:360权重0
搜狗权重:搜狗权重0
gudqs7s note

访问网站

http://gudqs7.cn

举报/报错
seo综合信息
SEO信息 百度来访IP:- | 移动端来访IP:- | 出站链接:0 | 站内链接:0
IP网速: IP地址:- 地址:- | 网速:589毫秒
ALEXA排名 世界排名:- | 预估IP:- | 预估PV:-
备案信息 - | 名称:- | 已创建:未知
收录 百度 360 搜狗 谷歌
查询 0 0 0 0
电脑关键词 手机关键词 页面友好 首页位置 索引 近期收录
0 0 电脑端优秀 - 0 0
服务器信息 协议类型 - 页面类型 - 服务器类型 - 程序支持 - 连接标识 - 消息发送 - GZIP检测 - 源文件大小 - 压缩后大小 - 压缩率 -
网站快照

g u d q s 7 s n o t e g u d q s 7 s n o t e 心 累 没 钱 躺 尸 中 首 页 关 于 标 签 分 类 归 档 0 % S p r i n g 源 码 笔 记 置 顶 | 发 表 于 2 0 2 1 0 1 2 3 更 新 于 2 0 2 1 0 3 2 8 分 类 于 j a v a , s o u r c e c o d e , s p r i n g D i s q u s : S p r i n g 源 码 分 析 关 键 类 介 绍 A p p l i c a t i o n C o n t e x t 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 万 能 的 a p p l i c a t i o n C o n t e x t , 但 实 际 上 各 种 能 力 都 是 依 赖 于 其 他 的 类 , 比 如 g e t B e a n 是 b e a n F a c t o r y 的 , p u b l i s h E v e n t 是 事 件 广 播 器 的 , 等 等 . 其 本 身 是 一 个 综 合 体 , 整 合 这 些 能 力 , 便 于 开 发 者 调 用 和 理 解 . # 下 面 列 一 下 相 关 的 接 口 , 抽 象 类 , 和 具 体 类 A p p l i c a t i o n C o n t e x t 是 一 个 只 读 的 b e a n 容 器 可 以 加 载 解 析 配 置 文 件 ( 如 x m l ) 可 以 发 布 事 件 和 注 册 监 听 具 有 国 际 化 消 息 处 理 能 力 C o n f i g u r a b l e A p p l i c a t i o n C o n t e x t 是 一 个 具 有 可 配 置 能 力 的 容 器 ( 可 设 置 各 个 参 数 , 如 i d , 父 容 器 ) 具 有 容 器 生 命 周 期 概 念 , 如 启 动 , 停 止 , 关 闭 . A b s t r a c t A p p l i c a t i o n C o n t e x t 模 板 方 法 模 式 的 抽 象 类 , 定 义 了 容 器 的 模 板 ( r e f r e s h 方 法 ) , 但 由 具 体 的 子 类 实 现 部 分 方 法 管 理 B e a n 和 B e a n F a c t o r y 的 P o s t P r o c e s s o r 管 理 事 件 的 监 听 和 处 理 A b s t r a c t R e f r e s h a b l e A p p l i c a t i o n C o n t e x t 为 可 重 复 刷 新 的 容 器 提 供 基 类 加 入 了 B e a n F a c t o r y 的 管 理 ( 创 建 / 关 闭 等 ) A b s t r a c t R e f r e s h a b l e C o n f i g A p p l i c a t i o n C o n t e x t 加 入 了 c o n f i g L o c a t i o n 字 段 , 用 于 某 些 容 器 初 始 化 B e a n F a c t o r y 和 B e a n A b s t r a c t X m l A p p l i c a t i o n C o n t e x t 定 义 了 读 取 x m l 配 置 文 件 来 加 载 B e a n F a c t o r y 的 代 码 , 使 得 子 类 只 需 提 供 配 置 文 件 地 址 或 R e s o u r c e C l a s s P a t h X m l A p p l i c a t i o n C o n t e x t 继 承 基 类 , 提 供 配 置 文 件 地 址 的 构 造 方 法 , 调 用 r e f r e s h 加 载 B e a n F a c t o r y B e a n F a c t o r y 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 1 . 核 心 中 的 核 心 , 加 载 和 管 理 b e a n D e f i n i t i o n s ( B e a n 配 置 信 息 ) , 创 建 和 管 理 b e a n 对 象 实 例 , 注 册 和 管 理 B e a n P o s t P r o c e s s o r ( B e a n 扩 展 ) # 下 面 列 一 下 相 关 的 接 口 , 抽 象 类 , 和 具 体 类 B e a n F a c t o r y 定 义 了 B e a n 的 基 础 操 作 接 口 , 如 g e t B e a n , g e t T y p e , i s S i n g l e t o n 等 S i n g l e t o n B e a n R e g i s t r y 定 义 了 单 例 对 象 的 操 作 接 口 ( 注 册 / 获 取 / 是 否 已 存 在 ) H i e r a r c h i c a l B e a n F a c t o r y 定 义 了 父 B e a n F a c t o r y 的 相 关 操 作 接 口 ( 获 取 ) C o n f i g u r a b l e B e a n F a c t o r y 定 义 了 对 B e a n F a c t o r y 做 各 种 配 置 的 操 作 接 口 , 包 括 B e a n P o s t P r o c e s s o r , s e t P a r e n t B e a n F a c t o r y , d e s t r o y B e a n , r e g i s t e r A l i a s , r e s o l v e A l i a s e s 等 D e f a u l t S i n g l e t o n B e a n R e g i s t r y 实 现 了 S i n g l e t o n B e a n R e g i s t r y 接 口 , 即 实 现 了 单 例 对 象 的 缓 存 管 理 , 包 括 一 级 / 二 级 / 三 级 ( 二 级 三 级 只 依 赖 循 环 用 上 的 两 个 缓 存 ) F a c t o r y B e a n R e g i s t r y S u p p o r t 继 承 了 D e f a u l t S i n g l e t o n B e a n R e g i s t r y 实 现 对 使 用 F a c t o r y B e a n 存 储 和 获 取 b e a n 对 象 实 例 方 式 的 支 持 A b s t r a c t B e a n F a c t o r y 继 承 了 F a c t o r y B e a n R e g i s t r y S u p p o r t 实 现 了 B e a n F a c t o r y / H i e r a r c h i c a l B e a n F a c t o r y / C o n f i g u r a b l e B e a n F a c t o r y 定 义 的 接 口 实 现 了 具 体 g e t B e a n , 包 括 缓 存 管 理 等 A u t o w i r e C a p a b l e B e a n F a c t o r y 定 义 了 根 据 c l a s s 类 型 获 取 B e a n D e f i n i t i o n 信 息 以 及 B e a n 对 象 的 接 口 A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y 继 承 自 A b s t r a c t B e a n F a c t o r y 实 现 了 A u t o w i r e C a p a b l e B e a n F a c t o r y 中 定 义 的 方 法 ( 就 是 实 现 了 根 据 c l a s s 获 取 b e a n 或 B e a n D e f i n i t i o n ) 实 现 了 c r e a t e B e a n , 也 就 是 真 正 的 实 例 化 一 个 对 象 的 过 程 , 包 括 实 例 化 , 为 需 要 赋 值 的 字 段 注 入 相 应 的 值 同 时 触 发 了 B e a n P o s t P r o c e s s o r 的 方 法 调 用 B e a n D e f i n i t i o n R e g i s t r y 定 义 了 B e a n D e f i n i t i o n 的 注 册 / 获 取 / 移 除 L i s t a b l e B e a n F a c t o r y 定 义 了 B e a n D e f i n i t i o n 的 可 遍 历 性 C o n f i g u r a b l e L i s t a b l e B e a n F a c t o r y 结 合 L i s t a b l e B e a n F a c t o r y 和 C o n f i g u r a b l e B e a n F a c t o r y 并 补 充 完 善 了 几 个 相 关 接 口 ( 如 g e t B e a n N a m e s I t e r a t o r 接 口 ) D e f a u l t L i s t a b l e B e a n F a c t o r y 继 承 了 A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y 实 现 了 B e a n D e f i n i t i o n R e g i s t r y / C o n f i g u r a b l e L i s t a b l e B e a n F a c t o r y 的 接 口 # 总 结 : 定 义 处 : B e a n F a c t o r y ( g e t B e a n ) S i n g l e t o n B e a n R e g i s t r y ( a d d S i n g l e t o n ) H i e r a r c h i c a l B e a n F a c t o r y ( g e t P a r e n t B e a n F a c t o r y ) C o n f i g u r a b l e B e a n F a c t o r y ( a d d B e a n P o s t P r o c e s s o r ) A u t o w i r e C a p a b l e B e a n F a c t o r y ( a u t o w i r e B e a n ) B e a n D e f i n i t i o n R e g i s t r y ( r e g i s t e r B e a n D e f i n i t i o n ) L i s t a b l e B e a n F a c t o r y ( g e t B e a n D e f i n i t i o n N a m e s ) C o n f i g u r a b l e L i s t a b l e B e a n F a c t o r y ( g e t B e a n N a m e s I t e r a t o r ) 实 现 处 : D e f a u l t S i n g l e t o n B e a n R e g i s t r y ( r e g i s t e r S i n g l e t o n ) F a c t o r y B e a n R e g i s t r y S u p p o r t ( g e t O b j e c t F r o m F a c t o r y B e a n ) A b s t r a c t B e a n F a c t o r y ( d o G e t B e a n ) A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y ( c r e a t e B e a n ) D e f a u l t L i s t a b l e B e a n F a c t o r y ( r e g i s t e r B e a n D e f i n i t i o n ) 容 器 初 始 化 过 程 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 . s e t P a r e n t ( ) : 处 理 父 容 器 2 . s e t C o n f i g L o c a t i o n s ( ) : 解 析 并 设 置 x m l 配 置 文 件 路 径 3 . r e f r e s h ( ) : 创 建 b e a n F a c t o r y 对 象 并 初 始 化 , 读 取 x m l 配 置 文 件 得 到 b e a n D e f i n i t i o n s , 接 着 处 理 两 种 P o s t P r o c e s s o r , 然 后 添 加 国 际 化 处 理 器 和 事 件 广 播 器 以 及 相 应 的 初 始 化 和 一 些 处 理 , 最 后 实 例 化 单 例 的 b e a n 等 等 . # 外 圈 结 束 , 再 看 r e f r e s h ( ) 里 面 的 每 个 方 法 1 . p r e p a r e R e f r e s h ( ) : 准 备 工 作 , 一 些 字 段 值 的 设 置 和 处 理 . 2 . o b t a i n F r e s h B e a n F a c t o r y ( ) : 创 建 一 个 b e a n F a c t o r y 对 象 并 注 册 到 a p p l i c a t i o n C o n t e x t ( 即 赋 值 到 字 段 上 ) , 然 后 解 析 x m l 配 置 文 件 ( 或 注 解 配 置 ) 的 信 息 , 解 析 得 到 b e a n D e f i n i t i o n s 并 注 册 到 容 器 中 . 3 . 然 后 是 一 些 对 b e a n F a c t o r y 对 象 的 完 善 配 置 的 代 码 4 . 扫 描 并 执 行 B e a n F a c t o r y P o s t P r o c e s s o r ( 其 作 用 是 为 b e a n F a c t o r y 对 象 添 加 东 西 提 供 扩 展 性 ) , 其 中 我 认 识 的 就 只 有 C o n f i g u r a t i o n C l a s s P o s t P r o c e s s o r ( 这 个 类 作 用 就 是 解 析 @ C o n f i g u r a t i o n / @ C o m p o n e n t / @ I m p o r t / @ I m p o r t S o u r c e / @ C o m p o n e n t S c a n 等 基 础 注 解 ) . 5 . 扫 描 实 现 了 B e a n P o s t P r o c e s s o r 接 口 的 b e a n 并 注 册 到 b e a n F a c t o r y 中 存 起 来 , 等 c r e a t e B e a n 创 建 对 象 时 会 在 对 应 的 时 机 执 行 一 些 对 应 的 方 法 ( 钩 子 ) . 常 见 的 各 种 X x x A w a r e 就 是 靠 这 个 实 现 的 咯 . 6 . 接 着 , 初 始 化 国 际 化 资 源 处 理 器 , 事 件 广 播 器 , 并 注 册 一 些 需 要 注 册 的 事 件 ( 也 注 册 容 器 内 实 现 对 应 接 口 的 b e a n ) 7 . 处 理 一 些 b e a n F a c t o r y 的 配 置 , 接 着 为 所 有 单 例 且 非 懒 加 载 的 ( 不 就 是 默 认 策 略 嘛 ) b e a n 创 建 实 例 , 缓 存 起 来 . 8 . 广 播 容 器 加 载 完 成 了 的 事 件 . 以 及 处 理 生 命 周 期 . 最 后 总 结 下 , 先 创 建 容 器 , 再 将 根 据 配 置 文 件 解 析 得 到 B e a n D e f i n i t i o n 注 册 到 容 器 中 , 然 后 处 理 两 大 扩 展 ( B e a n F a c t o r y P o s t P r o c e s s o r / B e a n P o s t P r o c e s s o r ) , 接 着 是 S p r i n g 的 国 际 化 , 以 及 相 当 有 用 的 事 件 广 播 器 , 最 后 实 例 化 b e a n . 整 体 感 觉 其 实 很 简 单 , 但 其 实 有 大 量 的 工 作 交 给 了 B e a n P o s t P r o c e s s o r . 超 长 源 码 分 析 过 程 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 7 0 7 1 / / 先 随 便 写 个 m a i n 方 法 , 如 我 写 的 , 可 测 试 依 赖 循 环 问 题 和 事 件 监 听 : / / 包 名 : c n . g u d q s 7 . s p r i n g . t e s t s , 改 动 则 需 同 步 修 改 x m l 哦 / / 进 入 对 应 类 代 码 : 快 捷 键 C m d + O p t i o n + 鼠 标 点 击 ( 或 C t r l + A l t + 鼠 标 左 键 ) ; 如 果 是 接 口 松 开 O p t i o n ( 或 A l t ) 键 T e s t . j a v a p u b l i c c l a s s T e s t } a p p l i c a t i o n w q . x m l 1 . 0 e n c o d i n g = U T F 8 ? > h t t p : / / w w w . w 3 . o r g / 2 0 0 1 / X M L S c h e m a i n s t a n c e x m l n s = h t t p : / / w w w . s p r i n g f r a m e w o r k . o r g / s c h e m a / b e a n s x s i : s c h e m a L o c a t i o n = h t t p : / / w w w . s p r i n g f r a m e w o r k . o r g / s c h e m a / b e a n s h t t p : / / w w w . s p r i n g f r a m e w o r k . o r g / s c h e m a / b e a n s / s p r i n g b e a n s . x s d d e f a u l t a u t o w i r e = b y N a m e > u s e r S e r v i c e c l a s s = c n . g u d q s 7 . s p r i n g . t e s t s . U s e r S e r v i c e I m p l > s e r v e r S t a r t e r c l a s s = c n . g u d q s 7 . s p r i n g . t e s t s . S e r v e r S t a r t e r > U s e r S e r v i c e I m p l . j a v a @ S e r v i c e p u b l i c c l a s s U s e r S e r v i c e I m p l p u b l i c v o i d s e t S t a r t e r ( S e r v e r S t a r t e r s t a r t e r ) } S e r v e r S t a r t e r . j a v a @ S e r v i c e p u b l i c c l a s s S e r v e r S t a r t e r i m p l e m e n t s A p p l i c a t i o n L i s t e n e r C o n t e x t R e f r e s h e d E v e n t > p u b l i c v o i d s e t U s e r S e r v i c e ( U s e r S e r v i c e I m p l u s e r S e r v i c e ) } 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 / / 接 下 来 , 进 入 C l a s s P a t h X m l A p p l i c a t i o n C o n t e x t # C l a s s P a t h X m l A p p l i c a t i o n C o n t e x t ( j a v a . l a n g . S t r i n g ) 方 法 中 / / 其 跳 转 到 了 p u b l i c C l a s s P a t h X m l A p p l i c a t i o n C o n t e x t ( S t r i n g [ ] c o n f i g L o c a t i o n s , b o o l e a n r e f r e s h , @ N u l l a b l e A p p l i c a t i o n C o n t e x t p a r e n t ) t h r o w s B e a n s E x c e p t i o n } 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 7 0 7 1 7 2 7 3 7 4 7 5 7 6 7 7 7 8 7 9 8 0 8 1 8 2 8 3 8 4 8 5 8 6 8 7 8 8 8 9 9 0 9 1 9 2 9 3 9 4 9 5 9 6 9 7 / / 然 后 具 体 的 看 r e f r e s h 方 法 p u b l i c v o i d r e f r e s h ( ) t h r o w s B e a n s E x c e p t i o n , I l l e g a l S t a t e E x c e p t i o n c a t c h ( B e a n s E x c e p t i o n e x ) / / D e s t r o y a l r e a d y c r e a t e d s i n g l e t o n s t o a v o i d d a n g l i n g r e s o u r c e s . / / 销 毁 缓 存 的 单 例 对 象 d e s t r o y B e a n s ( ) ; / / R e s e t a c t i v e f l a g . / / 变 更 状 态 c a n c e l R e f r e s h ( e x ) ; / / P r o p a g a t e e x c e p t i o n t o c a l l e r . t h r o w e x ; } f i n a l l y } } 我 错 了 , 代 码 都 放 上 去 不 如 给 个 G i t H u b 地 址 , 接 下 来 省 略 代 码 吧 , 只 放 注 释 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 😄 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 / / 挨 个 看 里 面 的 方 法 o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . A b s t r a c t A p p l i c a t i o n C o n t e x t # p r e p a r e R e f r e s h / / 1 . 设 置 容 器 初 始 的 一 些 属 性 , 如 启 动 时 间 , 当 前 状 态 / / 2 . 打 印 开 始 日 志 / / 3 . 初 始 化 占 位 符 数 据 源 / / 4 . 校 验 所 有 b e a n 所 使 用 的 占 位 符 是 否 存 在 / / 5 . 清 空 事 件 和 监 听 / / S w i t c h t o a c t i v e . o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . A b s t r a c t R e f r e s h a b l e A p p l i c a t i o n C o n t e x t # r e f r e s h B e a n F a c t o r y / / 1 . 存 在 旧 的 则 先 摧 毁 b e a n 对 象 实 例 及 缓 存 数 据 , 再 将 旧 的 置 为 n u l l / / 2 . 创 建 一 个 新 的 b e a n F a c t o r y 对 象 , 再 设 置 i d 及 一 些 配 置 / / 3 . 扫 描 并 加 载 b e a n D e f i n a t i o n s / / 4 . 设 置 这 个 新 的 b e a n F a c t o r y 对 象 为 a p p l i c a t i o n C o n t e x t 的 b e a n F a c t o r y 字 段 值 . o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . A b s t r a c t A p p l i c a t i o n C o n t e x t # p r e p a r e B e a n F a c t o r y / / 1 . 设 置 b e a n F a c t o r y 的 类 加 载 器 / / 2 . 设 置 b e a n F a c t o r y 的 表 达 式 解 析 器 / / 3 . 1 : 注 册 一 个 B e a n P o s t P r o c e s s o r 用 于 将 实 现 了 A p p l i c a t i o n C o n t e x t 能 力 相 关 的 A w a r e 接 口 的 b e a n , 触 发 赋 值 s e t t e r 注 入 a p p l i c a t i o n C o n t e x t 对 象 / / 3 . 2 : 设 置 b e a n F a c t o r y 处 理 b e a n 时 要 忽 略 的 接 口 ( 主 要 是 s e t t e r 注 入 时 忽 视 一 些 也 是 s e t t e r 的 方 法 , 因 为 这 些 方 法 会 由 P o s t P r o c e s s o r 来 触 发 ) / / 4 . 注 册 一 些 特 殊 的 b e a n ( 注 入 这 些 b e a n 时 会 注 入 t h i s 对 象 : 多 功 能 工 具 人 A p p l i c a t i o n C o n t e x t , 可 见 其 和 普 通 b e a n 的 注 册 方 式 不 一 样 ) / / 5 . 注 册 一 个 B e a n P o s t P r o c e s s o r 用 于 检 测 加 载 的 b e a n 是 否 实 现 了 A p p l i c a t i o n L i s t e n e r 接 口 , 若 是 , 则 注 册 到 事 件 广 播 器 中 ( 不 是 , 是 暂 存 在 a p p l i c a t i o n L i s t e n e r s 字 段 中 , 等 事 件 广 播 器 创 建 后 才 注 册 ) / / 6 . 注 册 一 个 B e a n P o s t P r o c e s s o r 用 于 触 发 实 现 了 L o a d T i m e W e a v e r A w a r e 接 口 的 b e a n 的 s e t L o a d T i m e W e a v e r ( ) 社 会 L T W 实 例 . / / 7 . 注 册 几 个 环 境 相 关 b e a n 到 容 器 中 ( S p r i n g 的 环 境 对 象 , 以 及 系 统 环 境 变 量 和 系 统 配 置 文 件 ) o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . P o s t P r o c e s s o r R e g i s t r a t i o n D e l e g a t e # i n v o k e B e a n F a c t o r y P o s t P r o c e s s o r s ( o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . c o n f i g . C o n f i g u r a b l e L i s t a b l e B e a n F a c t o r y , j a v a . u t i l . L i s t ) / / 1 . 若 b e a n F a c t o r y 实 现 了 B e a n D e f i n i t i o n R e g i s t r y 接 口 ( n e w A n n o t a t i o n C o n f i g A p p l i c a t i o n C o n t e x t 就 实 现 了 ) / / 则 扫 描 所 有 实 现 了 B e a n D e f i n i t i o n R e g i s t r y P o s t P r o c e s s o r 接 口 的 b e a n , 根 据 优 先 级 分 三 类 ( 高 / 中 / 其 他 ) 依 次 执 行 / / 2 . 然 后 扫 描 所 有 实 现 了 B e a n F a c t o r y P o s t P r o c e s s o r 接 口 的 b e a n , 依 旧 是 根 据 优 先 级 分 三 类 依 次 执 行 . / / 3 . 每 次 执 行 前 都 会 根 据 O r d e r 信 息 排 序 , 再 遍 历 执 行 o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . P o s t P r o c e s s o r R e g i s t r a t i o n D e l e g a t e # r e g i s t e r B e a n P o s t P r o c e s s o r s ( o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . c o n f i g . C o n f i g u r a b l e L i s t a b l e B e a n F a c t o r y , o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . A b s t r a c t A p p l i c a t i o n C o n t e x t ) / / 1 . 扫 描 6 次 : 2 ( M e r g e d B e a n D e f i n i t i o n P o s t P r o c e s s o r / 其 他 ) x 3 ( 优 先 级 : 高 / 中 / 其 他 ) / / 将 其 加 入 到 b e a n F a c t o r y 的 b e a n P o s t P r o c e s s o r s 集 合 中 / / 2 . 再 次 加 入 A p p l i c a t i o n L i s t e n e r D e t e c t o r ( 用 于 处 理 实 现 A p p l i c a t i o n L i s t e n e r 的 b e a n 注 册 到 事 件 广 播 器 ) , 主 要 是 使 其 在 链 末 尾 , 可 以 最 后 执 行 . o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . A b s t r a c t A p p l i c a t i o n C o n t e x t # r e g i s t e r L i s t e n e r s / / 1 . 将 可 能 存 在 的 a p p l i c a t i o n L i s t e n e r s 注 册 到 事 件 广 播 器 中 ( 新 建 时 是 不 存 在 的 ) / / 2 . 扫 描 容 器 中 实 现 了 A p p l i c a t i o n L i s t e n e r 接 口 的 b e a n , 将 其 预 存 到 广 播 器 中 但 不 执 行 / / 3 . 将 之 前 p u b l i s h E v e n t ( ) 想 广 播 的 事 件 广 播 出 去 , 然 后 字 段 e a r l y A p p l i c a t i o n E v e n t s 赋 值 为 空 / / ( 因 为 p u b l i s h E v e n t ( ) 中 根 据 是 否 为 空 判 断 立 刻 执 行 或 先 存 着 ) ( 另 这 也 解 释 了 p r e p a r e R e f r e s h ( ) 中 为 何 要 赋 值 一 个 空 集 合 ) o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . A b s t r a c t A p p l i c a t i o n C o n t e x t # f i n i s h B e a n F a c t o r y I n i t i a l i z a t i o n / / 1 . 完 成 b e a n F a c t o r y 的 一 些 配 置 / / 2 . 注 册 默 认 的 表 达 式 解 析 器 ( 若 无 相 应 的 b e a n 存 在 ) / / 3 . 扫 描 容 器 中 实 现 了 L o a d T i m e W e a v e r A w a r e 接 口 的 b e a n , 并 触 发 ( g e t B e a n ) 之 前 注 册 过 的 B e a n P o s t P r o c e s s o r / / 4 . 将 单 例 的 b e a n 创 建 出 来 放 入 容 器 中 ( 未 设 置 l a z y i n i t = t r u e ) 的 b e a n o r g . s p r i n g f r a m e w o r k . c o n t e x t . s u p p o r t . A b s t r a c t A p p l i c a t i o n C o n t e x t # f i n i s h R e f r e s h / / 1 . 清 空 资 源 缓 存 / / 2 . 创 建 一 个 生 命 周 期 管 理 器 ( s t a r t , r e f r e s h , s t o p 等 ) 并 注 册 到 b e a n F a c t o r y / / 3 . 触 发 生 命 周 期 管 理 器 的 o n R e f r e s h ( ) / / 4 . 广 播 容 器 刷 新 完 成 的 事 件 / / 5 . 为 S p r i n g T o o l S u i t e 提 供 某 些 便 捷 ( 没 用 过 , 不 知 道 . . . ) 可 算 复 制 完 了 , 如 果 你 有 幸 直 接 跳 读 到 这 里 , 那 么 送 上 地 址 : 注 意 分 支 吧 另 外 上 面 方 法 前 带 个 # 的 , 复 制 到 I D E A 双 击 S h i f t 然 后 粘 贴 , 选 择 S y m b o l s 搜 索 更 准 确 呢 ! 获 取 容 器 对 象 过 程 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 # 从 g e t B e a n ( C l a s s t y p e ) 中 进 入 1 . 检 查 a p p l i c a t i o n C o n t e x t 和 b e a n F a c t o r y 的 状 态 , 若 有 异 常 则 给 出 准 确 的 错 误 . 2 . 扫 描 容 器 中 所 有 此 t y p e 的 b e a n N a m e , 遍 历 判 断 每 个 b e a n N a m e 是 否 可 用 可 用 则 判 断 可 用 的 个 数 是 否 刚 好 是 一 个 , 是 则 直 接 调 用 g e t B e a n ( ) 返 回 对 象 实 例 若 可 用 的 个 数 超 过 一 个 , 则 根 据 b e a n D e f i n i t i o n 的 i s P r i m a r y 和 对 比 配 置 的 优 先 级 是 否 为 有 最 高 的 再 返 回 最 高 的 若 都 不 行 , 则 报 错 . 3 . 接 着 看 g e t B e a n , 先 试 着 从 单 例 的 缓 存 中 获 取 , 若 存 在 则 返 回 . 4 . 若 缓 存 中 不 存 在 , 则 判 断 父 容 器 是 否 存 , 若 存 在 则 从 父 容 器 获 取 若 父 容 器 不 存 在 , 则 自 己 新 建 , 先 标 记 b e a n N a m e 到 a l r e a d y C r e a t e d 中 ( 表 示 已 经 创 建 了 防 止 重 复 创 建 ) 再 开 始 创 建 一 个 b e a n . 5 . 创 建 一 个 新 的 b e a n 实 例 , 先 处 理 b e a n D e f i n i t i o n 的 d e p e n d s O n 属 性 ( 即 若 存 在 则 先 调 用 g e t B e a n 获 取 依 赖 的 b e a n ) 6 . 若 b e a n D e f i n i t i o n 的 设 置 是 单 例 , 则 通 过 闭 包 对 创 建 对 象 前 后 进 行 一 些 异 常 处 理 和 缓 存 处 理 ( 主 要 是 彻 底 创 建 完 后 加 入 到 单 例 一 级 缓 存 , 移 除 二 级 和 三 级 缓 存 [ 循 环 依 赖 相 关 的 两 个 缓 存 ] ) . 7 . 通 过 反 射 根 据 b e a n C l a s s 创 建 一 个 对 象 实 例 , 然 后 将 其 添 加 到 s i n g l e t o n F a c t o r i e s 中 ( 解 决 依 赖 循 环 问 题 ) 8 . 调 用 p o p u l a t e B e a n ( ) 为 对 象 的 字 段 ( 属 性 ) 注 入 它 所 需 要 的 值 ( 可 能 是 @ R e s o u r c e , @ V a l u e 等 ) ; ( 此 时 可 能 会 遇 到 依 赖 循 环 问 题 , 但 解 决 这 个 问 题 的 缓 存 在 此 之 前 就 添 加 了 , 所 以 不 怕 ) 9 . 最 后 调 用 i n i t i a l i z e B e a n ( ) 完 成 b e a n 的 初 始 化 ( 调 用 b e a n 的 一 些 方 法 , 如 a f t e r P r o p e r t i e s S e t ) , 返 回 对 象 实 例 . 总 结 : 先 根 据 t y p e 找 到 b e a n N a m e , 找 到 后 根 据 b e a n N a m e 创 建 对 象 ; 创 建 对 象 前 先 检 查 缓 存 ( 单 例 ) , 再 考 虑 父 容 器 , 最 后 才 是 自 己 创 建 , 自 己 创 建 会 先 创 建 d e p e n d s O n 的 b e a n 对 象 , 然 后 才 通 过 反 射 实 例 化 出 一 个 对 象 实 例 ( 这 里 反 射 用 到 的 c l a s s 和 构 造 方 法 , 通 过 实 现 S m a r t I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r 接 口 都 可 进 行 干 预 ) , 实 例 化 后 存 到 二 级 缓 存 , 再 为 字 段 赋 值 ( 注 入 ) ; 最 后 调 用 b e a n 的 i n i t 相 关 的 接 口 ( 如 a f t e r P r o p e r t i e s S e t ) , 就 可 以 返 回 这 个 对 象 实 例 了 . 超 长 源 码 分 析 过 程 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 / / 从 这 个 方 法 进 入 @ O v e r r i d e p u b l i c T g e t B e a n ( C l a s s r e q u i r e d T y p e ) t h r o w s B e a n s E x c e p t i o n / / 然 后 其 他 所 有 涉 及 的 核 心 方 法 的 注 释 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . D e f a u l t L i s t a b l e B e a n F a c t o r y # r e s o l v e B e a n / / 调 用 r e s o l v e N a m e d B e a n , 如 存 在 b e a n 则 直 接 返 回 . ( 核 心 ) / / 若 不 存 在 则 从 父 容 器 中 寻 找 , 父 容 器 实 现 了 D e f a u l t L i s t a b l e B e a n F a c t o r y 则 调 与 同 子 容 器 相 同 的 方 法 / / 若 没 实 现 则 通 过 g e t B e a n P r o v i d e r 获 取 . o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . D e f a u l t L i s t a b l e B e a n F a c t o r y # r e s o l v e N a m e d B e a n ( o r g . s p r i n g f r a m e w o r k . c o r e . R e s o l v a b l e T y p e , j a v a . l a n g . O b j e c t [ ] , b o o l e a n ) / / 1 . 调 用 g e t B e a n N a m e s F o r T y p e 获 取 所 有 与 t y p e 相 匹 配 的 b e a n N a m e 集 合 . / / 2 . 遍 历 判 断 每 个 b e a n N a m e 是 否 可 用 / / 3 . 若 可 用 的 b e a n N a m e 只 有 一 个 , 则 调 用 g e t B e a n ( b e a n N a m e ) 获 取 对 象 实 例 并 返 回 / / 若 可 用 数 超 过 一 个 , 则 试 着 根 据 是 否 主 要 以 及 高 优 先 级 来 确 定 一 个 b e a n N a m e 实 例 , 若 能 确 定 则 返 回 , 不 能 则 报 错 . o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t B e a n F a c t o r y # d o G e t B e a n / / 1 . 获 取 完 整 的 b e a n N a m e / / 2 . 调 用 g e t S i n g l e t o n 1 ( ) 检 查 是 否 存 在 缓 存 , 这 层 检 查 可 防 止 依 赖 循 环 . / / 若 存 在 , 则 通 过 g e t O b j e c t F o r B e a n I n s t a n c e ( ) 判 断 缓 存 的 是 b e a n 还 是 F a c t o r y B e a n 并 返 回 相 应 的 对 象 实 例 . / / 3 . 若 不 存 在 , 先 试 着 从 父 容 器 获 取 ( 子 容 器 不 存 在 这 个 b e a n D e f i n i t i o n 且 父 容 器 不 为 空 ) / / 没 有 父 容 器 则 调 用 m a r k B e a n A s C r e a t e d ( ) 标 记 这 个 b e a n 已 经 创 建 了 ( 先 标 记 , 再 创 建 ) / / 获 取 b e a n D e f i n i t i o n , 判 断 其 d e p e n d s O n 属 性 是 否 存 在 , 存 在 则 先 获 取 依 赖 的 b e a n / / 调 用 g e t S i n g l e t o n 2 ( ) 处 理 单 例 缓 存 / / 4 . 而 g e t S i n g l e t o n 2 ( ) 中 的 闭 包 中 执 行 的 c r e a t e B e a n ( ) 方 法 中 则 才 是 创 建 实 例 并 调 用 B e a n P o s t P r o c e s s o r o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . D e f a u l t S i n g l e t o n B e a n R e g i s t r y # g e t S i n g l e t o n ( j a v a . l a n g . S t r i n g , b o o l e a n ) / / 1 . 判 断 是 否 存 在 于 s i n g l e t o n O b j e c t s 中 / / 2 . 若 不 存 在 则 判 断 b e a n 是 否 处 于 创 建 中 ( 未 创 建 完 成 , 如 循 环 依 赖 时 ) / / 3 . 若 处 于 创 建 中 , 则 同 步 后 判 断 是 否 存 在 于 e a r l y S i n g l e t o n O b j e c t s ( 也 就 是 s i n g l e t o n F a c t o r i e s 移 除 后 存 入 的 地 方 ) / / ( 因 为 F a c t o r y B e a n 占 用 空 间 大 , 获 取 对 象 麻 烦 且 速 度 更 慢 , 这 是 为 了 防 止 如 果 循 环 依 赖 链 条 很 长 多 次 获 取 浪 费 C P U 的 问 题 ) / / 4 . 不 存 于 e a r l y S i n g l e t o n O b j e c t s 则 代 表 第 一 次 ( 也 只 会 有 一 次 ) 取 s i n g l e t o n F a c t o r i e s / / 取 出 后 调 用 g e t O b j e c t ( ) 并 将 其 存 入 到 e a r l y S i n g l e t o n O b j e c t s , 然 后 从 s i n g l e t o n F a c t o r i e s 中 移 除 . 以 后 就 少 走 几 行 代 码 了 . o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . D e f a u l t S i n g l e t o n B e a n R e g i s t r y # g e t S i n g l e t o n ( j a v a . l a n g . S t r i n g , o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . O b j e c t F a c t o r y ) / / 1 . 先 确 保 是 第 一 次 创 建 单 例 对 象 , 防 止 重 复 创 建 / / 2 . 进 行 一 些 异 常 处 理 / / 3 . 调 用 s i n g l e t o n F a c t o r y . g e t O b j e c t ( ) 创 建 对 象 / / 4 . 创 建 对 象 结 束 添 加 单 例 缓 存 和 清 空 s i n g l e t o n F a c t o r i e s / e a r l y S i n g l e t o n O b j e c t s 缓 存 . o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y # c r e a t e B e a n ( j a v a . l a n g . S t r i n g , o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . R o o t B e a n D e f i n i t i o n , j a v a . l a n g . O b j e c t [ ] ) / / 1 . 调 用 r e s o l v e B e a n C l a s s 解 析 得 到 真 正 的 b e a n c l a s s , 若 解 析 不 为 空 且 处 于 某 些 情 况 下 , 则 复 制 一 份 b e a n D e f i n i t i o n 并 设 置 b e a n C l a s s 为 解 析 所 得 / / 2 . 执 行 B e a n P o s t P r o c e s s o r 的 p o s t P r o c e s s o r s B e f o r e I n s t a n t i a t i o n ( ) 方 法 / / 3 . 调 用 d o C r e a t e B e a n ( ) 创 建 对 象 并 返 回 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y # d o C r e a t e B e a n / / 1 . 调 用 c r e a t e B e a n I n s t a n c e ( ) 获 得 一 个 对 象 实 例 的 包 装 类 / / 2 . 同 步 锁 下 执 行 B e a n F a c t o r y P o s t P r o c e s s o r 的 p o s t P r o c e s s M e r g e d B e a n D e f i n i t i o n ( ) . / / 3 . 添 加 s i n g l e t o n F a c t o r i e s 缓 存 , 移 除 e a r l y S i n g l e t o n O b j e c t s ; 解 决 循 环 依 赖 问 题 . / / 4 . 调 用 p o p u l a t e B e a n ( ) 检 查 字 段 是 否 需 要 注 入 对 象 实 例 , 是 则 获 取 对 应 的 b e a n 注 入 . ( 可 能 引 起 循 环 依 赖 ) / / 5 . 调 用 i n i t i a l i z e B e a n ( ) 执 行 对 象 的 一 些 A w a r e 和 i n i t 方 法 和 B e a n P o s t P r o c e s s o r 的 p o s t P r o c e s s B e f o r e I n i t i a l i z a t i o n . / / 6 . 最 后 返 回 对 象 实 例 . 各 种 实 现 的 原 理 1 2 3 4 5 6 7 1 . 为 何 我 写 的 c l a s s 实 现 一 些 接 口 ( 如 A p p l i c a t i o n C o n t e x t A w a r e ) 后 并 放 入 容 器 中 , 就 可 以 获 取 到 一 些 对 象 ( 如 a p p l i c a t i o n C o n t e x t ) ? 2 . 为 何 我 写 的 c l a s s 实 现 A p p l i c a t i o n L i s t e n e r 后 并 放 入 容 器 中 , 就 能 监 听 我 想 知 道 的 事 件 ? 3 . 为 何 S p r i n g 中 遇 到 各 种 顺 序 问 题 , 只 需 要 实 现 O r d e r e d 接 口 ( 或 加 上 @ O r d e r 注 解 ) 就 能 使 其 有 序 ? 4 . S p r i n g 是 如 何 解 决 循 环 依 赖 的 ( 指 用 字 段 注 入 而 非 构 造 方 法 ) ? 5 . S p r i n g 可 以 用 注 解 替 换 X M L 配 置 文 件 了 , 是 如 何 实 现 的 呢 ( 常 用 注 解 的 实 现 原 理 ) ? 6 . S p r i n g A O P 是 如 何 实 现 的 ( 指 @ A s p e c t ) ? 7 . S p r i n g 事 务 是 如 何 实 现 的 ( 指 @ T r a n s a c t i o n ) ? 为 何 我 写 的 c l a s s 实 现 一 些 接 口 ( 如 A p p l i c a t i o n C o n t e x t A w a r e ) 后 并 放 入 容 器 中 , 就 可 以 获 取 到 一 些 对 象 ( 如 a p p l i c a t i o n C o n t e x t ) ? 1 2 3 1 ) 首 先 A b s t r a c t A p p l i c a t i o n C o n t e x t # p r e p a r e B e a n F a c t o r y 会 添 加 一 个 A p p l i c a t i o n C o n t e x t A w a r e P r o c e s s o r 2 ) 这 个 b e a n P o s t P r o c e s s o r 负 责 在 b e a n 初 始 化 之 前 注 入 c o n t e x t 对 象 . 3 ) 这 个 b e a n P o s t P r o c e s s o r 的 执 行 时 机 是 在 d o C r e a t e B e a n 中 的 p o s t P r o c e s s B e f o r e I n i t i a l i z a t i o n ( ) 为 何 我 写 的 c l a s s 实 现 A p p l i c a t i o n L i s t e n e r 后 并 放 入 容 器 中 , 就 能 监 听 我 想 知 道 的 事 件 ? 1 2 3 4 1 ) 在 A b s t r a c t A p p l i c a t i o n C o n t e x t # r e g i s t e r L i s t e n e r s ( ) 中 扫 描 容 器 内 所 有 相 关 实 现 类 加 入 到 事 件 监 听 者 集 合 中 2 ) 然 后 在 p u b l i s h E v e n t 时 , 遍 历 事 件 监 听 者 集 合 调 用 b e a n 的 方 法 即 可 。 观 察 者 模 式 ! 3 ) 另 外 也 用 了 B e a n P o s t P r o c e s s o r 去 实 现 , 叫 A p p l i c a t i o n L i s t e n e r D e t e c t o r , 加 入 时 机 同 1 , 执 行 时 机 同 1 . 4 ) 至 于 为 何 使 用 2 种 机 制 , 应 该 是 因 为 r e g i s t e r L i s t e n e r s ( ) 时 , 扫 描 只 是 当 前 的 , 后 续 可 能 容 器 内 的 b e a n 还 会 增 加 ( 我 也 猜 不 到 啥 形 式 增 加 , 反 正 简 单 写 个 类 肯 定 不 会 ) , 所 以 还 是 需 要 A p p l i c a t i o n L i s t e n e r D e t e c t o r 在 这 个 B e a n 初 始 化 时 加 入 到 监 听 者 中 去 . 为 何 S p r i n g 中 遇 到 各 种 顺 序 问 题 , 只 需 要 实 现 O r d e r e d 接 口 ( 或 加 上 @ O r d e r 注 解 ) 就 能 使 其 有 序 ? 因 为 S p r i n g 预 先 在 执 行 这 些 东 西 之 前 , 进 行 一 个 排 序 动 作 , 然 后 才 遍 历 执 行 . 包 括 A O P , B e a n F a c t o r y P o s t P r o c e s s o r , B e a n P o s t P r o c e s s o r . 1 2 1 ) 比 如 说 B e a n P o s t P r o c e s s e r , 容 器 扫 描 后 , 会 像 对 b e a n 集 合 排 序 , 再 遍 历 执 行 . 2 ) 详 细 过 程 见 P o s t P r o c e s s o r R e g i s t r a t i o n D e l e g a t e # s o r t P o s t P r o c e s s o r s ( ) S p r i n g 是 如 何 解 决 循 环 依 赖 的 ( 指 用 字 段 注 入 而 非 构 造 方 法 ) ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 ) 首 先 , 假 定 有 两 个 单 例 b e a n A 和 B , A 持 有 B , B 持 有 A , 构 成 循 环 2 ) 此 时 程 序 调 用 g e t B e a n 获 取 A , 则 在 d o C r e a t e B e a n 中 创 建 后 将 b e a n 缓 存 到 s i n g l e t o n F a c t o r i e s 中 3 ) 然 后 设 置 属 性 B , 解 析 属 性 , 需 要 获 取 B 对 象 4 ) 获 取 B , 则 执 行 d o C r e a t e B e a n 后 执 行 解 析 属 性 , 需 要 获 取 A 对 象 ( 又 一 次 ) 5 ) 获 取 A , 进 入 d o G e t B e a n 中 的 g e t S i n g l e t o n , 此 时 判 断 s i n g l e t o n F a c t o r i e s 中 有 A , 则 可 以 直 接 取 出 A 6 ) 获 得 A 后 , 即 可 完 成 B 的 属 性 赋 值 , 然 后 会 完 成 B 的 创 建 . 7 ) B 创 建 完 后 , A 就 能 获 得 B , 则 A 也 完 成 了 属 性 赋 值 , 最 后 完 成 创 建 A . 8 ) 到 此 , 返 回 即 可 . > 总 结 : 首 次 获 取 A , 创 建 A 对 象 后 缓 存 一 个 存 储 A 对 象 的 O b j e c t F a c t o r y 实 例 , 再 解 析 属 性 时 触 发 g e t B e a n ( B ) , 同 理 也 会 做 缓 存 , 然 后 也 解 析 属 性 , 触 发 g e t B e a n ( A ) , 第 二 次 获 取 A , 进 入 另 一 个 逻 辑 , 返 回 O b j e c t F a c t o r y 实 例 中 存 储 的 对 象 A , 即 可 完 成 g e t B e a n ( A ) , 然 后 完 成 g e t B e a n ( B ) , 再 完 成 外 层 的 g e t B e a n ( A ) . T I P S : 步 骤 4 中 , 会 先 判 断 e a r l y S i n g l e t o n O b j e c t s , 不 存 在 才 判 断 s i n g l e t o n F a c t o r i e s , 而 从 s i n g l e t o n F a c t o r i e s 中 取 得 对 象 后 , 则 会 将 其 从 s i n g l e t o n F a c t o r i e s 移 除 并 加 入 e a r l y S i n g l e t o n O b j e c t s 这 是 因 为 s i n g l e t o n F a c t o r i e s 缓 存 的 F a c t o r y B e a n , 若 反 复 调 用 g e t O b j e c t ( ) , 则 每 次 获 取 都 会 调 用 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y # g e t E a r l y B e a n R e f e r e n c e 方 法 , 而 此 方 法 会 执 行 S m a r t I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r 的 g e t E a r l y B e a n R e f e r e n c e ( ) , 这 会 导 致 B e a n P o s t P r o c e s s o r 重 复 执 行 , 显 然 是 不 行 的 . S p r i n g 可 以 用 注 解 替 换 X M L 配 置 文 件 了 , 是 如 何 实 现 的 呢 ( 常 用 注 解 的 实 现 原 理 ) ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 1 ) 首 先 是 指 定 包 名 或 指 定 类 名 如 指 定 包 名 则 s c a n 时 会 执 行 , 如 指 定 类 名 则 在 构 造 方 法 初 始 化 r e a d e r 时 执 行 2 ) 无 论 哪 种 , 最 终 都 会 走 一 段 代 码 A n n o t a t i o n C o n f i g U t i l s # r e g i s t e r A n n o t a t i o n C o n f i g P r o c e s s o r s ( ) 3 ) 这 段 代 码 会 添 加 一 些 B e a n F a c t o r y P o s t P r o c e s s o r 如 C o n f i g u r a t i o n C l a s s P o s t P r o c e s s o r 负 责 解 析 @ C o n f i g u r a t i o n / @ I m p o r t / @ B e a n 等 注 解 然 后 由 C o n f i g u r a t i o n C l a s s B e a n D e f i n i t i o n R e a d e r 负 责 将 信 息 转 换 成 B e a n D e f i n i t i o n 再 注 册 到 容 器 。 如 A u t o w i r e d A n n o t a t i o n B e a n P o s t P r o c e s s o r 负 责 解 析 @ A u t o w i r e d / @ V a l u e 注 解 如 C o m m o n A n n o t a t i o n B e a n P o s t P r o c e s s o r 负 责 解 析 @ R e s o u r c e 注 解 解 析 放 在 p o s t P r o c e s s P r o p e r t i e s ( ) 方 法 中 , 先 扫 描 b e a n 的 字 段 和 方 法 , 然 后 一 一 调 用 方 法 和 为 字 段 注 入 值 4 ) 之 后 , 他 会 将 扫 描 的 类 放 到 b e a n D e f i n i t i o n s 中 ( 或 指 定 的 类 注 册 进 去 ) 5 ) B e a n F a c t o r y 加 载 完 毕 后 , 回 到 A b s t r a c t A p p l i c a t i o n C o n t e x t 的 r e f r e s h 逻 辑 如 会 执 行 p o s t P r o c e s s B e a n F a c t o r y ( ) , 调 用 前 面 加 入 的 C o n f i g u r a t i o n C l a s s P o s t P r o c e s s o r 然 后 会 添 加 更 多 的 类 到 容 器 中 . 注 意 事 项 : @ C o n f i g u r a t i o n 和 @ C o m p o n e n t 的 区 别 ? 观 察 发 现 , 即 使 使 用 @ C o m p o n e n t 其 下 带 @ B e a n 的 方 法 依 然 可 以 注 入 到 容 器 中 。 所 以 似 乎 两 者 没 有 区 别 ? 仔 细 查 看 源 码 和 资 料 后 , 发 现 p o s t P r o c e s s B e a n F a c t o r y ( ) 方 法 在 p r o c e s s C o n f i g B e a n D e f i n i t i o n s ( ) 后 还 会 调 用 e n h a n c e C o n f i g u r a t i o n C l a s s e s ( ) 而 在 这 个 方 法 中 , 对 前 面 解 析 了 c l a s s 是 C O N F I G U R A T I O N _ C L A S S _ F U L L ( 即 代 表 @ C o n f i g u r a t i o n ) 的 类 会 生 成 一 个 c g l i b 的 代 理 , 这 样 获 取 @ B e a n 注 解 的 方 法 的 b e a n 时 , 不 会 每 次 调 用 方 法 n e w 一 个 , 而 是 有 缓 存 . 总 结 : 就 是 利 用 B e a n F a c t o r y P o s t P r o c e s s o r 可 获 取 B e a n D e f i n i t i o n R e g i s t r y 对 象 , 然 后 扫 描 容 器 内 带 有 注 解 的 b e a n , 解 析 这 些 注 解 得 到 一 些 B e a n D e f i n i t i o n , 再 通 过 获 得 的 B e a n D e f i n i t i o n R e g i s t r y 对 象 注 册 到 B e a n F a c t o r y 中 . S p r i n g A O P 是 如 何 实 现 的 ( 指 @ A s p e c t ) ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 ) 使 用 @ E n a b l e A s p e c t J A u t o P r o x y 2 ) @ E n a b l e A s p e c t J A u t o P r o x y 中 使 用 了 @ I m p o r t ( A s p e c t J A u t o P r o x y R e g i s t r a r . c l a s s ) 3 ) C o n f i g u r a t i o n C l a s s P o s t P r o c e s s o r 会 解 析 @ I m p o r t , 进 入 r e g i s t e r B e a n D e f i n i t i o n s ( ) 中 4 ) r e g i s t e r B e a n D e f i n i t i o n s ( ) 中 添 加 了 A n n o t a t i o n A w a r e A s p e c t J A u t o P r o x y C r e a t o r 到 容 器 中 5 ) A n n o t a t i o n A w a r e A s p e c t J A u t o P r o x y C r e a t o r 本 质 上 时 一 个 B e a n P o s t P r o c e s s o r 6 ) 因 此 在 c r e a t e B e a n 时 , 会 被 自 动 调 用 . 其 中 p o s t P r o c e s s A f t e r I n i t i a l i z a t i o n ( ) 负 责 创 建 代 理 对 象 7 ) 而 g e t A d v i c e s A n d A d v i s o r s F o r B e a n ( ) 则 负 责 查 找 对 应 的 增 强 . 然 后 会 调 用 子 类 的 f i n d C a n d i d a t e A d v i s o r s 8 ) 如 A n n o t a t i o n A w a r e A s p e c t J A u t o P r o x y C r e a t o r # f i n d C a n d i d a t e A d v i s o r s ( ) 负 责 注 解 编 写 增 强 @ B e f o r e / @ A f t e r 等 9 ) 简 单 说 下 逻 辑 , 就 是 查 找 容 器 所 有 类 , 判 断 这 个 类 有 没 有 @ A s p e c t 注 解 , 然 后 先 找 出 所 有 P o i n t c u t 再 遍 历 所 有 方 法 , 找 出 方 法 上 带 有 @ B e f o r e 等 注 解 且 有 关 联 的 P o i n t c u t 的 方 法 , 然 后 使 用 这 个 方 法 和 关 联 的 P o i n t c u t 来 n e w 一 个 A d v i s o r , 加 入 到 A d v i s o r 集 合 中 , 遍 历 结 束 后 返 回 即 可 . 1 0 ) 查 找 到 所 有 的 增 强 后 , 再 比 较 P o i n t c u t 表 达 式 是 否 匹 配 当 前 的 b e a n , 如 可 以 则 加 入 . 1 1 ) 根 据 找 到 的 A d v i s o r 集 合 , 创 建 一 个 带 配 置 ( a d v i s o r 集 合 等 ) 的 代 理 对 象 , 代 理 对 象 执 行 方 法 前 1 2 ) 会 先 根 据 配 置 中 的 a d v i s o r 集 合 生 成 一 个 执 行 链 , 然 后 在 拦 截 代 理 方 法 处 调 用 . 执 行 链 会 负 责 执 行 通 知 . 1 3 ) 不 同 的 通 知 由 不 同 的 适 配 器 执 行 . 总 结 就 是 通 过 @ E n a b l e A s p e c t J A u t o P r o x y 的 @ I m p o r t , 使 得 程 序 最 终 会 执 行 A n n o t a t i o n A w a r e A s p e c t J A u t o P r o x y C r e a t o r 的 p o s t P r o c e s s A f t e r I n i t i a l i z a t i o n ( 对 象 初 始 化 后 调 用 ) 方 法 , 这 个 方 法 在 B e a n F a c t o r y 创 建 完 对 象 后 触 发 , 此 时 便 可 通 过 C G l i b 等 动 态 代 理 技 术 为 创 建 的 b e a n 对 象 创 建 一 个 代 理 对 象 , 然 后 这 个 代 理 对 象 会 根 据 P o i n t c u t 找 到 关 联 的 A d v i s o r , 并 在 合 适 的 时 机 执 行 对 应 的 A d v i s o r , 如 @ B e f o r e 产 生 的 A d v i s o r 会 在 执 行 了 b e a n 对 象 的 指 定 方 法 ( 看 P o i n t c u t 配 置 ) 后 执 行 . S p r i n g 事 务 是 如 何 实 现 的 ( 指 @ T r a n s a c t i o n ) ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 0 ) 事 务 是 由 A O P 实 现 的 , 所 以 需 要 找 到 对 应 的 P o i n t c u t 和 A d v i s o r 1 ) 打 开 了 @ E n a b l e T r a n s a c t i o n M a n a g e m e n t 注 解 2 ) 然 后 @ I m p o r t 了 T r a n s a c t i o n M a n a g e m e n t C o n f i g u r a t i o n S e l e c t o r 3 ) 之 后 导 入 了 P r o x y T r a n s a c t i o n M a n a g e m e n t C o n f i g u r a t i o n 到 容 器 中 4 ) P r o x y T r a n s a c t i o n M a n a g e m e n t C o n f i g u r a t i o n 带 有 @ C o n f i g u r a t i o n 5 ) @ B e a n 注 入 了 一 个 通 用 的 A d v i s o r : B e a n F a c t o r y T r a n s a c t i o n A t t r i b u t e S o u r c e A d v i s o r 6 ) 这 个 A d v i s o r 的 P o i n t c u t 是 由 T r a n s a c t i o n A t t r i b u t e S o u r c e P o i n t c u t 实 现 的 实 现 逻 辑 是 T r a n s a c t i o n A t t r i b u t e S o u r c e P o i n t c u t 的 m a t c h e s ( ) 这 个 方 法 调 用 了 g e t T r a n s a c t i o n A t t r i b u t e S o u r c e ( ) 获 取 A n n o t a t i o n T r a n s a c t i o n A t t r i b u t e S o u r c e 然 后 通 过 g e t T r a n s a c t i o n A t t r i b u t e ( ) 调 用 了 f i n d T r a n s a c t i o n A t t r i b u t e ( ) 最 终 使 用 S p r i n g T r a n s a c t i o n A n n o t a t i o n P a r s e r 类 判 断 方 法 是 否 有 @ T r a n s a c t i o n a l 注 解 并 解 析 注 解 信 息 然 后 返 回 . 另 外 这 个 方 法 还 可 以 获 取 @ T r a n s a c t i o n a l 注 解 的 信 息 , 而 这 里 只 用 于 判 断 是 否 需 要 拦 截 这 个 方 法 . 7 ) T r a n s a c t i o n I n t e r c e p t o r 是 一 个 A d v i s o r 也 可 以 通 过 A n n o t a t i o n T r a n s a c t i o n A t t r i b u t e S o u r c e 获 取 @ T r a n s a c t i o n a l 注 解 上 的 信 息 然 后 在 i n v o k e 中 , 拦 截 方 法 , 打 开 事 务 , 在 执 行 完 方 法 后 , 提 交 事 务 , 报 错 时 回 滚 事 务 这 个 A d v i s o r 不 同 于 传 统 的 前 置 / 后 置 , 而 是 更 具 体 的 M e t h o d I n t e r c e p t o r ( 动 态 代 理 直 接 相 关 ) . 总 结 : 就 是 基 于 A O P 实 现 的 , 只 需 找 到 对 应 的 P o i n t c u t 和 A d v i s o r 即 可 . P o i n t c u t 就 是 根 据 @ T r a n s a c t i o n 注 解 判 断 方 法 是 否 需 要 代 理 , 这 个 很 简 单 ; 比 较 有 意 思 的 是 A d v i s o r 不 是 我 们 写 A O P 那 种 @ B e f o r e , @ A r o u n d 之 类 的 , 而 是 更 接 近 动 态 代 理 原 始 的 语 法 的 M e t h o d I n t e r c e p t o r 即 T r a n s a c t i o n I n t e r c e p t o r . B e a n F a c t o r y P o s t P r o c e s s o r 相 关 类 分 析 B e a n F a c t o r y P o s t P r o c e s s o r 生 效 原 理 生 效 原 理 就 是 , A p p l i c a t i o n C o n t e x t 的 r e f r e s h 方 法 中 会 扫 描 出 容 器 中 实 现 了 B e a n F a c t o r y P o s t P r o c e s s o r 接 口 的 b e a n , 将 其 排 序 后 执 行 相 应 的 接 口 , 这 样 我 们 写 的 类 实 现 的 相 应 的 接 口 的 方 法 就 被 执 行 了 . 1 2 3 常 用 的 B e a n F a c t o r y P o s t P r o c e s s o r # C o n f i g u r a t i o n C l a s s P o s t P r o c e s s o r 这 个 类 作 用 就 是 解 析 @ C o n f i g u r a t i o n / @ C o m p o n e n t / @ I m p o r t / @ I m p o r t S o u r c e / @ C o m p o n e n t S c a n 等 基 础 注 解 . 是 注 解 开 发 的 基 石 , 更 是 S p r i n g B o o t 的 基 石 . B e a n P o s t P r o c e s s o r 相 关 类 分 析 B e a n P o s t P r o c e s s o r 生 效 原 理 在 r e f r e s h ( ) 中 会 扫 描 容 器 中 所 有 实 现 了 B e a n P o s t P r o c e s s o r 接 口 的 类 , 添 加 到 B e a n F a c t o r y 的 b e a n P o s t P r o c e s s o r s 字 段 中 ( 是 个 L i s t [ C o p y O n W r i t e A r r a y L i s t 自 定 义 版 , 自 定 义 加 入 了 清 空 缓 存 的 逻 辑 ] ) , 然 后 在 B e a n F a c t o r y 创 建 对 象 时 c r e a t e B e a n ( ) 在 适 当 的 时 机 调 用 对 应 的 方 法 . 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 有 哪 几 种 B e a n P o s t P r o c e s s o r ( 默 认 的 + 扩 展 ) 1 . I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r p o s t P r o c e s s A f t e r I n s t a n t i a t i o n : 对 象 实 例 化 后 调 用 p o s t P r o c e s s B e f o r e I n s t a n t i a t i o n : 对 象 实 例 化 前 调 用 p o s t P r o c e s s P r o p e r t i e s : 设 置 属 性 值 前 p o s t P r o c e s s P r o p e r t y V a l u e s : 设 置 属 性 值 前 , 若 上 个 方 法 不 处 理 ( 返 回 n u l l ) 才 会 触 发 2 . S m a r t I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r p r e d i c t B e a n T y p e : 获 取 一 个 b e a n 的 c l a s s 类 型 前 调 用 g e t E a r l y B e a n R e f e r e n c e : 获 取 一 个 二 级 缓 存 对 象 ( s i n g l e t o n F a c t o r i e s 的 g e t O b j e c t ) 时 调 用 d e t e r m i n e C a n d i d a t e C o n s t r u c t o r s : 决 定 一 个 b e a n 实 例 化 的 构 造 参 数 是 什 么 时 调 用 3 . D e s t r u c t i o n A w a r e B e a n P o s t P r o c e s s o r p o s t P r o c e s s B e f o r e D e s t r u c t i o n : 对 象 销 毁 前 调 用 r e q u i r e s D e s t r u c t i o n : 判 断 这 个 类 针 对 某 个 b e a n 是 否 执 行 p o s t P r o c e s s B e f o r e D e s t r u c t i o n ( ) 4 . M e r g e d B e a n D e f i n i t i o n P o s t P r o c e s s o r p o s t P r o c e s s M e r g e d B e a n D e f i n i t i o n : 在 创 建 对 象 前 调 用 , 可 对 B e a n D e f i n i t i o n 做 修 改 r e s e t B e a n D e f i n i t i o n : 在 重 置 B e a n D e f i n i t i o n 时 调 用 , 用 于 清 空 P o s t P r o c e s s o r 对 应 的 缓 存 5 . B e a n P o s t P r o c e s s o r ( 基 础 ) p o s t P r o c e s s B e f o r e I n i t i a l i z a t i o n : 创 建 对 象 后 ( 也 设 置 好 了 字 段 ) , 在 调 用 i n i t 之 前 调 用 p o s t P r o c e s s A f t e r I n i t i a l i z a t i o n : 在 创 建 对 象 时 , 调 用 了 i n i t 之 后 调 用 总 结 : 0 . 对 B e a n D e f i n i t i o n 做 干 预 1 . 对 象 实 例 化 过 程 中 ( 对 c l a s s / 构 造 参 数 进 行 干 预 ) 2 . 对 象 实 例 化 前 后 3 . 对 象 设 置 属 性 前 , 对 属 性 做 干 预 4 . 对 象 初 始 化 ( i n i t ) 前 后 5 . 对 象 销 毁 前 调 用 时 机 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 / / 1 . 1 : I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r 的 p o s t P r o c e s s A f t e r I n s t a n t i a t i o n ( ) / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . p o p u l a t e B e a n 第 一 段 / / 1 . 2 : I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r 的 p o s t P r o c e s s P r o p e r t i e s ( ) / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . p o p u l a t e B e a n 第 二 段 / / 1 . 3 : I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r 的 p o s t P r o c e s s P r o p e r t y V a l u e s / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . p o p u l a t e B e a n 第 三 段 / / 1 . 4 : I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r 的 p o s t P r o c e s s B e f o r e I n s t a n t i a t i o n ( ) / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . a p p l y B e a n P o s t P r o c e s s o r s B e f o r e I n s t a n t i a t i o n 中 / / 2 . 1 : S m a r t I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r 的 p r e d i c t B e a n T y p e ( ) / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . p r e d i c t B e a n T y p e 中 / / 2 . 2 : S m a r t I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r 的 g e t E a r l y B e a n R e f e r e n c e ( ) / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . g e t E a r l y B e a n R e f e r e n c e 中 / / 2 . 3 : S m a r t I n s t a n t i a t i o n A w a r e B e a n P o s t P r o c e s s o r 的 d e t e r m i n e C a n d i d a t e C o n s t r u c t o r s ( ) / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . d e t e r m i n e C o n s t r u c t o r s F r o m B e a n P o s t P r o c e s s o r s 中 / / 3 . 1 : M e r g e d B e a n D e f i n i t i o n P o s t P r o c e s s o r 的 p o s t P r o c e s s M e r g e d B e a n D e f i n i t i o n ( ) / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . A b s t r a c t A u t o w i r e C a p a b l e B e a n F a c t o r y . a p p l y M e r g e d B e a n D e f i n i t i o n P o s t P r o c e s s o r s 中 / / 3 . 2 : M e r g e d B e a n D e f i n i t i o n P o s t P r o c e s s o r 的 r e s e t B e a n D e f i n i t i o n ( ) / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . D e f a u l t L i s t a b l e B e a n F a c t o r y . r e s e t B e a n D e f i n i t i o n 中 / / 4 . 1 : D e s t r u c t i o n A w a r e B e a n P o s t P r o c e s s o r 的 p o s t P r o c e s s B e f o r e D e s t r u c t i o n ( ) / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . D i s p o s a b l e B e a n A d a p t e r . d e s t r o y 中 / / 4 . 2 : D e s t r u c t i o n A w a r e B e a n P o s t P r o c e s s o r 的 r e q u i r e s D e s t r u c t i o n ( ) / / 在 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . D i s p o s a b l e B e a n A d a p t e r . f i l t e r P o s t P r o c e s s o r s 和 o r g . s p r i n g f r a m e w o r k . b e a n s . f a c t o r y . s u p p o r t . D i s p o s a b l e B e a n A d a p t e r . h a s A p p l i c a b l e P r o c e s s o r s 中 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 😁 1 2 3 4 5 6 7 # 有 哪 些 常 用 的 B e a n P o s t P r o c e s s o r 1 . A s y n c A n n o t a t i o n B e a n P o s t P r o c e s s o r : 用 于 在 将 @ A s y n c 相 应 的 A d v i s o r 加 入 到 对 象 的 代 理 中 2 . S c h e d u l e d A n n o t a t i o n B e a n P o s t P r o c e s s o r : 用 于 处 理 @ S c h e d u l e d 注 解 , 将 b e a n 生 产 代 理 类 3 . A n n o t a t i o n A w a r e A s p e c t J A u t o P r o x y C r e a t o r : A O P 实 现 核 心 类 4 . A u t o w i r e d A n n o t a t i o n B e a n P o s t P r o c e s s o r : 用 于 处 理 @ A u t o w i r e d 注 解 5 . A p p l i c a t i o n L i s t e n e r D e t e c t o r : 用 于 处 理 实 现 A p p l i c a t i o n L i s t e n e r 接 口 的 b e a n 对 象 , 将 其 添 加 到 事 件 广 播 器 的 监 听 者 集 合 中 . . . . 一 顿 乱 写 置 顶 | 发 表 于 2 0 2 0 0 5 2 0 更 新 于 2 0 2 1 0 3 2 8 分 类 于 i n t e r v i e w , j a v a D i s q u s : 一 句 话 说 一 下 你 重 构 代 码 都 做 了 什 么 ? 首 先 是 两 层 改 成 三 层 , 把 c o n t r o l l e r 的 代 码 尽 量 迁 移 到 s e r v i c e 层 . 然 后 将 请 求 风 格 和 响 应 数 据 结 构 统 一 . 还 有 就 是 处 理 全 局 异 常 , 最 后 对 某 些 重 复 代 码 封 装 成 工 具 类 . 另 外 还 会 根 据 实 际 业 务 场 景 使 用 一 些 设 计 模 式 , 提 高 代 码 可 扩 展 性 , 降 低 代 码 之 间 的 耦 合 性 . 什 么 是 J V M ? J V M 就 是 由 编 译 器 , 类 加 载 器 , 执 行 引 擎 , 运 行 时 数 据 区 组 成 . 其 中 数 据 区 包 含 堆 , 栈 , 本 地 方 法 栈 , 方 法 区 和 程 序 计 数 器 ( P C 寄 存 器 ) , 其 中 栈 是 由 局 部 变 量 表 , 操 作 数 栈 , 动 态 链 接 , 返 回 地 址 组 成 的 . 你 是 怎 么 对 j v m 垃 圾 回 收 进 行 优 化 的 ? 根 据 服 务 器 的 配 置 , 调 整 青 年 代 和 老 年 代 的 内 存 大 小 及 比 例 , 在 回 收 频 率 和 回 收 速 度 上 做 取 舍 , 使 用 G 1 垃 圾 回 收 期 控 制 S T W 停 顿 时 间 , 提 高 吞 吐 量 . 说 说 M y S Q L 优 化 首 先 是 S Q L 查 询 优 化 , 通 过 对 联 表 字 段 , 查 询 条 件 , 分 组 字 段 , 排 序 字 段 进 行 综 合 分 析 , 根 据 最 左 原 则 建 立 一 个 或 多 个 复 合 索 引 , 然 后 使 用 e x p l a i n 分 析 S Q L 执 行 计 划 , 判 断 索 引 使 用 情 况 , 根 据 分 析 结 果 进 一 步 改 进 索 引 . 然 后 是 对 于 数 据 量 大 的 表 , 考 虑 垂 直 或 水 平 分 表 , 读 多 写 少 的 情 况 , 可 以 一 主 多 从 集 群 . 另 外 对 于 一 些 统 计 类 的 查 询 , 可 以 用 定 时 任 务 将 统 计 结 果 存 储 起 来 , 而 非 实 时 查 询 . 你 用 R e d i s 做 了 什 么 ? 将 高 访 问 的 首 页 商 品 列 表 缓 存 到 r e d i s 中 , 避 免 数 据 库 瓶 颈 , 提 高 响 应 速 度 . 商 品 同 步 问 题 : 定 时 任 务 刷 新 . 或 修 改 商 品 时 更 新 , 缓 存 设 置 失 效 时 间 , 失 效 后 自 动 读 取 数 据 库 . 将 购 物 车 数 据 存 放 到 r e d i s , 提 高 购 物 车 交 互 体 验 ( 加 快 响 应 速 度 ) . 你 使 用 消 息 队 列 做 了 什 么 ? 解 耦 : 如 下 单 系 统 调 用 库 存 系 统 减 库 存 , 若 调 用 时 库 存 系 统 挂 了 或 出 错 了 , 下 单 系 统 还 需 要 做 重 试 处 理 , 异 常 处 理 , 此 时 可 将 减 库 存 请 求 放 到 消 息 队 列 中 , 库 存 系 统 读 取 消 息 进 行 处 理 , 若 出 错 则 放 回 消 息 队 列 重 试 . 这 样 即 使 代 码 b u g 导 致 一 直 不 成 功 也 可 在 升 级 后 自 动 重 试 , 无 需 人 工 干 预 . 另 微 信 支 付 回 调 也 可 如 此 处 理 . 削 峰 : 如 秒 杀 瞬 间 请 求 过 高 , 可 将 请 求 放 到 消 息 队 列 中 , 另 一 端 缓 慢 消 费 , 可 防 止 系 统 卡 住 . 异 步 : 比 如 下 单 后 发 送 下 单 通 知 , 有 短 信 通 知 , 微 信 公 众 号 通 知 等 , 一 个 一 个 发 送 会 导 致 下 单 这 个 请 求 响 应 很 慢 , 因 此 可 以 将 几 个 通 知 做 成 一 个 消 息 , 放 到 消 息 队 列 , 由 另 一 处 代 码 异 步 执 行 . 你 使 用 线 程 池 做 了 什 么 ? 将 线 程 池 封 装 到 一 个 工 具 类 中 , 工 具 类 再 做 成 单 例 模 式 . 这 样 使 用 到 多 线 程 的 地 方 都 可 以 使 用 同 一 个 公 共 线 程 池 , 减 少 线 程 对 象 创 建 销 毁 . 提 高 线 程 的 利 用 率 . 一 些 地 方 异 步 操 作 , 拦 截 器 添 加 请 求 日 志 时 异 步 添 加 . 你 在 代 码 中 使 用 了 哪 些 设 计 模 式 ? 单 例 模 式 , 静 态 工 厂 模 式 , 模 板 方 法 , 观 察 者 , 装 饰 者 , 策 略 模 式 , 状 态 模 式 , 职 责 链 模 式 . 观 察 者 : 监 听 商 品 信 息 更 新 , 根 据 佣 金 变 化 幅 度 决 定 是 否 删 除 , 根 据 佣 金 变 化 和 价 格 变 化 幅 度 决 定 是 否 通 知 用 户 收 藏 商 品 变 化 . 策 略 模 式 : 订 单 不 同 类 型 , 对 应 的 商 品 源 不 同 , 查 询 数 据 方 式 不 同 , 因 此 使 用 策 略 模 式 , 便 于 新 增 类 型 的 扩 展 . 状 态 模 式 : 红 包 状 态 的 变 化 , 可 以 做 成 状 态 模 式 , 使 得 红 包 新 增 状 态 时 扩 展 更 简 单 . 架 构 重 构 1 2 3 4 5 6 重 复 代 码 重 构 , 抽 象 出 工 具 类 , 返 回 值 / 自 定 义 异 常 整 理 重 构 , 统 一 请 求 风 格 使 用 状 态 模 式 / 策 略 模 式 优 化 i f / e l s e 使 用 工 厂 模 式 统 一 管 理 需 要 的 实 例 对 象 , 如 工 具 类 , 邮 件 服 务 等 封 装 通 用 C R U D 接 口 及 实 现 , 减 少 D a o 层 代 码 模 块 的 拆 分 , 数 据 库 分 库 分 表 , 微 服 务 拆 分 集 群 M y S Q L 集 群 M y S Q L 默 认 支 持 主 从 架 构 集 群 , 可 配 合 m y c a t 实 现 读 写 分 离 . R e d i s 集 群 R e d i s C l u s t e r , C o d i s T o m c a t 集 群 t o m c a t 集 群 一 般 需 要 考 虑 s e s s i o n 共 享 , 可 通 过 r e d i s 实 现 s e s s i o n 共 享 . 分 布 式 S p r i n g C l o u d S p r i n g C l o u d 是 一 套 分 布 式 开 发 的 解 决 方 案 , 集 合 了 分 布 式 调 用 , 链 路 追 踪 , 降 级 处 理 , 服 务 注 册 发 现 . D u b b o D u b b o 是 一 个 分 布 式 R P C 调 用 框 架 , 底 层 使 用 n e t t y 框 架 . 运 维 D o c k e r d o c k e r 是 一 个 容 器 , 提 供 了 标 准 化 的 接 口 , 可 用 于 快 速 构 建 部 署 环 境 , 简 化 部 署 流 程 d o c k e r c o m p o s e d o c k e r c o m p o s e 使 用 y m l 文 件 描 述 容 器 间 的 关 系 以 及 容 器 的 配 置 , 可 用 于 快 速 构 建 复 杂 的 运 行 环 境 . K 8 s K 8 s 是 一 个 根 据 容 器 快 速 搭 建 和 管 理 集 群 的 工 具 . J V M J V M 内 存 模 型 每 个 线 程 有 自 己 的 内 存 区 域 , 多 线 程 之 间 通 信 主 要 通 过 共 享 内 存 来 实 现 . 有 序 性 : 在 C P U 执 行 指 令 时 , 可 能 会 对 非 h a p p e n s b e f o r e 指 令 进 行 重 排 , 优 化 执 行 效 率 . 在 单 线 程 情 况 , 往 往 不 会 产 生 问 题 , 但 涉 及 多 线 程 时 , 可 能 导 致 b u g . 可 见 性 : 一 个 线 程 修 改 了 一 个 共 享 变 量 , 另 一 个 线 程 不 会 知 道 这 个 改 变 , 这 就 是 不 可 见 , 要 确 保 可 见 性 , 一 般 使 用 v o l a t i l e 关 键 词 , 当 然 , 加 锁 也 可 以 . 原 子 性 : 即 对 于 某 代 码 , 实 际 执 行 时 会 分 为 好 几 个 原 子 指 令 , 确 保 原 子 性 必 须 加 锁 ( 如 s y n c h r o n i z e d ) 处 理 1 2 3 4 5 h a p p e n s b e f o r e : 读 后 写 写 后 写 锁 后 解 锁 可 传 递 性 多 线 程 线 程 是 一 个 进 程 中 的 不 同 执 行 路 径 , 一 个 进 程 至 少 有 一 个 主 线 程 . 进 程 是 一 个 程 序 的 抽 象 , 一 个 程 序 运 行 后 一 般 为 一 个 进 程 . 线 程 状 态 : 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 . N e w ( 新 建 ) 2 . R u n n a b l e ( 就 绪 ) 3 . R u n n i n g ( 运 行 中 ) 4 . B l o c k e d ( 阻 塞 ) 5 . W A I T I N G ( 等 待 ) 6 . T I M E D _ W A I T I N G ( 超 时 等 待 ) 7 . D e a d ( 死 亡 ) [ t : t h r e a d 对 象 , o b j : 同 步 块 中 的 对 象 ] N e w : n e w T h r e a d ( ) R u n n a b l e : t . s t a r t ( ) , t . y i e l d ( ) R u n n i n g : a f t e r t . s t a r t ( ) a n d c p u r u n i t B l o c k e d : w h e n e n t e r s y n c h r o n i z e d b l o c k W A I T I N G : o b j . w a i t ( ) , t . j o i n ( ) , L o c k S u p p o r t . p a r k ( ) T I M E D _ W A I T I N G : T h r e a d . s l e e p ( x ) , o b j . w a i t ( x ) , t . j o i n ( x ) D e a d : w h e n t . r u n ( ) i s o v e r J V M 对 象 结 构 1 2 3 4 5 6 对 象 头 : M a r k W o r d ( h a s h , 锁 状 态 , 分 代 年 龄 ) 类 型 指 针 [ 数 组 长 度 ] 实 例 数 据 对 齐 垃 圾 回 收 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 标 记 算 法 : 1 . 引 用 计 数 法 2 . 可 达 性 分 析 算 法 ( 根 搜 索 ) ( 根 对 象 : 栈 中 的 对 象 , 静 态 属 性 引 用 对 象 , 常 量 引 用 对 象 ) 回 收 算 法 : 1 . 标 记 清 除 算 法 2 . 标 记 整 理 算 法 3 . 标 记 复 制 算 法 4 . 分 代 算 法 ( E d e n 区 ( 复 制 算 法 ) S u r v i v o r 区 ( 缓 存 , 复 制 算 法 ) O l d 区 ( 标 记 整 理 ) 回 收 器 : ( 前 3 个 Y o u n g G C 使 用 , 后 面 的 F u l l G C 使 用 ) 1 . S e r i a l ( 串 行 , 复 制 算 法 ) 2 . P a r N e w ( 多 线 程 , 复 制 算 法 ) 3 . P a r a l l e l S c a v e n g e ( 多 线 程 , 改 进 版 , 可 控 制 吞 吐 量 ) 4 . S e r i a l O l d ( 单 线 程 , 标 记 整 理 ) 5 . P a r a l l e l O l d ( 多 线 程 , 控 制 吞 吐 量 , 标 记 整 理 算 法 ) 6 . C M S ( 多 线 程 , 低 停 顿 , 标 记 清 除 算 法 ) : 初 始 ( S T W ) 并 发 重 新 ( S T W ) 清 除 7 . G 1 ( 多 线 程 , C M S 升 级 版 , 标 记 整 理 算 法 ) : 初 始 ( S T W ) 并 发 最 终 ( S T W ) 筛 选 清 除 ( 可 控 制 停 顿 时 间 ) M y S Q L S Q L 优 化 索 引 原 理 M y S Q L 索 引 一 般 选 择 B + 树 做 为 数 据 结 构 存 储 . B + 树 的 优 点 是 , 对 文 件 I O 的 访 问 次 数 控 制 在 3 次 , 保 证 速 度 的 同 时 , 能 存 储 千 万 行 数 据 . 索 引 1 2 3 1 . 对 常 用 列 添 加 索 引 , 视 具 体 情 况 选 择 单 一 索 引 或 复 合 索 引 ( 一 般 为 复 合 ) 2 . 通 过 E x p l a i n 语 句 分 析 执 行 计 划 , 将 t y p e 提 升 到 至 少 i n d e x 级 别 . 3 . 通 过 E x p l a i n 语 句 分 析 执 行 计 划 , 将 e x t r a 中 U s i n g f i l e s o r t 消 除 ( 排 序 列 加 索 引 ) , U s i n g j o i n b u f f e r 消 除 ( 通 过 给 关 联 表 的 关 联 列 加 索 引 ) , U s i n g t e m p o r a r y ( 一 般 通 过 分 组 列 加 索 引 ) , U s i n g w h e r e ( 根 据 最 左 原 则 对 条 件 列 加 复 合 索 引 ) 事 务 1 2 3 4 5 A C I D : A : 原 子 性 , 多 个 操 作 要 么 都 做 , 要 么 都 不 做 C : 一 致 性 , 数 据 库 文 件 的 状 态 必 须 从 一 个 一 致 性 状 态 到 另 一 个 一 致 性 状 态 . I : 隔 离 性 , 事 物 之 间 相 互 隔 离 , 互 不 影 响 . D : 持 续 性 , 一 个 事 务 一 但 提 交 , 则 对 数 据 库 的 改 变 是 永 久 的 . 数 据 库 隔 离 级 别 1 2 3 4 1 . 读 未 提 交 : 可 读 取 其 他 未 提 交 事 务 的 执 行 结 果 ( 如 更 新 了 某 个 字 段 ) , 可 能 会 造 成 读 取 错 误 的 数 据 ( 未 提 交 的 事 务 回 滚 了 ) , 造 成 脏 读 . 2 . 读 已 提 交 : 可 读 取 其 他 已 提 交 事 务 的 执 行 结 果 , 2 次 读 取 数 据 还 是 可 能 不 一 致 ( 其 他 事 务 又 提 交 了 ) , 造 成 不 可 重 复 读 . 3 . 可 重 复 读 : 确 保 同 一 事 务 内 多 次 读 取 数 据 时 , 会 看 到 相 同 的 数 据 . 但 可 能 造 成 幻 读 , 如 批 量 修 改 登 录 密 码 后 , 另 一 个 事 务 新 增 了 一 条 记 录 , 导 致 新 纪 录 未 修 改 . 4 . 串 行 化 : 事 务 串 行 化 执 行 , 效 率 低 . M y S Q L 默 认 隔 离 级 别 可 重 读 读 数 据 库 锁 锁 原 理 1 2 行 锁 : 分 为 排 它 锁 ( X ) 和 共 享 锁 ( S ) . 即 写 锁 和 读 锁 . 表 锁 : 分 为 元 数 据 锁 ( M D L ) 和 表 锁 . 锁 触 发 方 式 1 2 行 锁 : 隐 式 ( 条 件 带 有 索 引 则 锁 对 应 列 , 不 带 索 引 则 锁 全 部 行 , R R 总 会 带 有 G A P 锁 , R C 不 会 ) , 显 式 ( 使 用 f o r u p d a t e , l o c k i n s h a r e m o d e ) 表 锁 : 隐 式 ( 对 整 个 表 不 带 条 件 进 行 增 删 改 , 或 任 何 D D L 操 作 ) 显 示 ( 使 用 f o r u p d a t e , l o c k i n s h a r e m o d e ) 源 码 和 框 架 R e e n t r a n t L o c k 加 锁 流 程 l o c k ( ) 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 1 ) a c q u i r e ( ) : 尝 试 获 取 一 个 许 可 证 , 获 取 成 功 则 直 接 返 回 ( l o c k 结 束 ) , 获 取 失 败 则 需 要 排 队 2 ) t r y A c q u i r e ( ) : 判 断 当 前 许 可 证 数 量 ( s t a t e ) , 若 为 0 则 尝 试 获 取 分 公 平 和 非 公 平 , 公 平 锁 会 判 断 h a s Q u e u e d P r e d e c e s s o r s , 非 公 平 则 直 接 抢 c o m p a r e A n d S e t S t a t e 若 不 为 0 , 则 判 断 持 有 锁 的 人 是 否 为 我 本 身 , 是 则 增 加 当 前 许 可 证 数 量 , 返 回 t r u e 获 取 成 功 不 是 则 返 回 f a l s e , 获 取 失 败 ( 将 排 队 ) . 3 ) a d d W a i t e r ( ) : A Q S 队 列 尾 部 添 加 一 个 N o d e ( w a i t e r = X [ 独 占 锁 ] ) , 若 t a i l 不 存 在 , 则 先 初 始 化 一 个 空 h e a d [ 空 指 不 代 表 任 何 线 程 ] 后 再 加 入 队 列 4 ) a c q u i r e Q u e u e d : 进 入 队 列 的 节 点 , 尝 试 获 取 许 可 证 , 失 败 则 p a r k ( ) 先 判 断 n o d e 的 上 一 个 节 点 是 否 为 h e a d 节 点 , 若 是 , 则 要 尝 试 获 取 一 次 许 可 证 ( 因 为 这 说 明 上 一 个 线 程 已 经 在 执 行 过 程 中 了 , 也 许 已 经 走 完 了 u n l o c k ( ) 方 法 ( 即 已 经 运 行 过 唤 醒 队 列 下 一 位 的 代 码 了 , 而 因 为 你 那 时 还 不 在 队 列 中 或 没 进 入 睡 眠 中 , 唤 醒 代 码 是 无 意 义 的 ) , 而 你 则 刚 加 入 队 列 , 如 果 你 此 时 直 接 p a r k ( ) 去 等 待 唤 醒 , 则 根 本 无 人 唤 醒 你 , 同 理 你 的 下 一 个 节 点 也 就 等 不 到 你 去 唤 醒 它 . ) 如 果 不 是 , 设 置 了 上 一 个 节 点 的 w a i t S t a t u s 为 S I N G L E 后 , 自 己 睡 眠 p a r k ( ) , 等 待 唤 醒 唤 醒 后 : 5 ) 判 断 上 一 个 节 点 是 不 是 h e a d , 一 般 来 说 是 ( 因 为 u n k o c k 唤 醒 的 一 般 就 是 h e a d . n e x t ) 如 果 不 是 则 进 入 s h o u l d P a r k A f t e r F a i l e d A c q u i r e : 将 队 列 中 一 些 已 取 消 的 节 点 从 队 列 中 删 除 , 重 新 设 置 节 点 的 p r e v 因 为 是 f o r 循 环 , 所 以 又 会 再 回 来 判 断 , 这 时 应 该 是 h e a d 了 , 尝 试 获 取 许 可 证 , 2 种 可 能 , 非 公 平 时 被 刚 l o c k 的 人 抢 了 ( 概 率 较 小 吧 ) , 另 一 种 就 是 获 取 成 功 获 取 成 功 后 , 把 原 h e a d 节 点 删 掉 , 自 己 设 为 h e a d 节 点 ( h e a d 象 征 一 个 拿 到 许 可 证 的 节 点 , 除 队 列 第 一 次 初 始 化 ) , 然 后 返 回 到 a c q u i r e ( ) , 中 途 没 有 线 程 被 打 断 就 正 常 出 方 法 , l o c k 结 束 总 结 : 得 到 方 式 1 : a c q u i r e 时 s t a t e = 0 , 且 抢 到 了 . 得 到 方 式 2 : 没 抢 到 或 不 让 抢 ( 公 平 锁 ) , 进 入 队 列 等 上 一 个 来 唤 醒 我 , 上 一 个 等 上 上 个 来 唤 醒 他 , 上 上 个 等 上 上 上 个 唤 醒 . . . . u n l o c k 唤 醒 队 列 第 二 个 非 取 消 的 线 程 并 删 除 队 列 第 一 个 元 素 [ 其 他 元 素 移 位 ] 这 样 第 二 个 线 程 就 可 以 唤 醒 非 取 消 的 第 三 个 线 程 [ 相 对 而 言 的 第 三 个 , 实 际 上 唤 醒 时 还 是 第 二 个 , 只 是 唤 醒 后 会 删 除 第 一 个 , 所 以 第 三 变 第 二 ] 解 锁 流 程 u n l o c k ( ) 1 2 3 4 5 6 7 8 1 ) r e l e a s e ( ) : 释 放 一 个 许 可 证 , 并 根 据 当 前 许 可 证 数 量 是 否 为 0 判 断 是 否 可 以 唤 醒 下 一 个 节 点 2 ) t r y R e l e a s e ( ) : 释 放 一 个 许 可 证 , 判 断 线 程 是 否 正 确 ( 是 不 是 当 前 独 占 锁 ) , 许 可 证 减 一 当 前 许 可 证 数 量 是 否 为 0 返 回 是 否 可 以 唤 醒 队 列 的 b o o l 标 识 . 3 ) u n p a r k S u c c e s s o r ( ) : 唤 醒 队 列 中 除 h e a d 外 第 一 个 处 于 阻 塞 ( 非 取 消 ) 的 节 点 ( 查 找 方 式 , 先 看 n e x t , n e x t 状 态 不 对 则 从 后 往 前 找 最 前 的 非 取 消 的 节 点 , 因 为 n e x t 如 果 为 n u l l , 无 法 找 n u l l 的 n e x t ) . 4 ) 唤 醒 后 , 会 将 h e a d 设 置 为 唤 醒 的 节 点 , 以 此 达 到 下 次 唤 醒 下 一 个 的 目 的 . 总 结 : 唤 醒 的 逻 辑 就 是 将 排 队 的 所 有 节 点 挨 个 唤 醒 , 而 节 点 被 唤 醒 后 又 会 出 队 列 ; 所 以 代 码 将 出 队 列 和 唤 醒 逻 辑 一 起 做 , 先 唤 醒 下 一 个 , 下 一 个 负 责 把 前 一 个 移 出 队 列 . 然 后 唤 醒 自 己 的 下 一 个 , 以 此 类 推 , 就 实 现 了 唤 醒 和 出 队 列 的 操 作 . R e e n t r a n t R e a d W r i t e L o c k 1 2 3 4 5 6 7 8 9 读 锁 获 取 锁 t r y A c q u i r e S h a r e d ( ) , 若 当 前 没 有 写 锁 存 在 , 则 s t a t e + 1 个 读 单 位 , 然 后 返 回 获 取 成 功 . 防 止 返 回 获 取 失 败 , 进 入 队 列 休 眠 . 释 放 锁 t r y R e l e a s e S h a r e d ( ) , s t a t e 1 个 读 单 位 , 然 后 根 据 s t a t e = 0 判 断 返 回 是 否 可 以 唤 醒 队 列 . 写 锁 获 取 锁 t r y A c q u i r e ( ) , 若 存 在 读 锁 , 则 失 败 , 若 存 在 写 锁 , 判 断 是 否 重 入 获 取 , 是 则 返 回 获 取 成 功 . 否 则 失 败 ; 失 败 就 意 味 着 加 队 列 , 休 眠 . 释 放 锁 t r y R e l e a s e ( ) , s t a t e 1 , 判 断 s t a t e 中 写 锁 数 量 是 否 为 0 , 是 则 可 以 唤 醒 队 列 . 否 则 代 表 这 时 一 个 可 重 入 锁 的 释 放 逻 辑 . 总 结 : 读 写 锁 也 好 , 可 重 入 锁 也 好 , C o u n t D o w n L a t c h 等 工 具 类 也 好 , 都 是 对 s t a t e 操 作 为 多 , 或 者 说 , 实 现 了 A Q S 的 它 们 , 只 负 责 操 作 s t a t e , 而 队 列 , 唤 醒 , 都 交 给 A Q S 来 处 理 . C o u n t D o w n L a t c h c o u n t D o w n ( ) 1 1 ) s t a t e 数 量 减 一 , 然 后 判 断 s t a t e 数 量 是 否 为 0 , 若 是 则 唤 醒 等 待 队 列 的 线 程 . a w a i t ( ) 1 2 1 ) n e w 之 后 , s t a t e 数 量 大 于 0 , 所 以 会 进 入 等 待 队 列 , 然 后 线 程 会 进 入 休 眠 . 2 ) 等 待 c o u n t D o w n 释 放 锁 , 释 放 到 许 可 证 为 0 时 , 唤 醒 等 待 队 列 的 线 程 . 总 结 : 利 用 了 加 共 享 锁 进 入 队 列 等 待 特 性 实 现 a w a i t ( ) 释 放 共 享 锁 减 少 许 可 证 数 量 且 唤 醒 队 列 中 的 等 待 的 线 程 实 现 c o u n t D o w n ( ) S e m a p h o r e 1 2 与 C o u n t D o w n L a t c h 相 反 , 初 始 数 量 一 般 为 0 , a c q u i r e ( ) 时 判 断 是 否 有 许 可 证 , 有 则 成 功 , 无 则 队 列 休 眠 而 r e l e a s e 则 是 添 加 一 个 许 可 证 , 添 加 后 总 是 唤 醒 队 列 . C y c l e B a r r i e r 1 2 3 含 义 : 凑 足 一 定 个 数 线 程 , 然 后 批 量 唤 醒 . a w a i t ( ) : 利 用 R e e n r a n t L o c k 的 l o c k 和 c o n d i t i o n 的 a w a i t 进 入 休 眠 当 凑 足 后 , 用 c o n d i t i o n 的 s i n g l e A l l 唤 醒 所 有 a w a i t 的 线 程 . H a s h M a p 请 简 述 H a s h M a p 的 底 层 数 据 结 构 1 2 1 . 使 用 了 数 组 加 链 表 , 以 数 组 为 主 , 链 表 加 红 黑 树 为 补 充 的 数 据 结 构 来 存 储 键 值 对 . 2 . 当 键 发 送 冲 突 ( 碰 撞 ) 时 , 数 据 将 串 成 链 表 存 于 数 组 中 , 当 链 表 长 度 超 过 指 定 值 ( 默 认 8 ) 时 , 链 表 转 成 红 黑 树 , 当 红 黑 树 长 度 小 于 指 定 值 时 ( 默 认 6 ) , 则 又 转 成 链 表 为 什 么 H a s h M a p 的 初 始 容 量 以 及 扩 容 后 的 容 量 均 为 2 的 指 数 幂 因 为 计 算 机 做 运 算 时 , 取 模 运 算 速 度 远 远 慢 于 位 运 算 , 而 若 容 量 始 终 为 2 的 指 数 幂 , 则 根 据 h a s h 获 取 数 组 下 标 时 只 需 要 使 用 ( 数 组 长 度 1 ) 设 置 了 值 J a v a B e a n B i n d e r 总 结 : 就 是 先 将 X x x P r o p e r t i e s 类 定 义 注 入 到 容 器 中 , 这 样 可 以 g e t B e a n , 然 后 通 过 B e a n P o s t P r o c e s s o r 再 实 例 化 后 将 属 性 值 一 一 绑 定 . @ C o n d i t i o n a l X x x 的 实 现 原 理 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 ) 在 类 上 加 上 注 解 @ C o n d i t i o n a l 或 带 有 @ C o n d i t i o n a l 的 其 他 注 解 : 其 他 扩 展 实 现 2 ) 在 所 有 的 扫 描 类 和 注 解 的 地 方 , 如 解 析 @ C o n f i g u r a t i o n , A n o t a t e d B e a n D e f i n i t i o n R e a d e r 等 r e a d e r 会 使 用 C o n d i t i o n E v a l u a t o r 的 s h o u l d S k i p ( ) 判 断 是 否 可 以 加 载 , 时 机 点 如 下 A n n o t a t e d B e a n D e f i n i t i o n R e a d e r # d o R e g i s t e r B e a n ( ) 的 第 二 行 代 码 C o n f i g u r a t i o n C l a s s B e a n D e f i n i t i o n R e a d e r # l o a d B e a n D e f i n i t i o n s F o r B e a n M e t h o d ( ) 第 四 行 C o n f i g u r a t i o n C l a s s B e a n D e f i n i t i o n R e a d e r # l o a d B e a n D e f i n i t i o n s F o r C o n f i g u r a t i o n C l a s s ( ) C o n f i g u r a t i o n C l a s s P a r s e r # d o P r o c e s s C o n f i g u r a t i o n C l a s s ( ) 处 理 C o m p o n e n t S c a n 那 段 3 ) 然 后 再 s h o u l d S k i p 中 判 断 , 判 断 逻 辑 大 致 如 下 : 先 遍 历 所 有 注 解 取 得 所 有 的 @ C o n d i t i o n a l 下 的 所 有 v a l u e , 这 个 v a l u e 是 具 体 的 C o n d i t i o n 实 现 , 如 O n C l a s s C o n d i t i o n 实 例 化 C o n d i t i o n 然 后 添 加 到 c o n d i t i o n s 中 排 序 并 遍 历 调 用 m a t c h e s ( ) , 一 个 不 匹 配 则 返 回 t r u e , 代 表 应 该 跳 过 . T I P S : C o n d i t i o n O u t c o m e 封 装 了 是 否 匹 配 和 匹 配 日 志 信 息 [ 为 啥 成 功 / 为 啥 失 败 ] S p r i n g B o o t C o n d i t i o n 提 供 了 通 用 的 根 据 C o n d i t i o n O u t c o m e 判 断 是 否 匹 配 并 记 录 日 志 信 息 的 抽 象 类 . 子 类 只 需 实 现 g e t M a t c h O u t c o m e ( ) : 根 据 m e t a d a t a [ 注 解 信 息 ] 返 回 C o n d i t i o n O u t c o m e 对 象 . 因 此 , 如 果 我 们 要 实 现 自 己 的 C o n d i t i o n , 可 以 继 承 它 . 另 发 现 A u t o C o n f i g u r a t i o n I m p o r t S e l e c t o r 也 含 有 判 断 C o n d i t i o n 的 逻 辑 , 刚 开 始 以 为 是 A u t o C o n f i g u r a t i o n 的 类 没 有 走 之 前 说 到 的 判 断 , 所 以 这 里 要 做 判 断 . 后 来 我 一 想 , 这 是 @ I m p o r t 引 入 的 , 所 以 , 是 走 了 判 断 的 . 因 此 这 里 多 出 的 一 个 A u t o C o n f i g u r a t i o n I m p o r t F i l t e r , 应 该 是 一 个 额 外 的 插 件 , 专 门 过 滤 配 置 在 s p r i n g . f a c t o r i e s 中 的 A u t o C o n f i g u r a t i o n 类 的 . 而 插 件 的 读 取 , 也 是 读 取 s p r i n g . f a c t o r i e s 来 遍 历 . @ A u t o C o n f i g u r e A f t e r 的 实 现 原 理 1 2 3 4 5 6 7 8 9 1 ) 首 先 A u t o C o n f i g u r a t i o n I m p o r t S e l e c t o r 是 一 个 D e f e r r e d I m p o r t S e l e c t o r 2 ) 这 种 D e f e r r e d I m p o r t S e l e c t o r 会 延 迟 加 载 , 原 理 是 p a r s e 后 再 加 载 , 而 非 p a r s e 执 行 过 程 中 就 加 载 . 3 ) 延 迟 加 载 机 制 会 先 调 用 p r o c e s s 方 法 , 将 要 加 载 的 c l a s s 保 存 起 来 , 然 后 再 调 用 s e l e c t I m p o r t s 返 回 . 4 ) 此 时 A u t o C o n f i g u r a t i o n I m p o r t S e l e c t o r . A u t o C o n f i g u r a t i o n G r o u p 的 s e l e c t I m p o r t s ( ) 会 调 用 s o r t A u t o C o n f i g u r a t i o n s ( ) , 也 就 是 调 用 了 A u t o C o n f i g u r a t i o n S o r t e r . g e t I n P r i o r i t y O r d e r ( ) 5 ) g e t I n P r i o r i t y O r d e r ( ) 调 用 了 s o r t B y A n n o t a t i o n ( ) 这 个 方 法 根 据 2 个 注 解 @ A u t o C o n f i g u r e B e f o r e @ A u t o C o n f i g u r e A f t e r 排 序 . 6 ) 最 后 返 回 的 就 是 有 序 的 了 . 另 外 , 这 两 个 注 解 只 能 作 用 再 A u t o C o n f i g u r a t i o n 上 . 总 结 : 所 有 的 A u t o C o n f i g u r a t i o n 所 引 入 的 c l a s s 文 件 解 析 完 毕 后 , 再 准 备 加 载 之 前 , 进 行 排 序 , 然 后 一 一 加 载 . 各 种 A u t o C o n f i g u r a t i o n 实 现 大 致 流 程 . 1 2 3 4 5 6 7 8 9 1 0 1 1 1 ) 首 先 是 @ S p r i n g B o o t A p p l i c a t i o n 启 用 了 @ E n a b l e A u t o C o n f i g u r a t i o n 2 ) @ E n a b l e A u t o C o n f i g u r a t i o n 又 使 用 @ I m p o r t 导 入 了 A u t o C o n f i g u r a t i o n I m p o r t S e l e c t o r . c l a s s 3 ) 然 后 A u t o C o n f i g u r a t i o n I m p o r t S e l e c t o r 导 入 s p r i n g . f a c t o r i e s 所 有 的 E n a b l e A u t o C o n f i g u r a t i o n 4 ) 最 后 , 当 一 个 项 目 依 赖 一 个 s t a r t e r x x x , 会 继 承 s t a r t e r 的 依 赖 项 , s p r i n g b o o t a u t o c o n f i g u r e 由 此 被 依 赖 5 ) s p r i n g b o o t a u t o c o n f i g u r e 带 有 所 有 b o o t 实 现 的 A u t o C o n f i g u r a t i o n 和 s p r i n g . f a c t o r i e s 配 置 6 ) 所 以 会 加 载 该 项 目 下 s p i r n g . f a c t o r i e s 中 定 义 的 E n a b l e A u t o C o n f i g u r a t i o n 7 ) 每 个 A u t o C o n f i g u r a t i o n 实 现 类 被 导 入 到 容 器 中 后 又 被 C o n f i g u r a t i o n C l a s s P o s t P r o c e s s o r 解 析 @ C o n f i g u r a t i o n , @ I m p o r t 等 注 解 ( 老 千 层 饼 了 ) 这 些 A u t o C o n f i g u r a t i o n 会 添 加 一 些 提 供 服 务 的 b e a n , 或 者 再 嵌 套 一 层 @ I m p o r t , @ C o n f i g u r a t i o n 等 。 另 外 , 这 些 b e a n 还 是 被 自 动 配 置 了 属 性 值 的 , 属 性 值 哪 里 来 ? 都 在 a p p l i c a t i o n . y m l 中 , 或 是 默 认 配 置 中 . 9 ) 这 样 , 容 器 中 就 加 入 了 一 个 或 多 个 配 置 好 的 b e a n 了 , 可 以 直 接 使 用 . 如 s t r i n g R e d i s T e m p l a t e , j d b c T e m p l a t e S p r i n g B o o t 是 如 何 自 动 扫 描 m a i n 方 法 所 在 类 所 在 包 的 ? 1 2 3 4 1 ) 首 先 是 @ S p r i n g B o o t A p p l i c a t i o n 启 用 了 @ E n a b l e A u t o C o n f i g u r a t i o n 2 ) @ E n a b l e A u t o C o n f i g u r a t i o n 又 使 用 @ A u t o C o n f i g u r a t i o n P a c k a g e 3 ) @ A u t o C o n f i g u r a t i o n P a c k a g e 中 的 @ I m p o r t 会 被 解 析 , R e g i s t r a r . c l a s s 的 r e g i s t e r B e a n D e f i n i t i o n s 会 被 执 行 4 ) 最 终 根 据 带 有 @ S p r i n g B o o t A p p l i c a t i o n 的 类 对 应 的 包 名 , 然 后 自 动 扫 描 到 容 器 中 , 效 果 同 @ C o m p o n e n t S c a n a p p l i c a t i o n . p r o p e r t i e s 是 如 何 被 加 载 到 E n v i r o n m e n t 中 的 ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 1 ) r u n 方 法 中 创 建 了 E n v i r o n m e n t 对 象 , 当 初 始 化 好 一 些 东 西 后 会 触 发 事 件 2 ) 通 过 S p r i n g A p p l i c a t i o n R u n L i s t e n e r s 的 e n v i r o n m e n t P r e p a r e d ( ) 告 知 监 听 者 3 ) 默 认 存 在 s p r i n g . f a c t o r i e s 中 的 E v e n t P u b l i s h i n g R u n L i s t e n e r 监 听 者 负 责 转 发 事 件 4 ) 事 件 被 转 发 到 A p p l i c a t i o n L i s t e n e r 下 的 监 听 者 来 处 理 5 ) 监 听 者 配 置 在 s p r i n g . f a c t o r i e s 中 , 其 中 C o n f i g F i l e A p p l i c a t i o n L i s t e n e r 监 听 了 此 事 件 6 ) 此 监 听 者 接 受 A p p l i c a t i o n E n v i r o n m e n t P r e p a r e d E v e n t 事 件 后 7 ) 加 载 一 些 p o s t P r o c e s s o r 专 门 用 于 处 理 e n v i r o n m e n t 对 象 的 p o s t P r o c e s s o r 8 ) 其 他 的 p o s t P r o c e s s o r 暂 时 不 管 , 真 正 做 了 加 载 的 是 p o s t P r o c e s s o r s . a d d ( t h i s ) ; 自 己 的 实 现 9 ) 自 己 的 处 理 方 法 是 : a d d P r o p e r t y S o u r c e s ( ) , 此 方 法 将 会 扫 描 指 定 的 路 径 下 指 定 的 某 些 文 件 1 0 ) 然 后 使 用 s p r i n g . f a c t o r i e s 下 的 P r o p e r t y S o u r c e L o a d e r 一 一 尝 试 解 析 1 1 ) 文 件 存 在 且 解 析 正 确 则 加 入 到 e n v i r o n m e n t 的 p r o p e r t y S o u r c e s . 某 些 路 径 : g e t S e a r c h L o c a t i o n s ( ) , 默 认 : c l a s s p a t h : / , c l a s s p a t h : / c o n f i g / . . . 某 些 文 件 : g e t S e a r c h N a m e s ( ) , 默 认 : a p p l i c a t i o n T I P S : P r o p e r t y S o u r c e L o a d e r 有 P r o p e r t i e s P r o p e r t y S o u r c e L o a d e r / Y a m l P r o p e r t y S o u r c e L o a d e r 一 个 尝 试 后 缀 有 x m l / p r o p e r t i e s , 另 一 个 是 y m l / y a m l , 所 以 所 有 可 能 性 有 : c l a s s p a t h : / a p p l i c a t i o n . x m l ; c l a s s p a t h : / a p p l i c a t i o n . p r o p e r t i e s c l a s s p a t h : / a p p l i c a t i o n . y m l ; c l a s s p a t h : / a p p l i c a t i o n . y a m l . . . . . . S p r i n g A p p l i c a t i o n . r u n ( ) 如 何 加 载 t o m c a t 的 ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 ) b o o t 的 r u n 里 面 会 创 建 a p p l i c a t i o n C o n t e x t , 如 是 w e b A p p l i c a t i o n T y p e = S E R V L E T , 则 实 现 类 为 A n n o t a t i o n C o n f i g S e r v l e t W e b S e r v e r A p p l i c a t i o n C o n t e x t 另 外 一 提 , w e b A p p l i c a t i o n T y p e 是 根 据 c l a s s p a t h 下 是 否 有 哪 些 类 来 推 断 的 . 2 ) 这 个 类 继 承 了 S e r v l e t W e b S e r v e r A p p l i c a t i o n C o n t e x t 3 ) S e r v l e t W e b S e r v e r A p p l i c a t i o n C o n t e x t 实 现 了 o n R e f r e s h ( ) 4 ) o n R e f r e s h ( ) 调 用 了 c r e a t e W e b S e r v e r ( ) 5 ) c r e a t e W e b S e r v e r ( ) 使 用 S e r v l e t W e b S e r v e r F a c t o r y . g e t W e b S e r v e r ( ) 获 取 w e b S e r v e r 对 象 6 ) S e r v l e t W e b S e r v e r F a c t o r y 会 被 S e r v l e t W e b S e r v e r F a c t o r y A u t o C o n f i g u r a t i o n 引 入 详 细 见 S e r v l e t W e b S e r v e r F a c t o r y C o n f i g u r a t i o n . E m b e d d e d T o m c a t . c l a s s 7 ) 引 入 后 调 用 g e t W e b S e r v e r ( ) , 大 概 为 n e w T o m c a t ( ) , 设 置 属 性 , 然 后 启 动 . 8 ) 至 此 , r u n ( ) 启 动 了 t o m c a t 或 j e t t y / u n d e r t o w . T I P S : s p r i n g 使 用 工 厂 模 式 获 取 w e b S e r v e r , 然 后 工 厂 又 通 过 A u t o C o n f i g u r a t i o n 自 动 注 入 ( 还 会 判 断 C o n d i t i o n ) . 这 样 如 果 新 增 一 种 w e b S e r v e r , 只 需 要 在 写 一 个 A u t o C o n f i g u r a t i o n 注 入 一 个 工 厂 即 可 . 非 常 灵 活 . S p r i n g M V C 源 码 关 键 类 解 析 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 W e b M v c C o n f i g u r a t i o n S u p p o r t 默 认 注 册 了 很 多 东 西 , 如 H a n d l e r M a p p i n g 几 个 实 现 , H a n d l e r A d a p t o r 几 个 实 现 H a n d l e r M a p p i n g 添 加 容 器 内 所 有 带 有 R e q u e s t M a p i n g 的 类 的 公 开 方 法 到 m a p p i n g s 中 ( A b s t r a c t H a n d l e r M e t h o d M a p p i n g # a f t e r P r o p e r t i e s S e t 中 ) 根 据 r e q u e s t 的 u r i 查 找 对 应 的 H a n d l e r M e t h o d , 步 骤 概 述 : 把 R e q u e s t M a p p i n g 注 解 内 的 p a t h 作 为 k e y 保 持 到 一 个 m a p 1 其 他 信 息 封 装 成 m a p p i n g 作 为 k e y 也 保 持 到 另 一 个 m a p 2 根 据 u r i 去 m a p 1 获 取 m a p p i n g , 再 根 据 m a p p i n g 获 取 H a n d l e r M e t h o d 封 装 成 M a t c h 对 象 , 与 其 他 匹 配 对 象 做 比 较 后 , 返 回 H a n d l e r M e t h o d H a n d l e r A d a p t e r 初 始 化 参 数 解 析 , 返 回 值 解 析 等 ( R e q u e s t M a p p i n g H a n d l e r A d a p t e r # a f t e r P r o p e r t i e s S e t ) 根 据 H a n d l e 确 定 对 应 的 H a n d l e r A d a p t e r , 然 后 执 行 这 个 h a n d l e r 如 R e q u e s t M a p p i n g H a n d l e r A d a p t e r 则 负 责 执 行 H a n d l e r M e t h o d 简 单 说 就 是 封 装 H a n d l e r M e t h o d , 根 据 参 数 值 设 置 参 数 , 然 后 调 用 方 法 , 再 处 理 返 回 值 封 装 成 M o d e l A n d V i e w 另 外 , 这 里 如 果 使 用 了 @ R e s p o n s e B o d y , 会 进 入 R e q u e s t R e s p o n s e B o d y M e t h o d P r o c e s s o r 然 后 使 用 m e s s a g e C o n v e r t e r s ( j s o n ) 写 入 到 响 应 流 最 后 m v 也 直 接 返 回 n u l l , 不 需 要 r e n d e r 了 。 V i e w R e s o l v e r 负 责 将 M o d e l A n d V i e w 解 析 成 H T M L , 如 J S P , F r e e M a r k e r H a n d l e r E x e c u t i o n C h i a n 管 理 拦 截 器 和 封 装 H a n d l e r , 负 责 拦 截 器 的 实 际 调 用 逻 辑 实 现 D i s p a t c h e r S e r v l e t 调 度 整 个 H T T P 请 求 响 应 流 程 , 调 用 各 个 子 组 件 负 责 执 行 处 理 方 法 , 解 析 视 图 , 处 理 异 常 等 . 执 行 流 程 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 G E T H t t p S e r v l e t # s e r v i c e ( ) H t t p S e r v l e t # d o G e t ( ) F r a m e w o r k S e r v l e t # d o G e t ( ) F r a m e w o r k S e r v l e t # p r o c e s s R e q u e s t ( ) F r a m e w o r k S e r v l e t # d o S e r v i c e ( ) D i s p a t c h e r S e r v l e t # d o S e r v i c e ( ) D i s p a t c h e r S e r v l e t # d o D i s p a t c h ( ) 调 用 容 器 内 所 有 的 H a n d l e r M a p p i n g 的 实 现 类 的 g e t H a n d l e r 方 法 , 返 回 H a n d l e r E x e c u t i o n C h a i n 调 用 容 器 内 所 有 的 H a n d l e r A d a p t o r 的 实 现 类 寻 找 适 合 的 当 前 H a n l d e r 的 H a n d l e r A d a p t o r 执 行 拦 截 器 的 p r e H a n d l e 方 法 , 并 根 据 返 回 结 果 判 断 是 否 接 续 执 行 H a n d l e r A d a p t o r 执 行 h a n d l e 方 法 进 入 R e q u e s t M a p p i n g H a n d l e r A d a p t o r 执 行 h a n d l e h a n d l e r I n t e r n a l i n v o k e H a n d l e r M e t h o d 生 成 S e r v l e t I n v o c a b l e H a n d l e r M e t h o d ( 就 是 实 现 了 反 射 调 用 方 法 和 设 置 参 数 , 处 理 返 回 值 等 操 作 ) 调 用 i n v o k e A n d H a n d l e i n v o k e F o r R e q u e s t 其 中 g e t M e t h o d A r g u m e n t V a l u e s 挨 个 调 用 H a n d l e r M e t h o d A r g u m e n t R e s o l v e r 获 取 参 数 值 然 后 执 行 d o I n v o k e , 利 用 反 射 技 术 调 用 M e t h o d , m e t h o d . i n v o k e ( o b j , a r g s ) ; 执 行 完 后 , 返 回 结 果 , 回 到 i n v o k e A n d H a n d l e 调 用 r e t u r n V a l u e H a n d l e r s 处 理 返 回 结 果 返 回 后 回 到 i n v o k e H a n d l e r M e t h o d , 调 用 g e t M o d e l A n d V i e w 获 取 通 用 的 返 回 值 ( 可 能 是 空 ) 返 回 M o d e l A n d V i e w 后 , 回 到 d o D i s p a t c h , 设 置 默 认 v i e w N a m e ( m v 为 空 则 不 需 要 设 置 ) 执 行 拦 截 器 的 p o s t H a n d l e 方 法 p r o c e s s D i s p a t c h R e s u l t 中 的 r e n d e r 解 析 视 图 后 通 过 r e s p o n s e 响 应 这 个 v i e w 根 据 异 常 情 况 执 行 异 常 处 理 器 , 以 及 执 行 拦 截 器 的 a f t e r C o m p l e t i o n 方 法 拦 截 器 原 理 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 何 时 加 入 ? 从 W e b M v c C o n f i g u r a t i o n S u p p o r t 的 子 类 中 调 用 a d d I n t e r c e p t o r s 添 加 一 些 拦 截 器 和 拦 截 器 的 路 径 配 置 I n t e r c e p t o r R e g i s t r y 和 M a p p e d I n t e r c e p t o r 实 现 拦 截 器 路 径 匹 配 , 在 n e w H a n d l e r E x e c u t i o n C h i a n 时 判 断 何 时 执 行 ? D i s p a t c h e r S e r v l e t 负 责 在 正 确 的 时 机 调 用 H a n d l e r E x e c u t i o n C h i a n 来 调 用 p r e H a n l d e 等 方 法 . 拿 到 H a n d l e r E x e c u t i o n C h i a n 后 调 用 p r e H a n l d e H a n d l e r A d a p t e r 执 行 完 h a n d l e r 后 , 调 用 p o s t H a n d l e 解 析 视 图 并 渲 染 到 r e s p o n s e 之 后 , 调 用 a f t e r C o m p l e t i o n 如 果 中 途 出 现 异 常 , 或 p r e H a n d l e 提 前 结 束 , 则 也 调 用 a f t e r C o m p l e t i o n 总 结 D i s p a t c h e r S e r v l e t 去 调 用 H a n d l e r E x e c u t i o n C h i a n 去 调 用 拦 截 器 具 体 方 法 . 复 杂 点 是 添 加 一 个 拦 截 器 到 被 加 入 到 H a n d l e r E x e c u t i o n C h i a n 比 较 复 杂 一 点 , 以 及 带 路 径 匹 配 的 拦 截 器 实 现 略 复 杂 一 些 . M y b a t i s 源 码 关 键 类 解 析 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 C o n f i g u r a t i o n 作 用 : 解 析 和 保 存 大 配 置 ( m y b a t i s 全 局 配 置 , 如 数 据 库 连 接 , 别 名 等 ) , 小 配 置 ( 每 个 m a p p e r 文 件 ) 信 息 M a p p e r P r o x y , M a p p e r M e t h o d 作 用 : 生 成 d a o I m p l 代 理 对 象 和 实 现 接 口 方 法 : 调 用 s q l S e s s i o n 操 作 方 法 E x e c u t o r 作 用 : 协 调 和 管 理 S t a t e m e n t H a n d l e r , P a r a m e t e r H a n d l e r , R e s u l t S e t H a n d l e r , 解 析 m a p p e r S t a t e m e n t 配 置 信 息 成 B o u n d S q l . S t a t e m e n t H a n d l e r 作 用 : 生 成 p r e p a r e d S t a t m e n t 对 象 ( J D B C 的 ) , 调 用 e x e c u t e 方 法 . P a r a m e t e r H a n d l e r 作 用 : 管 理 并 使 用 T y p e H a n d l e r 为 p r e p a r e d S t a t m e n t 对 象 设 置 参 数 , R e s u l t S e t H a n d l e r 作 用 : 将 R e s u l t S e t 结 果 集 转 成 接 口 返 回 值 认 识 的 数 据 , 负 责 延 迟 加 载 . 生 命 周 期 与 执 行 流 程 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 . 读 取 配 置 文 件 , 解 析 x m l ( 或 p r o p e r t i e s ) 获 得 配 置 信 息 ( 数 据 库 配 置 和 m a p p e r S q l 等 ) C o n f i g u r a t i o n 2 . 获 取 数 据 库 连 接 , 开 启 事 务 , 准 备 执 行 s q l ( o p e n S e s s i o n ) 3 . 使 用 动 态 代 理 技 术 生 成 代 理 类 4 . 代 理 类 根 据 代 理 方 法 对 应 的 m a p p e r S t a t e m e n t 类 型 调 用 s q l S e s s i o n 的 i n s e r t , u p d a t e , d e l e t e , s e l e c t X x x 方 法 ( M a p p e r P r o x y , M a p p e r M e t h o d ) 4 . s q l S e s s i o n 调 用 E x e c u t o r 执 行 s q l ( E x e c t o r , S i m p l e E x e c u t o r , C a c h i n g E x e c u t o r ) 5 . E x e c u t o r 生 成 S t a t e m e n t H a n d l e r 对 象 并 解 析 x m l 中 s q l 参 数 , 再 使 用 P a r a m e t e r H a n d l e r 设 置 参 数 . ( B a s e E x e c u t o r , S t a t m e n t H a n d l e r , P a r a m e t e r H a n d l e r , T y p e H a n d l e r 前 三 个 可 被 插 件 拦 截 任 意 方 法 ) 6 . 最 后 使 用 O G N L 表 达 式 解 析 库 对 i f , f o r e a c h , w h e r e 等 标 签 解 析 生 成 最 总 s q l ( O N G L ) 7 . 执 行 s q l 后 获 得 r e s u l t S e t , 使 用 R e s u l t S e t H a n d l e r 处 理 后 返 回 结 果 ( r e s u l t M a p , r e s u l t T y p e 的 处 理 在 这 里 ) ( R e s u l t S e t H a n d l e r 可 被 插 件 拦 截 任 意 方 法 ) 8 . 根 据 事 务 配 置 提 交 事 务 ( 自 动 提 交 ) , 保 存 一 级 缓 存 9 . 如 开 启 二 级 缓 存 , E x e c u t o r 还 会 被 装 饰 器 模 式 包 装 一 层 , 将 结 果 缓 存 到 M a p p e r S t a t e m e n t 的 c a c h e 变 量 中 . T I P S : 1 . 插 件 的 使 用 实 在 E x e c u t o r , S t a t e m e n t H a n d l e r , P a r a m e t e r H a n d l e r , R e s u l t S e t H a n d l e r 这 几 个 对 象 实 例 化 的 时 候 , 使 用 j d k 动 态 代 理 将 配 置 里 配 置 的 形 成 代 理 链 . 返 回 代 理 对 象 , 但 调 用 方 法 时 , 会 判 断 是 否 拦 截 此 方 法 并 执 行 插 件 的 代 码 . 使 用 到 的 设 计 模 式 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 1 . 代 理 模 式 M a p p e r P r o x y 生 成 m a p p e r 实 现 类 j d k 代 理 P l u g i n 生 成 代 理 对 象 实 现 插 件 j d k 代 理 R e s u l t S e t H a n d l e r ( L a z y L o a d ) c b l i b , j a v a s s i s t 2 . 装 饰 者 模 式 C a c h i n g E x e c u t o r : 装 饰 S i m p l e E x e c u t o r 添 加 二 级 缓 存 功 能 C a c h e , F i f o C a c h e . . . 使 用 装 饰 者 模 式 为 缓 存 添 加 不 同 特 性 ( 功 能 ) 3 . 适 配 器 模 式 S t a t e m e n t H a n d l e r 4 . 责 任 链 模 式 I n t e r c e p t o r ( 拦 截 E x e c u t o r 、 S t a t e m e n t H a n d l e r 、 P a r a m e t e r H a n d l e r 、 R e s u l t S e t H a n d l e r 对 象 ) 5 . 策 略 模 式 S t a t e m e n t H a n d l e r P r e p a r e d S t a t e m e n t H a n d l e r , C a l l a b l e S t a t e m e n t H a n d l e r , S i m p l e S t a t e m e n t H a n d l e r E x e c u t o r S i m p l e E x e c u t o r , R e u s e E x e c u t o r , B a t c h E x e c u t o r T y p e H a n d l e r U n k n o w n T y p e H a n d l e r , I n t e g e r T y p e H a n d l e r , N S t r i n g T y p e H a n d l e r 6 . 建 造 器 模 式 o r g . a p a c h e . i b a t i s . m a p p i n g . M a p p e d S t a t e m e n t . B u i l d e r o r g . a p a c h e . i b a t i s . b u i l d e r . x m l . X M L C o n f i g B u i l d e r 一 级 缓 存 实 现 1 2 3 4 5 6 7 8 9 1 . p u t 时 机 : o r g . a p a c h e . i b a t i s . e x e c u t o r . B a s e E x e c u t o r # q u e r y F r o m D a t a b a s e 的 l o c a l C a c h e . p u t O b j e c t ( k e y , l i s t ) 2 . g e t 时 机 : o r g . a p a c h e . i b a t i s . e x e c u t o r . B a s e E x e c u t o r # q u e r y 的 l o c a l C a c h e . g e t O b j e c t ( k e y ) 3 . 存 在 哪 里 o r g . a p a c h e . i b a t i s . e x e c u t o r . B a s e E x e c u t o r # l o c a l C a c h e 这 个 类 每 次 o p e n S e s s i o n 会 新 建 一 个 E x e c u t o r 实 例 二 级 缓 存 实 现 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 . p u t 时 机 : o r g . a p a c h e . i b a t i s . e x e c u t o r . C a c h i n g E x e c u t o r # q u e r y 的 t c m . p u t O b j e c t 然 后 实 际 上 是 调 用 了 c a c h e 的 p u t , c a c h e 实 际 上 来 自 C o n f i g u r a t i o n 解 析 m a p p e r 文 件 时 创 建 的 , 即 同 一 个 m a p p e r 共 用 同 一 个 c a c h e . 2 . g e t 时 机 : o r g . a p a c h e . i b a t i s . e x e c u t o r . C a c h i n g E x e c u t o r # q u e r y 的 t c m . g e t O b j e c t , c a c h e 实 际 是 : 同 上 3 . r e m o v e 时 机 : o r g . a p a c h e . i b a t i s . e x e c u t o r . C a c h i n g E x e c u t o r # f l u s h C a c h e I f R e q u i r e d 注 意 事 项 : 上 述 时 机 都 是 T r a n s a c t i o n C a c h e M a n a g e r 的 调 用 , 而 T r a n s a c t i o n C a c h e M a n a g e r 会 根 据 事 务 的 提 交 和 回 滚 来 处 理 缓 存 的 写 入 与 移 除 时 机 , 如 真 实 移 除 时 机 是 下 一 次 c o m m i t 触 发 , 真 实 写 入 也 是 c o m m i t 时 触 发 . 4 . 存 在 哪 里 o r g . a p a c h e . i b a t i s . m a p p i n g . M a p p e d S t a t e m e n t 也 算 是 在 o r g . a p a c h e . i b a t i s . s e s s i o n . C o n f i g u r a t i o n 中 M y b a t i s P l u s I O / 网 络 A I O , N I O , B I O 1 2 3 B I O : 从 j d k 1 . 4 前 , 采 用 S e r v e r S o c k e t A P I 进 行 网 络 连 接 , 所 有 操 作 都 是 阻 塞 的 ( 如 监 听 , 读 / 写 ) N I O : 从 j d k 1 . 4 起 , 对 于 所 有 操 作 都 是 依 赖 事 件 驱 动 , 只 需 较 少 的 线 程 即 可 处 理 大 量 请 求 A I O : j d k 1 . 7 起 , 在 N I O 基 础 上 实 现 异 步 , 所 有 事 件 通 知 由 系 统 通 知 , 而 非 N I O 那 样 轮 询 T C P / U D P 1 2 3 4 5 6 7 8 9 1 0 1 1 T C P : 是 面 向 连 接 的 协 议 , 收 发 数 据 前 , 必 须 建 立 可 靠 的 连 接 ( 通 过 三 次 握 手 ) U D P : 是 无 连 接 的 协 议 , 收 发 数 据 不 需 要 建 立 连 接 ( 握 手 ) 区 别 : 速 度 : T C P 满 , U D P 快 正 确 性 / 完 整 性 : T C P 好 , U D P 无 顺 序 性 : T C P 好 , U D P 无 应 用 : T C P : 文 件 下 载 , H T T P , D N S , I M 通 讯 U D P : 网 络 游 戏 , 直 播 推 流 N e t t y 封 装 了 复 杂 的 N I O 接 口 , 提 供 了 简 单 的 A P I 实 现 服 务 端 和 客 户 端 高 并 发 通 讯 , 并 封 装 了 很 多 工 具 , 如 心 跳 超 时 , 半 包 处 理 , w e b s o c k e t 等 . 数 据 结 构 与 算 法 数 据 结 构 队 列 , 栈 1 2 队 列 : 先 进 先 出 F I F O 栈 : L I F O 链 表 1 2 3 单 向 链 表 : N o d e 双 向 链 表 : N o d e 循 环 链 表 : N o d e 树 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 二 叉 树 : 先 序 遍 历 : 根 左 右 中 序 遍 历 : 左 根 右 后 序 遍 历 : 左 右 根 红 黑 树 : 红 黑 树 是 一 种 含 有 红 黑 结 点 并 能 自 平 衡 的 二 叉 查 找 树 . 任 意 一 结 点 到 每 个 叶 子 结 点 的 路 径 都 包 含 数 量 相 同 的 黑 结 点 . 速 度 : O ( l o g 2 n ) 最 坏 : O ( l o g n ) 对 比 B S T : 查 找 更 快 , 插 入 更 慢 . 对 比 A V L : 查 找 略 慢 , 插 入 更 快 . B + 树 : 所 有 记 录 节 点 存 放 在 叶 子 节 点 上 , 且 是 顺 序 存 放 , 由 各 叶 子 节 点 指 针 进 行 连 接 。 如 果 从 最 左 边 的 叶 子 节 点 开 始 顺 序 遍 历 , 能 得 到 所 有 键 值 的 顺 序 排 序 。 查 找 速 度 和 树 高 度 有 关 , 如 M y S Q L 树 高 度 为 3 , 则 总 是 查 询 3 次 找 到 子 节 点 , 即 得 到 数 据 . 算 法 排 序 算 法 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 快 速 排 序 : O ( n l o g ( n ) ) 将 数 组 分 为 2 半 , 并 计 算 一 个 中 间 值 , 将 左 边 所 有 大 于 中 间 值 的 移 到 右 边 , 把 右 边 所 有 小 于 中 间 值 的 移 到 左 边 , 然 后 分 别 对 左 边 和 右 边 递 归 处 理 ( 再 分 2 半 , 再 取 中 间 值 , 再 移 动 , 再 递 归 ) , 直 到 无 需 递 归 为 止 。 归 并 排 序 : O ( n l o g ( n ) ) 将 数 组 不 断 两 两 拆 分 , 直 到 无 法 拆 分 ( 只 有 2 个 元 素 ) 时 开 始 对 拆 分 后 的 元 素 进 行 排 序 , 然 后 不 断 回 溯 , 不 断 排 序 , 直 到 第 一 次 拆 分 , 即 所 有 元 素 都 是 有 序 的 了 。 排 序 方 式 为 先 取 两 个 部 分 的 第 一 个 下 标 , 互 相 判 断 , 谁 小 谁 放 到 有 序 数 组 中 , 然 后 小 的 那 个 下 标 移 位 , 继 续 判 断 , 直 到 其 中 一 个 部 分 所 有 元 素 取 完 , 则 将 另 一 部 分 剩 余 元 素 批 量 直 接 拷 贝 到 有 序 数 组 即 可 。 冒 泡 排 序 : O ( n ^ 2 ) 最 好 O ( n ) 进 行 n 1 轮 , 每 轮 遍 历 数 组 两 两 比 较 交 换 , 从 而 达 到 把 最 大 的 交 换 到 最 后 面 。 下 轮 遍 历 数 组 个 数 减 一 。 选 择 排 序 : O ( n ^ 2 ) 进 行 n 1 轮 , 每 轮 遍 历 选 择 数 组 最 小 值 放 到 最 前 面 , 下 轮 遍 历 数 组 个 数 减 一 插 入 排 序 : O ( n ^ 2 ) 最 好 O ( n ) 分 2 个 数 组 , 有 序 和 无 序 , 开 局 有 序 默 认 含 有 数 组 第 一 个 元 素 , 无 序 含 有 剩 余 的 元 素 。 遍 历 无 序 所 有 元 素 , 从 后 向 前 比 较 大 小 , 然 后 进 行 插 入 到 有 序 数 组 中 或 对 数 组 元 素 移 位 。 希 尔 排 序 : O ( n ^ 1 . 2 5 ) 对 数 组 进 行 分 组 , 对 每 组 使 用 插 入 排 序 的 移 位 进 行 排 序 , 第 一 次 分 数 组 长 度 / 2 组 , 下 一 次 分 组 为 数 组 长 度 / 2 再 / 2 组 , 若 分 长 度 / 2 组 , 则 每 组 2 个 , 若 分 长 度 / 2 / 2 组 , 则 每 组 2 * 2 个 , 直 到 长 度 为 1 . 这 是 一 个 将 数 组 后 段 数 据 尽 可 能 与 前 段 数 据 排 序 , 改 进 插 入 排 序 后 端 数 据 过 小 导 致 移 位 操 作 过 多 的 问 题 。 基 数 排 序 : O ( n ) 创 建 1 0 个 桶 , 每 个 桶 大 小 均 为 数 组 长 度 , 然 后 遍 历 数 组 , 从 元 素 的 最 低 位 ( 个 位 ) 开 始 , 取 出 并 放 到 对 应 的 桶 ( 如 个 位 是 8 , 则 放 到 第 8 个 桶 中 ) , 放 完 后 , 顺 序 遍 历 所 有 桶 , 顺 序 取 出 每 个 元 素 , 组 成 新 数 组 , 再 将 新 数 组 按 以 上 流 程 处 理 十 位 , 再 百 位 , 直 到 数 组 中 的 最 大 数 的 最 高 位 。 堆 排 序 : 。 。 。 优 化 算 法 1 2 3 4 5 贪 心 算 法 爬 山 算 法 模 拟 退 火 算 法 遗 传 算 法 蚁 群 搜 索 算 法 设 计 模 式 7 大 原 则 1 2 3 4 5 6 7 单 一 职 责 : 每 个 类 只 负 责 一 个 职 责 ( 或 每 个 方 法 ) 接 口 隔 离 : 一 个 类 对 另 一 个 类 的 依 赖 应 建 立 在 最 小 的 接 口 上 依 赖 倒 转 : 高 层 模 块 不 应 依 赖 低 层 模 块 , 二 者 都 应 该 依 赖 接 口 而 非 细 节 . 细 节 依 赖 抽 象 , 面 向 接 口 编 程 里 式 替 换 : 子 类 应 该 做 到 可 以 替 换 父 类 , 及 子 类 应 尽 量 不 重 写 父 类 方 法 . 开 闭 原 则 : 对 提 供 者 而 已 可 以 修 改 , 对 使 用 者 而 言 不 需 要 修 改 ( 即 代 码 兼 容 性 ) , 尽 量 使 用 扩 展 增 加 功 能 , 而 非 修 改 原 有 类 迪 米 特 法 则 : 一 个 对 象 应 该 对 其 他 对 象 保 持 最 小 了 解 ( 最 少 知 道 原 则 ) 合 成 复 用 原 则 : 一 个 类 使 用 另 一 个 类 的 代 码 ( 方 法 ) , 尽 量 使 用 合 成 , 而 不 是 继 承 创 建 型 单 例 模 式 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 原 理 : 确 保 一 个 类 只 有 一 个 实 例 , 并 提 供 该 实 例 的 全 局 访 问 点 。 饿 汉 式 : 静 态 常 量 静 态 代 码 块 懒 汉 式 : 直 接 判 断 ( 线 程 不 安 全 ) 方 法 加 s y n c h r o n i z e d ( 线 程 安 全 , 效 率 低 ) 判 断 后 再 同 步 ( 错 误 写 法 ) 双 重 判 断 ( i f 同 步 i f ) ( 推 荐 写 法 ) 匿 名 静 态 内 部 类 ( 简 单 , 推 荐 ) 枚 举 ( 简 单 , 但 对 象 方 法 写 在 枚 举 中 , 略 有 不 适 ) 示 例 : j a v a . l a n g . R u n t i m e # g e t R u n t i m e ( ) j a v a . a w t . D e s k t o p # g e t D e s k t o p ( ) 原 型 模 式 1 2 3 4 5 6 7 8 9 原 理 : 使 用 原 型 实 例 指 定 要 创 建 对 象 的 类 型 , 通 过 复 制 这 个 原 型 来 创 建 新 对 象 . 示 例 : J a v a 的 O b j e c t 对 象 的 c l o n e 方 法 , j a v a . u t i l . A r r a y s . A r r a y L i s t # t o A r r a y ( ) 浅 拷 贝 : 仅 对 基 础 类 型 及 字 符 串 类 型 的 字 段 拷 贝 值 深 拷 贝 : 同 时 对 引 用 类 型 ( 如 数 组 , 对 象 ) 也 进 行 拷 贝 深 拷 贝 实 现 : 1 . 重 写 c l o n e , 一 一 处 理 每 个 引 用 对 象 ( 调 用 对 象 的 c l o n e ) , 麻 烦 , 且 若 对 象 之 间 关 系 复 杂 , 其 中 一 个 未 实 现 深 拷 贝 则 导 致 b u g . 2 . 利 用 序 列 化 和 反 序 列 化 , 如 J s o n , 或 J a v a 自 带 的 序 列 化 方 式 ( 二 进 制 ) 创 建 者 模 式 ( 生 成 器 模 式 ) 1 2 3 4 5 6 原 理 : 封 装 一 个 对 象 的 构 造 过 程 , 并 允 许 按 步 骤 构 造 . 若 对 象 的 生 成 过 于 复 杂 ( 字 段 极 多 且 赋 值 还 有 依 赖 关 系 , 需 要 顺 序 调 用 ) , 则 可 将 赋 值 过 程 封 装 成 一 个 b u i l d ( ) , 并 放 到 一 个 B u i l d e r 类 中 . 此 类 对 外 提 供 各 个 字 段 的 赋 值 方 法 并 先 保 存 起 来 , 直 到 调 用 b u i l d ( ) , 此 方 法 返 回 对 象 实 例 . 使 用 此 模 式 , 调 用 者 无 需 关 注 构 建 过 程 , 只 需 设 置 自 己 想 要 的 值 , 然 后 调 用 b u i l d ( ) 即 可 得 到 对 象 实 例 . 且 若 增 加 或 修 改 字 段 , 构 造 过 程 变 化 , 调 用 者 无 感 知 , 无 需 修 改 代 码 . 符 合 开 闭 原 则 . 示 例 : S t r i n g B u i l d e r , 一 些 框 架 的 C o n f i g u r a t i o n B u i l d e r ( 如 x m p p ) , 用 于 构 建 配 置 . 简 单 工 厂 模 式 1 2 3 4 5 原 理 : 在 创 建 一 个 对 象 时 不 向 客 户 暴 露 内 部 细 节 , 并 提 供 一 个 创 建 对 象 的 通 用 接 口 。 此 模 式 可 避 免 多 个 调 用 者 创 建 对 象 时 判 断 创 建 哪 个 子 类 的 重 复 代 码 , 且 若 多 一 个 子 类 , 调 用 者 无 需 修 改 代 码 . 示 例 : S p r i n g A p p l i c a t i o n C o n t e x t 的 g e t B e a n 方 法 . 工 厂 方 法 模 式 1 2 3 4 5 6 原 理 : 定 义 了 一 个 创 建 对 象 的 接 口 , 但 由 子 类 决 定 要 实 例 化 哪 个 类 。 工 厂 方 法 把 实 例 化 操 作 推 迟 到 子 类 。 此 模 式 解 决 了 简 单 工 厂 每 增 加 一 个 子 类 需 要 修 改 工 厂 类 的 问 题 . 此 模 式 存 在 问 题 , 若 新 增 一 个 子 类 , 需 同 时 新 增 一 个 子 类 工 厂 , 系 统 复 杂 性 更 高 . 示 例 : C a l e n d a r , N u m b e r F o r m a t 抽 象 工 厂 模 式 1 2 3 4 5 6 原 理 : 提 供 一 个 接 口 , 用 于 创 建 相 关 的 对 象 家 族 . 同 上 , 由 子 类 工 厂 决 定 创 建 哪 些 对 象 . 此 模 式 是 工 厂 方 法 的 升 级 版 , 不 同 之 处 在 于 它 同 时 创 建 多 个 种 类 的 对 象 ( 工 厂 类 具 有 多 个 方 法 ) . 此 模 式 将 一 个 对 象 家 族 的 新 建 集 合 到 一 个 工 厂 类 创 建 管 理 , 这 些 对 象 家 族 相 互 之 间 一 般 有 关 联 , 在 创 建 时 就 可 以 处 理 这 些 关 联 . 且 对 于 2 个 子 类 工 厂 , 一 般 可 以 无 缝 切 换 , 使 得 修 改 代 码 极 为 方 便 ( 即 换 一 个 子 类 工 厂 ) . 此 模 式 在 新 增 一 个 对 象 家 族 的 成 员 时 非 常 麻 烦 ( 即 所 有 工 厂 类 需 要 新 增 一 个 方 法 ) , 但 再 新 增 一 类 对 象 家 族 时 比 较 简 单 ( 即 新 增 一 个 子 类 工 厂 ) . 结 构 型 适 配 器 模 式 1 2 3 4 5 6 原 理 : 把 一 个 接 口 转 换 成 另 一 个 用 户 需 要 的 接 口 . 定 义 一 个 类 , 实 现 用 户 需 要 的 接 口 , 并 聚 合 一 个 需 要 转 换 的 接 口 对 象 , 在 重 写 的 方 法 ( 用 户 需 要 的 方 法 ) 中 调 用 聚 合 的 对 象 的 方 法 , 若 需 要 返 回 值 , 且 返 回 值 类 型 不 一 致 , 则 还 需 要 在 方 法 中 处 理 一 番 , 然 后 返 回 . 这 个 过 程 叫 做 适 配 . 这 个 类 叫 做 适 配 器 类 . 使 用 此 模 式 可 对 一 些 老 旧 接 口 适 配 兼 容 . 示 例 : j a v a . u t i l . A r r a y s # a s L i s t ( ) 将 数 组 适 配 成 L i s t , S p r i n g M V C 的 H a n d l e r A d a p t e r 装 饰 者 模 式 1 2 3 4 5 6 原 理 : 将 一 个 或 多 个 功 能 ( 方 法 ) 动 态 的 新 增 到 一 个 类 中 . 把 需 要 新 增 功 能 类 称 为 A , 定 义 一 个 类 B , 实 现 A 的 上 层 接 口 , 并 聚 合 一 个 A 的 实 例 对 象 , B 类 实 现 的 接 口 中 , 对 其 他 不 关 心 的 方 法 直 接 调 用 聚 合 的 对 象 的 方 法 . 对 于 关 心 的 方 法 则 可 以 在 调 用 前 后 进 行 加 料 处 理 ( 如 一 个 方 法 返 回 一 个 数 , 可 以 在 原 来 的 返 回 值 上 乘 以 2 ) , 同 时 , B 类 也 可 以 新 增 一 些 其 他 方 法 , 这 些 方 法 就 是 多 出 的 功 能 . B 类 就 是 装 饰 者 类 , A 就 是 被 装 饰 类 . 此 模 式 的 优 点 是 , 装 饰 类 也 可 以 当 做 被 装 饰 类 , 然 后 再 来 一 层 装 饰 , 可 以 无 限 的 装 饰 . 示 例 : j a v a I O 流 代 理 模 式 1 2 3 4 5 6 7 8 9 1 0 1 1 原 理 : 控 制 其 他 对 象 的 访 问 ( 方 法 级 ) , 将 一 些 前 置 或 后 置 的 处 理 , 通 过 代 理 对 象 注 入 到 目 标 对 象 的 方 法 前 后 . 面 向 切 面 编 程 . 类 型 : 静 态 代 理 : 定 义 一 个 代 理 类 实 现 目 标 对 象 的 上 层 接 口 , 并 聚 合 一 个 目 标 对 象 , 重 写 方 法 时 将 前 置 后 置 处 理 加 上 . 动 态 代 理 : J D K 动 态 代 理 : 需 要 目 标 对 象 有 上 层 接 口 ( 自 然 接 口 内 的 方 法 才 可 以 代 理 ) 使 用 j a v a . l a n g . r e f l e c t . P r o x y # g e t P r o x y C l a s s C G L I B 动 态 代 理 : 是 个 类 就 行 . 实 现 原 理 是 A S M 框 架 动 态 生 成 目 标 对 象 类 的 子 类 字 节 码 , 然 后 通 过 反 射 生 成 代 理 对 象 . 示 例 : S p r i n g A O P 桥 接 模 式 1 2 3 4 5 原 理 : 将 抽 象 与 实 现 分 离 开 来 , 使 它 们 可 以 独 立 变 化 。 桥 接 的 含 义 是 , 一 个 桥 , 放 在 哪 里 都 有 桥 的 2 边 , 桥 的 2 边 可 以 变 化 , 但 桥 始 终 不 变 . 此 处 , 桥 代 表 一 个 操 作 ( 如 手 机 上 运 行 软 件 ) , 2 边 代 表 一 个 操 作 的 2 个 维 度 ( 如 手 机 和 软 件 ) . 同 时 , 桥 接 后 的 操 作 也 可 以 视 为 一 个 维 度 , 与 另 一 个 维 度 桥 接 ( 如 手 机 上 运 行 软 件 和 人 这 2 个 维 度 , 可 以 进 行 桥 接 , 组 成 3 维 度 嵌 套 桥 接 ) . 示 例 : J D B C 获 取 连 接 , 获 取 连 接 是 一 个 维 度 , 数 据 库 是 一 个 维 度 , 数 据 库 有 多 个 , 所 以 这 是 一 个 数 据 库 维 度 变 化 , 另 一 维 度 不 变 的 桥 接 模 式 . 享 元 模 式 1 2 3 4 5 原 理 : 利 用 共 享 的 方 式 来 支 持 大 量 细 粒 度 的 对 象 , 这 些 对 象 一 部 分 内 部 状 态 是 相 同 的 。 如 常 见 的 线 程 池 , 常 量 池 等 , 使 得 对 象 的 获 取 速 度 加 快 . 示 例 : j a v a . l a n g . I n t e g e r # v a l u e O f ( ) j a v a . l a n g . B o o l e a n # v a l u e O f ( ) 组 合 模 式 1 2 3 4 5 6 7 8 9 1 0 原 理 : 将 对 象 组 合 成 树 形 结 构 来 表 示 “ 整 体 / 部 分 ” 层 次 关 系 , 允 许 用 户 以 相 同 的 方 式 处 理 单 独 对 象 和 组 合 对 象 。 一 般 需 要 部 分 和 整 体 具 有 一 定 的 相 似 度 , 才 能 对 其 进 行 抽 象 . 对 部 分 / 整 体 进 行 抽 象 , 得 出 一 个 公 共 抽 象 类 或 接 口 , 再 实 现 类 中 根 据 具 体 角 色 做 不 同 处 理 . 示 例 : j a v a x . s w i n g . J C o m p o n e n t # a d d ( C o m p o n e n t ) j a v a . u t i l . M a p # p u t A l l ( M a p ) j a v a . u t i l . L i s t # a d d A l l ( C o l l e c t i o n ) j a v a . u t i l . S e t # a d d A l l ( C o l l e c t i o n ) 外 观 模 式 1 2 原 理 : 提 供 了 一 个 统 一 的 接 口 , 用 来 访 问 子 系 统 中 的 一 群 接 口 , 从 而 让 子 系 统 更 容 易 使 用 . 行 为 型 职 责 链 ( 责 任 链 ) 模 式 1 2 3 4 5 6 原 理 : 使 多 个 对 象 都 有 机 会 处 理 请 求 , 将 这 些 对 象 连 成 一 条 链 , 并 沿 着 这 条 链 发 送 该 请 求 , 直 到 有 一 个 对 象 处 理 它 为 止 , 从 而 避 免 请 求 的 发 送 者 和 接 收 者 之 间 的 耦 合 关 系 。 示 例 : j a v a x . s e r v l e t . F i l t e r # d o F i l t e r ( ) n e t t y 的 H a n d l e r C h a i n 观 察 者 模 式 1 2 3 4 5 6 7 原 理 : 定 义 对 象 之 间 的 一 对 多 依 赖 , 当 一 个 对 象 状 态 改 变 时 , 它 的 所 有 依 赖 都 会 收 到 通 知 并 且 自 动 更 新 状 态 。 主 题 ( S u b j e c t ) 是 被 观 察 的 对 象 , 而 其 所 有 依 赖 者 ( O b s e r v e r ) 称 为 观 察 者 。 示 例 : s w i n g 的 事 件 监 听 ( 按 钮 事 件 , 鼠 标 事 件 ) J S 的 事 件 监 听 状 态 模 式 1 2 3 原 理 : 允 许 对 象 在 内 部 状 态 改 变 时 改 变 它 的 行 为 , 对 象 看 起 来 好 像 修 改 了 它 所 属 的 类 。 状 态 模 式 主 要 是 用 来 解 决 状 态 转 移 的 问 题 , 当 状 态 发 生 转 移 了 , 那 么 C o n t e x t 对 象 就 会 改 变 它 的 行 为 . 策 略 模 式 1 2 3 4 5 6 原 理 : 定 义 一 系 列 算 法 , 封 装 每 个 算 法 , 并 使 它 们 可 以 互 换 。 策 略 模 式 可 以 让 算 法 独 立 于 使 用 它 的 客 户 端 。 策 略 模 式 主 要 是 用 来 封 装 一 组 可 以 互 相 替 代 的 算 法 族 , 并 且 可 以 根 据 需 要 动 态 地 去 替 换 C o n t e x t 使 用 的 算 法 . 示 例 : j a v a . u t i l . C o m p a r a t o r # c o m p a r e ( ) j a v a x . s e r v l e t . h t t p . H t t p S e r v l e t 模 板 方 法 模 式 1 2 3 4 5 原 理 : 定 义 算 法 框 架 , 并 将 一 些 步 骤 的 实 现 延 迟 到 子 类 。 通 过 模 板 方 法 , 子 类 可 以 重 新 定 义 算 法 的 某 些 步 骤 , 而 不 用 改 变 算 法 的 结 构 。 示 例 : j a v a . u t i l . C o l l e c t i o n s # s o r t ( ) 命 令 模 式 1 2 3 4 5 原 理 : 将 一 个 对 象 ( 命 令 接 收 者 ) 的 每 个 操 作 拆 分 到 每 一 个 命 令 类 中 , 再 使 用 一 个 命 令 管 理 类 来 管 理 这 些 命 令 . 使 得 命 令 可 以 放 入 队 列 中 有 序 执 行 , 且 可 以 统 一 记 录 命 令 的 操 作 日 志 , 还 可 以 支 持 撤 销 操 作 ( 每 个 命 令 都 实 现 对 应 的 撤 销 即 可 ) . 此 模 式 的 好 处 是 , 若 将 命 令 抽 象 为 几 个 标 准 的 命 令 ( 如 开 , 关 ) , 然 后 管 理 多 个 命 令 接 收 者 ( 如 灯 , 电 视 机 , 空 调 ) 的 操 作 , 可 使 新 增 命 令 接 收 者 变 得 简 单 , 即 扩 展 性 好 . 又 称 万 能 遥 控 器 . 中 介 模 式 1 2 3 4 5 原 理 : 集 中 相 关 对 象 之 间 复 杂 的 沟 通 和 控 制 方 式 。 降 低 子 系 统 之 间 的 耦 合 . 类 似 一 个 消 息 收 发 中 心 , 负 责 字 系 统 的 消 息 中 转 , 使 得 子 系 统 之 间 可 以 进 行 一 定 的 交 互 . 示 例 : 线 程 池 管 理 者 线 程 和 要 执 行 的 任 务 . 备 忘 录 模 式 1 2 3 原 理 : 在 不 违 反 封 装 的 情 况 下 获 得 对 象 的 内 部 状 态 , 从 而 在 需 要 时 可 以 将 对 象 恢 复 到 最 初 状 态 。 如 对 游 戏 的 当 前 状 态 进 行 一 个 保 存 , 然 后 在 后 续 游 戏 中 死 亡 后 可 以 读 取 这 个 状 态 重 新 开 始 . 访 问 者 模 式 1 2 3 原 理 : 为 一 个 对 象 结 构 ( 比 如 组 合 结 构 ) 增 加 新 能 力 。 使 用 访 问 者 模 式 可 实 现 重 载 的 动 态 绑 定 ( 即 伪 双 分 派 ) , 效 果 与 重 载 方 法 内 使 用 i n s t a n c e o f 是 一 样 的 , 但 使 用 访 问 者 模 式 , 可 扩 展 性 更 好 . 迭 代 器 模 式 1 2 3 4 原 理 : 提 供 一 种 顺 序 访 问 聚 合 对 象 元 素 的 方 法 , 并 且 不 暴 露 聚 合 对 象 的 内 部 表 示 。 示 例 : j a v a . u t i l . I t e r a t o r 解 释 器 模 式 1 2 3 4 原 理 : 为 语 言 创 建 解 释 器 , 通 常 由 语 言 的 语 法 和 语 法 分 析 来 定 义 。 示 例 : E L 表 达 式 , F r e e m a k e r 模 板 空 对 象 模 式 1 2 原 理 : 使 用 什 么 都 不 做 的 空 对 象 来 代 替 N U L L , 避 免 空 对 象 判 断 , 避 免 空 指 针 异 常 . 高 并 发 R e d i s 缓 存 缓 存 穿 透 ( 攻 击 型 ) 1 2 3 4 5 6 含 义 : 对 于 一 个 不 存 在 的 k e y 进 行 访 问 , 会 导 致 数 据 库 不 停 地 查 询 这 个 k e y 进 行 缓 存 . 解 决 方 案 : 1 . 使 用 布 隆 过 滤 器 , 一 定 不 存 在 的 数 据 会 被 过 滤 . 2 . 查 询 后 缓 存 一 个 空 结 果 , 但 很 快 超 时 . ( 有 缺 点 , 但 简 单 ) 缓 存 雪 崩 1 2 3 4 5 6 含 义 : 缓 存 雪 崩 是 指 在 我 们 设 置 缓 存 时 采 用 了 相 同 的 过 期 时 间 , 导 致 缓 存 在 某 一 时 刻 同 时 失 效 , 请 求 全 部 转 发 到 D B , D B 瞬 时 压 力 过 重 雪 崩 。 解 决 方 案 : 1 . 设 置 超 时 时 , 在 原 有 的 失 效 时 间 基 础 上 增 加 一 个 随 机 值 , 比 如 1 5 分 钟 随 机 2 . 加 锁 或 者 队 列 的 方 式 保 证 缓 存 的 单 线 程 ( 进 程 ) , 避 免 大 量 请 求 打 到 数 据 库 . 缓 存 击 穿 1 2 3 4 5 6 7 含 义 : 单 一 热 点 k e y 失 效 时 导 致 大 量 请 求 打 到 数 据 库 。 解 决 方 案 : 1 . 分 布 式 互 斥 锁 ( r e d i s , z o o k p e r ) 2 . 添 加 超 时 字 段 记 录 超 时 ( 比 实 际 超 时 小 一 些 ) , 每 次 获 取 数 据 根 据 字 段 判 断 是 否 超 时 , 若 是 , 则 马 上 延 长 超 时 字 段 , 然 后 加 载 数 据 库 重 新 缓 存 3 . r e d i s 不 设 置 过 期 , 通 过 添 加 超 时 字 段 判 断 , 超 时 则 代 码 异 步 跑 一 个 重 新 缓 存 的 任 务 ( 这 里 代 码 需 要 先 本 地 加 锁 , 再 加 分 布 式 锁 ) . R a b b i t M Q 解 耦 , 异 步 , 削 峰 解 耦 1 2 3 定 义 : 为 面 向 服 务 的 架 构 ( S O A ) 提 供 基 本 的 最 终 一 致 性 实 现 . 即 将 2 个 系 统 的 交 互 通 过 消 息 队 列 中 转 , 以 防 止 某 个 系 统 临 时 挂 了 导 致 调 用 失 败 . 示 例 : 下 单 系 统 调 用 库 存 系 统 , 若 当 时 库 存 系 统 正 好 挂 了 , 则 导 致 下 单 失 败 . 此 时 将 请 求 放 到 消 息 队 列 中 , 库 存 系 统 读 取 消 息 进 行 处 理 , 若 当 时 库 存 挂 了 也 没 关 系 , 处 理 失 败 也 没 关 系 ( 可 重 试 , 且 重 试 代 码 比 较 简 单 ) . 异 步 1 2 3 4 定 义 : 对 于 某 些 不 要 求 返 回 值 的 耗 时 操 作 , 可 异 步 处 理 . 示 例 : 用 户 下 单 后 , 需 发 送 多 个 下 单 提 醒 ( 微 信 通 知 , 短 信 通 知 , 邮 件 通 知 ) , 每 个 操 作 都 比 较 耗 时 , 可 考 虑 将 其 放 入 消 息 队 列 后 直 接 返 回 , 由 另 一 段 代 码 负 责 读 取 消 息 发 送 通 知 . 削 峰 1 2 3 4 定 义 : 将 请 求 高 峰 打 平 , 使 得 系 统 可 以 处 理 过 来 . 示 例 : 某 次 秒 杀 1 分 钟 过 来 1 万 请 求 , 而 系 统 一 分 钟 大 概 只 能 处 理 1 千 请 求 , 系 统 要 处 理 完 这 些 请 求 理 论 需 要 1 0 分 钟 , 但 如 果 不 做 处 理 , 请 求 瞬 间 打 过 来 , 系 统 直 接 卡 死 , 卡 住 时 候 一 分 钟 可 能 只 能 处 理 1 0 0 请 求 . 此 时 需 要 将 所 有 请 求 都 打 到 队 列 里 面 , 系 统 再 慢 慢 从 队 列 中 读 取 处 理 . 文 档 生 成 插 件 更 多 细 节 分 享 发 表 于 2 0 2 1 0 7 1 0 分 类 于 j a v a , i d e a p l u g i n D i s q u s : 文 档 生 成 插 件 更 多 细 节 分 享 更 多 细 节 c o d e 含 义 先 看 效 果 实 现 方 式 在 原 来 的 U s e r C o n t r o l l e r 的 基 础 上 , 再 加 一 个 方 法 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 / * * * 新 增 一 个 用 户 * * @ p a r a m u s e r E n t i t y 用 户 信 息 * @ r e t u r n 操 作 是 否 成 功 * # c o d e 1 用 户 名 已 存 在 建 议 换 个 用 户 名 再 试 * # c o d e 2 手 机 号 已 存 在 同 上 * # h i d d e n R e q u e s t u s e r I d , l a s t L o g i n T i m e * # h i d d e n R e s p o n s e t o t a l C o u n t * / @ P o s t M a p p i n g ( / a d d U s e r ) p u b l i c B a s e R e s p o n s e a d d U s e r ( @ R e q u e s t B o d y U s e r E n t i t y u s e r E n t i t y ) 其 中 ` ` # c o d e 开 头 的 注 释 便 是 关 键 , 这 应 该 是 一 目 了 然 了 吧 , 先 # c o d e ` 开 头 , 再 空 格 分 隔 c o d e 、 含 义 、 出 现 原 因 三 个 信 息 根 据 不 同 方 法 隐 藏 不 同 字 段 ( 参 数 、 返 回 值 均 可 ) 先 看 效 果 先 写 两 个 方 法 , 使 用 # h i d d e n R e q u e s t 、 # h i d d e n R e s p o n s e 设 置 要 隐 藏 的 字 段 , 这 里 注 意 方 法 参 数 变 量 名 可 以 省 略 ( 即 u s e r E n t i t y ) 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 / * * * 新 增 一 个 用 户 * * @ p a r a m u s e r E n t i t y 用 户 信 息 * @ r e t u r n 操 作 是 否 成 功 * # c o d e 1 用 户 名 已 存 在 建 议 换 个 用 户 名 再 试 * # c o d e 2 手 机 号 已 存 在 同 上 * # h i d d e n R e q u e s t u s e r I d , l a s t L o g i n T i m e * # h i d d e n R e s p o n s e t o t a l C o u n t * / @ P o s t M a p p i n g ( / a d d U s e r ) p u b l i c B a s e R e s p o n s e a d d U s e r ( @ R e q u e s t B o d y U s e r E n t i t y u s e r E n t i t y ) / * * * 修 改 用 户 信 息 * * @ p a r a m u s e r E n t i t y 用 户 信 息 * @ r e t u r n 操 作 是 否 成 功 * # h i d d e n R e q u e s t l a s t L o g i n T i m e , u s e r G e n d e r , u s e r A g e * # h i d d e n R e s p o n s e t o t a l C o u n t * / @ P o s t M a p p i n g ( / u p d a t e U s e r ) p u b l i c B a s e R e s p o n s e u p d a t e U s e r ( @ R e q u e s t B o d y U s e r E n t i t y u s e r E n t i t y ) 生 成 文 档 如 图 : 新 增 用 户 接 口 修 改 用 户 接 口 这 里 没 展 示 返 回 字 段 , 但 效 果 是 一 样 的 , 也 是 示 例 和 说 明 表 格 都 会 隐 藏 实 现 方 式 如 我 刚 提 的 , 使 用 # h i d d e n R e q u e s t 、 # h i d d e n R e s p o n s e 设 置 要 隐 藏 的 字 段 接 口 , 这 个 设 置 仅 对 文 档 生 成 , 导 出 到 P o s t m a n 起 作 用 , 不 用 担 心 影 响 代 码 运 行 。 这 里 需 要 注 意 的 点 是 , 多 个 字 段 之 间 使 用 英 文 逗 号 分 隔 。 另 外 方 法 参 数 的 变 量 名 不 需 要 带 上 , 比 如 u s e r I d , 直 接 写 u s e r I d 即 可 , 不 需 要 写 u s e r E n t i t y . u s e r I d , 因 为 S p r i n g M V C 也 是 这 么 识 别 的 , 相 应 的 我 生 成 P o s t m a n 时 就 需 要 这 么 处 理 , 最 终 干 脆 保 持 统 一 , 省 的 混 乱 ! 还 有 一 点 就 是 , 如 果 是 纯 方 法 的 参 数 , 是 不 支 持 设 置 隐 藏 的 , 原 因 如 下 : 1 . 首 先 , 如 果 不 需 要 用 到 此 参 数 , 可 直 接 删 除 , 而 不 像 对 象 , 可 能 多 个 地 方 用 到 , 所 以 需 要 根 据 方 法 定 制 的 去 隐 藏 部 分 字 段 2 . 其 次 , 其 实 我 还 提 供 了 另 一 种 方 式 隐 藏 , 甚 至 可 以 说 , 这 个 隐 藏 更 早 的 被 支 持 。 那 就 是 : 在 @ p a r a m 注 释 后 面 加 上 h i d d e n 即 可 , 如 图 : 字 段 的 更 多 注 释 既 然 刚 才 说 到 了 h i d d e n , 那 么 就 此 引 出 字 段 级 别 的 注 释 、 注 解 , 是 的 , 我 们 还 支 持 S w a g g e r 注 解 , 实 际 上 注 释 也 是 根 据 S w a g g e r 注 解 定 义 出 来 的 。 字 段 级 别 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 / * * * 测 试 字 段 上 的 注 释 有 哪 些 t a g * 字 段 注 释 说 明 是 可 以 换 行 的 * 当 然 有 个 前 提 就 是 * 最 终 负 责 渲 染 M a r k d o w n 的 引 擎 需 要 支 持 标 签 , 也 就 是 支 持 部 分 H T M L * # r e q u i r e d * # h i d d e n f a l s e * # i m p o r t a n t * # e x a m p l e 测 试 示 例 值 此 处 可 带 空 格 , 方 法 上 的 @ p a r a m 后 面 不 行 * # n o t e s 对 应 其 他 参 考 信 息 同 理 , 可 带 空 格 , 方 法 上 的 @ p a r a m 后 面 不 行 * # n o t e s 谁 说 我 不 能 换 行 的 , 只 是 没 那 么 优 雅 罢 了 * # n o t e s 不 过 也 还 凑 合 , 换 行 * / @ A p i M o d e l P r o p e r t y ( v a l u e = 这 里 是 S w a g g e r 的 字 段 说 明 \ \ n 试 试 换 行 , r e q u i r e d = t r u e , h i d d e n = f a l s e , e x a m p l e = 测 试 示 例 值 , n o t e s = 对 应 其 他 参 考 信 息 \ \ n 试 试 换 行 ) p r i v a t e S t r i n g t e s t F i e l d ; 生 成 的 示 例 如 下 : 1 2 3 4 5 6 7 8 9 u s e r I d : 0 n i c k N a m e : 用 户 昵 称 r e a l N a m e : 用 户 姓 名 p h o n e N u m b e r : 1 1 0 u s e r G e n d e r : 2 u s e r A g e : 1 0 2 4 u s e r A v a t a r : h t t p s : / / m p . w e i x i n . c o m / p / j e w a g h e i a j i f e j g i h e w j g . i f e w l a s t L o g i n T i m e : 最 近 一 次 登 录 时 间 t e s t F i e l d : 测 试 示 例 值 此 处 可 带 空 格 , 方 法 上 的 @ p a r a m 后 面 不 行 生 成 的 字 段 说 明 表 格 如 下 : 使 用 的 t a g 用 法 说 明 如 下 啥 都 不 加 直 接 写 , 支 持 换 行 , 对 应 字 段 说 明 表 格 的 含 义 r e q u i r e d 对 应 字 段 说 明 表 格 中 的 必 填 性 , 不 写 默 认 为 f a l s e ( 否 ) , 加 上 后 代 表 必 填 h i d d e n 加 上 即 隐 藏 此 字 段 , 后 面 跟 个 f a l s e 和 不 写 效 果 一 样 ( 这 个 道 理 放 到 任 何 B o o l e a n 型 t a g 都 生 效 ) i m p o r t a n t 加 上 代 表 注 释 比 注 解 优 先 级 高 ( 默 认 注 解 优 先 级 高 , 即 写 了 注 解 优 先 使 用 注 解 中 的 信 息 ) e x a m p l e 示 例 值 , 生 成 示 例 值 和 导 出 到 P o s t m a n 时 有 大 用 处 , 懂 得 都 懂 n o t e s 对 应 字 段 说 明 表 上 的 其 他 信 息 参 考 , 若 需 要 换 行 , 请 反 复 添 加 n o t e s 而 其 注 解 , 则 完 全 与 t a g 同 名 , 且 默 认 注 解 优 先 级 高 , 即 写 了 注 解 优 先 使 用 注 解 中 的 信 息 ! 还 是 推 荐 使 用 注 释 , 毕 竟 不 依 赖 于 S w a g g e r ! 这 里 顺 带 提 下 我 对 S w a g g e r 的 看 法 , 总 得 来 说 就 是 , 对 前 端 不 够 友 好 , 其 次 就 是 依 赖 于 代 码 的 运 行 , 一 旦 程 序 起 不 起 来 , 就 完 蛋 了 , 而 插 件 就 不 一 样 了 , 哪 怕 是 你 有 部 分 语 法 错 误 , 只 要 不 撞 到 参 数 的 解 析 上 , 就 没 有 关 系 , 基 本 是 确 保 方 法 声 明 不 报 错 就 O K 了 ! 而 且 运 行 一 个 w e b 程 序 , 始 终 是 需 要 时 间 的 , 而 我 这 插 件 的 运 行 , 只 能 说 是 比 飞 快 还 飞 快 ; 这 里 要 感 谢 I D E A 提 供 的 A p i , 是 I D E A 提 前 解 析 好 这 些 信 息 , 我 直 接 拿 来 用 的 , 所 以 很 快 ! 方 法 级 别 注 释 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 / * * * 查 询 用 户 信 息 ( 分 页 ) * 试 试 换 行 * # n o t e s 方 法 的 更 多 信 息 需 要 换 行 展 示 , 毕 竟 内 容 很 多 啊 * # n o t e s 这 样 看 起 来 如 何 ! * * @ p a r a m l i s t U s e r P a g e 过 滤 条 件 * @ p a r a m u s e r E n t i t i e s 没 用 的 参 数 h i d d e n * @ r e t u r n 用 户 列 表 数 据 分 页 * # h i d d e n R e q u e s t u s e r E n t i t i e s * # h i d d e n R e s p o n s e d a t a . u s e r A v a t a r * / @ P o s t M a p p i n g ( / l i s t U s e r ) p u b l i c B a s e R e s p o n s e > l i s t U s e r P a g e ( L i s t U s e r R e q u e s t l i s t U s e r P a g e , L i s t u s e r E n t i t i e s ) 文 档 效 果 图 : 啥 都 不 加 直 接 写 , 支 持 换 行 , 对 应 接 口 名 标 题 ( 不 建 议 换 行 , 不 太 好 看 ! ! ) c o d e 不 再 赘 述 h i d d e n R e q u e s t 不 再 赘 述 h i d d e n R e s p o n s e 不 再 赘 述 h i d d e n 隐 藏 此 方 法 , 则 怎 么 右 键 都 不 会 生 成 文 档 ! 批 量 生 成 时 用 于 隐 藏 单 个 , 非 常 好 使 ! i m p o r t a n t 代 表 即 使 使 用 了 @ A p i O p e r a t i o n 注 解 也 优 先 读 取 注 释 n o t e s 写 上 , 再 看 看 文 档 的 第 二 行 , 你 就 明 白 了 ! 用 于 给 方 法 添 加 更 多 说 明 , 若 需 要 换 行 , 请 反 复 添 加 n o t e s ! 1 2 3 4 5 6 7 8 9 / / 另 外 注 释 有 几 个 对 应 上 面 的 @ A p i O p e r a t i o n ( v a l u e = 类 似 啥 都 不 写 , 使 用 \ \ n 换 行 , n o t e s = 对 应 n o t e s , h i d d e n = t r u e ) / / 对 应 c o d e , 可 使 用 @ A p i R e s p o n s e s 添 加 多 个 c o d e @ A p i R e s p o n s e s ( ) / / 另 外 h i d d e n R e q u e s t / h i d d e n R e s p o n s e 不 支 持 注 解 配 置 , 必 须 使 用 注 释 咯 , 放 心 可 以 上 面 几 个 信 息 使 用 注 解 , 然 后 搭 配 注 释 中 的 h i d d e n R e q u e s t / h i d d e n R e s p o n s e , 这 是 O K 的 ! @ p a r a m 单 独 说 说 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 / * * * 删 除 一 个 用 户 * * @ p a r a m u s e r I d 用 户 i d e x a m p l e = 1 0 0 0 0 r e q u i r e d n o t e s = 更 多 信 息 试 试 换 行 * @ p a r a m o p e r a t o r 操 作 人 e x a m p l e = a d m i n r e q u i r e d * @ p a r a m d e l e t e F l a g 是 否 彻 底 删 除 h i d d e n * @ r e t u r n 操 作 是 否 成 功 * # h i d d e n R e s p o n s e t o t a l C o u n t * / @ G e t M a p p i n g ( / d e l e t e U s e r ) @ O r d e r ( 1 ) p u b l i c B a s e R e s p o n s e d e l e t e U s e r ( I n t e g e r u s e r I d , S t r i n g o p e r a t o r , B o o l e a n d e l e t e F l a g ) e l s e r e t u r n B a s e R e s p o n s e . s u c c e s s ( t r u e ) ; } 文 档 效 果 图 : 首 先 @ p a r a m u s e r I d 用 户 i d ; @ p a r a m 后 面 紧 跟 的 字 段 名 和 字 段 说 明 , 这 个 是 j a v a d o c 就 这 么 写 , 后 面 的 内 容 , 则 支 持 几 个 t a g , 如 下 h i d d e n 隐 藏 此 参 数 e x a m p l e 设 置 示 例 值 n o t e s 设 置 更 多 信 息 这 里 必 须 提 一 下 , n o t e s 说 明 , e x a m p l e 都 不 能 有 空 格 , 否 则 影 响 插 件 解 析 注 释 。 不 过 有 个 方 式 可 以 换 行 , 即 添 加 , 这 里 不 能 直 接 加 , 因 为 插 件 的 代 码 会 转 义 所 有 的 符 号 。 对 应 注 解 : 1 2 / / 除 了 n o t e s , 其 他 都 对 的 上 @ A p i P a r a m ( v a l u e = 1 , r e q u i r e d = t r u e , h i d d e n = t r u e , e x a m p l e = 2 ) 最 后 提 一 嘴 @ r e t u r n , 这 个 j a v a d o c , i d e a 敲 / * * 回 车 自 动 生 成 的 t a g , 我 也 有 解 析 , 但 一 般 情 况 还 用 不 到 , 只 有 返 回 值 是 普 通 类 型 ( 如 I n t e g e r , S t r i n g , D o u b l e , D a t e ) 时 才 会 有 效 , 这 个 大 家 试 试 就 知 道 了 ! 另 外 @ r e t u r n 不 支 持 @ p a r a m 哪 些 附 加 t a g ( 如 h i d d e n , e x a m p l e , n o t e s ) ! 类 级 别 注 释 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 / * * * 用 户 接 口 * @ d e s c r i p t i o n 用 户 接 口 * @ a u t h o r w q * # t a g s 用 户 接 口 * # h i d d e n * # i m p o r t a n t * / @ A p i ( d e s c r i p t i o n = 用 户 接 口 , t a g s = 用 户 接 口 , h i d d e n = t r u e ) @ S l f 4 j @ R e s t C o n t r o l l e r @ R e q u e s t M a p p i n g ( / a p i / v 1 / u s e r ) p u b l i c c l a s s U s e r C o n t r o l l e r 效 果 : 批 量 生 成 时 的 文 件 名 会 从 注 释 、 注 解 中 取 什 么 都 不 写 , 类 的 说 明 d e s c r i p t i o n 和 什 么 都 不 写 效 果 一 样 t a g s 参 考 S w a g g e r 的 注 解 含 义 , 代 表 对 接 口 的 分 类 , 用 来 对 应 @ A p i 注 解 的 t a g s h i d d e n 批 量 生 成 时 过 滤 此 类 i m p o r t a n t 提 高 注 释 的 优 先 级 ( 默 认 @ A p i 注 解 优 先 级 高 ) 注 解 作 用 类 似 ! 上 面 列 的 d e s c r i p t i o n , t a g s , 以 及 啥 都 不 写 , 本 质 都 用 于 批 量 生 成 接 口 时 作 为 M a r k d o w n 文 件 的 文 件 名 或 导 出 到 P o s t m a n 时 作 为 请 求 的 上 级 文 件 夹 名 称 , 优 先 级 最 高 的 是 t a g s , 这 是 考 虑 到 使 用 了 S w a g g e r 的 项 目 , 一 般 这 个 地 方 都 会 填 写 中 文 含 义 。 其 次 是 d e s c r i p t i o n 和 啥 都 不 写 , 看 谁 写 在 前 面 , 则 谁 优 先 ! 这 个 是 考 虑 到 好 多 人 使 用 j a v a d o c 写 类 注 释 的 模 板 都 是 带 有 这 个 @ d e s c r i p t i o n 用 于 描 述 改 类 的 。 啥 都 不 写 则 是 我 个 人 认 为 比 较 好 的 方 式 ! 效 果 如 图 : 总 结 以 上 所 有 我 使 用 # 开 头 的 t a g , 本 质 上 都 可 替 换 成 @ ( 除 了 @ p a r a m 、 @ r e t u r n ) , 比 如 # h i d d e n 和 @ h i d d e n 效 果 是 一 样 的 ! 其 实 @ 开 头 才 是 比 较 正 宗 的 注 释 的 t a g 写 法 , 但 太 正 宗 了 也 不 行 , I D E A 识 别 了 , 但 只 识 别 了 一 半 , 只 认 识 部 分 t a g , 这 就 是 使 得 我 们 写 的 这 些 t a g 都 要 报 个 黄 色 警 告 ( 如 果 你 打 开 了 E d i t o r = > I n s p e c t i o n s ) ; 所 以 干 脆 加 了 个 # 开 头 , 避 开 i d e a 识 别 , 合 适 的 不 得 了 ! 其 实 都 支 持 , 怎 么 用 就 看 大 家 了 , 我 个 人 偏 爱 # 开 头 ! ! ! 本 来 打 算 分 享 部 分 核 心 代 码 的 , 太 晚 了 , 算 了 , 开 源 吧 , 但 不 保 证 开 源 的 是 最 新 版 ! ! 项 目 地 址 : G i t h u b : o p e n d o c g e n e r a t o r i d e a p l u g i n 文 档 生 成 插 件 使 用 指 南 发 表 于 2 0 2 1 0 7 0 9 更 新 于 2 0 2 1 0 7 1 0 分 类 于 j a v a , i d e a p l u g i n D i s q u s : 文 档 生 成 插 件 使 用 指 南 根 据 S p r i n g M V C C o n t r o l l e r 下 方 法 生 成 接 口 文 档 先 看 示 例 代 码 U s e r C o n t r o l l e r 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 p a c k a g e c n . g u d q s . b u s i n e s s . d o c e r . c o n t r o l l e r ; i m p o r t c n . g u d q s . b u s i n e s s . d o c e r . d t o . r e q u e s t . L i s t U s e r R e q u e s t ; i m p o r t c n . g u d q s . b u s i n e s s . d o c e r . d t o . r e s p o n s e . B a s e R e s p o n s e ; i m p o r t c n . g u d q s . b u s i n e s s . d o c e r . d t o . r e s p o n s e . L i s t U s e r R e s p o n s e ; i m p o r t c n . g u d q s . u t i l . J s o n U t i l s ; i m p o r t l o m b o k . e x t e r n . s l f 4 j . S l f 4 j ; i m p o r t o r g . s p r i n g f r a m e w o r k . w e b . b i n d . a n n o t a t i o n . P o s t M a p p i n g ; i m p o r t o r g . s p r i n g f r a m e w o r k . w e b . b i n d . a n n o t a t i o n . R e q u e s t M a p p i n g ; i m p o r t o r g . s p r i n g f r a m e w o r k . w e b . b i n d . a n n o t a t i o n . R e s t C o n t r o l l e r ; i m p o r t j a v a . u t i l . A r r a y L i s t ; i m p o r t j a v a . u t i l . L i s t ; / * * * 用 户 接 口 * @ a u t h o r w q * / @ S l f 4 j @ R e s t C o n t r o l l e r @ R e q u e s t M a p p i n g ( / a p i / v 1 / u s e r ) p u b l i c c l a s s U s e r C o n t r o l l e r } B a s e R e s p o n s e 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 p a c k a g e c n . g u d q s . b u s i n e s s . d o c e r . d t o . r e s p o n s e ; i m p o r t l o m b o k . D a t a ; / * * * @ a u t h o r w q * / @ D a t a p u b l i c c l a s s B a s e R e s p o n s e T > p u b l i c s t a t i c B a s e R e s p o n s e s u c c e s s ( T d a t a ) / * * * 返 回 一 个 成 功 的 B a s e R e s p o n s e * @ p a r a m d a t a 携 带 的 数 据 * @ p a r a m t o t a l C o u n t 分 页 总 条 数 * @ r e t u r n B a s e R e s p o n s e * / p u b l i c s t a t i c B a s e R e s p o n s e s u c c e s s ( T d a t a , L o n g t o t a l C o u n t ) } L i s t U s e r R e s p o n s e 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 p a c k a g e c n . g u d q s . b u s i n e s s . d o c e r . d t o . r e s p o n s e ; i m p o r t l o m b o k . D a t a ; i m p o r t j a v a . u t i l . D a t e ; / * * * 用 户 信 息 * * @ a u t h o r w q * / @ D a t a p u b l i c c l a s s L i s t U s e r R e s p o n s e L i s t U s e r R e q u e s t 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 p a c k a g e c n . g u d q s . b u s i n e s s . d o c e r . d t o . r e q u e s t ; i m p o r t l o m b o k . D a t a ; i m p o r t l o m b o k . E q u a l s A n d H a s h C o d e ; i m p o r t j a v a . u t i l . D a t e ; / * * * 查 询 用 户 过 滤 条 件 * * @ a u t h o r w q * / @ D a t a @ E q u a l s A n d H a s h C o d e ( c a l l S u p e r = t r u e ) p u b l i c c l a s s L i s t U s e r R e q u e s t e x t e n d s B a s e P a g e R e q u e s t B a s e P a g e R e q u e s t 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 p a c k a g e c n . g u d q s . b u s i n e s s . d o c e r . d t o . r e q u e s t ; i m p o r t l o m b o k . D a t a ; / * * * @ a u t h o r w q * / @ D a t a p u b l i c c l a s s B a s e P a g e R e q u e s t 说 明 以 上 都 是 大 家 常 写 的 分 页 代 码 , 此 时 我 在 l i s t U s e r P a g e 这 个 方 法 上 右 键 , 弹 出 菜 单 中 选 择 : 生 成 A p i 接 口 文 档 ( r e s t f u l ) , 如 图 然 后 就 会 得 到 一 个 弹 框 , 当 然 如 果 你 根 据 提 示 点 了 O K , 则 直 到 下 次 重 启 , 都 不 会 再 出 现 弹 框 中 内 容 如 下 , 此 内 容 区 域 可 滚 动 预 览 , 全 选 复 制 粘 贴 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 6 7 6 8 6 9 7 0 7 1 7 2 7 3 7 4 7 5 7 6 7 7 7 8 7 9 8 0 8 1 8 2 8 3 8 4 8 5 # 查 询 用 户 信 息 ( 分 页 ) # # 请 求 信 息 # # # 请 求 地 址 h t t p : / / 1 9 2 . 1 6 8 . 0 . 1 0 4 : 8 0 8 0 / a p i / v 1 / u s e r / l i s t U s e r # # # 请 求 方 法 P O S T # # # 请 求 体 类 型 a p p l i c a t i o n / x w w w f o r m u r l e n c o d e d # # 入 参 # # # 入 参 示 例 ( P o s t m a n = = > B u l k E d i t ) j s o n p a g e N u m b e r : 1 p a g e S i z e : 2 0 s e a r c h K e y w o r d : 模 糊 搜 索 词 支 持 用 户 昵 称 , 用 户 姓 名 , 用 户 手 机 号 g e n d e r : 2 a g e S t a r t : 0 a g e E n d : 0 l o g i n T i m e S t a r t : 过 滤 登 录 时 间 范 围 开 始 l o g i n T i m e E n d : 过 滤 登 录 时 间 范 围 结 束 # # # 入 参 字 段 说 明 | * * 字 段 * * | * * 类 型 * * | * * 必 填 性 * * | * * 含 义 * * | * * 其 他 信 息 参 考 * * | | | | | | | | p a g e N u m b e r | * * I n t e g e r * * | 否 | 分 页 当 前 页 码 | | | p a g e S i z e | * * I n t e g e r * * | 否 | 分 页 分 页 大 小 | | | s e a r c h K e y w o r d | * * S t r i n g * * | 否 | 模 糊 搜 索 词 支 持 用 户 昵 称 , 用 户 姓 名 , 用 户 手 机 号 | | | g e n d e r | * * I n t e g e r * * | 否 | 用 户 性 别 0 : 保 密 1 : 男 2 : 女 | | | a g e S t a r t | * * I n t e g e r * * | 否 | 过 滤 年 龄 范 围 起 始 | | | a g e E n d | * * I n t e g e r * * | 否 | 过 滤 年 龄 范 围 结 束 | | | l o g i n T i m e S t a r t | * * D a t e * * | 否 | 过 滤 登 录 时 间 范 围 开 始 | | | l o g i n T i m e E n d | * * D a t e * * | 否 | 过 滤 登 录 时 间 范 围 结 束 | | # # 出 参 # # # 出 参 示 例 j s o n ] , t o t a l C o u n t : 0 } # # # 返 回 字 段 说 明 | * * 字 段 * * | * * 类 型 * * | * * 含 义 * * | * * 其 他 信 息 参 考 * * | | | | | | | c o d e | * * I n t e g e r * * | 否 | 状 态 码 0 : 代 表 成 功 1 : 代 表 未 知 异 常 \ \ > 0 : 代 表 已 知 异 常 | | | m e s s a g e | * * S t r i n g * * | 否 | 错 误 信 息 | | | s u c c e s s | * * B o o l e a n * * | 否 | 是 否 成 功 t r u e : 代 表 成 功 , 此 时 c o d e = 0 f a l s e : 代 表 失 败 , 此 时 c o d e ! = 0 | | | d a t a | * * L i s t \ \ * * | 否 | 返 回 数 据 | | | └ ─ n i c k N a m e | * * S t r i n g * * | 否 | 用 户 昵 称 | | | └ ─ r e a l N a m e | * * S t r i n g * * | 否 | 用 户 姓 名 | | | └ ─ p h o n e N u m b e r | * * S t r i n g * * | 否 | 用 户 手 机 号 | | | └ ─ u s e r G e n d e r | * * I n t e g e r * * | 否 | 用 户 性 别 0 : 保 密 1 : 男 2 : 女 | | | └ ─ u s e r A g e | * * I n t e g e r * * | 否 | 用 户 年 龄 | | | └ ─ u s e r A v a t a r | * * S t r i n g * * | 否 | 用 户 头 像 地 址 | | | └ ─ l a s t L o g i n T i m e | * * D a t e * * | 否 | 最 近 一 次 登 录 时 间 | | | t o t a l C o u n t | * * L o n g * * | 否 | 分 页 总 条 数 | | 由 于 文 章 本 身 就 是 M a r k d o w n 格 式 , 所 以 上 面 中 ` ` ` 我 用 代 替 , 我 用 截 图 来 展 示 下 效 果 : 截 图 使 用 C h r o m e 插 件 打 开 H T M L 滚 动 截 屏 得 到 , H T M L 是 由 t y p o r a 生 成 的 ! 总 结 如 果 有 多 个 方 法 , 想 一 次 性 生 成 , 则 可 在 U s e r C o n t r o l l e r 上 右 键 , 点 击 生 成 A p i 文 档 ( r e s t f u l ) , 如 图 : 此 时 生 成 的 文 档 , 就 是 多 个 方 法 单 独 生 成 的 文 档 的 简 单 的 拼 接 。 根 据 S p r i n g M V C C o n t r o l l e r 的 接 口 信 息 导 出 到 P o s t m a n 项 目 视 图 选 择 类 、 包 , 点 右 键 还 是 沿 用 上 面 的 代 码 , 但 是 考 虑 到 单 个 方 法 单 独 导 出 到 P o s t m a n 非 常 费 时 费 力 , 可 用 性 不 高 , 因 此 方 法 级 别 的 右 键 导 出 , 并 没 有 实 现 ! 但 是 单 个 文 件 级 别 , 还 是 O K 的 , 只 需 在 文 件 导 航 视 图 找 到 U s e r C o n t r o l l e r 类 , 右 键 , 点 击 导 出 A p i 到 P o s t m a n 即 可 ! 如 图 另 外 这 个 右 键 , 其 实 不 管 是 类 , 包 , 还 是 文 件 夹 , 乃 至 根 目 录 , 都 可 以 点 击 导 出 到 P o s t m a n , 只 是 导 出 的 范 围 不 同 ! 由 于 范 围 比 较 大 , 因 此 过 滤 了 非 @ C o n t r o l l e r 、 @ R e s t C o n t r o l l e r 注 解 的 类 , 可 放 心 使 用 。 点 击 导 出 后 , 会 将 P o s t m a n 的 j s o n 生 成 到 项 目 下 的 a p i d o c / p o s t m a n 文 件 夹 , 如 图 I m p o r t > 打 开 P o s t m a n 点 击 F i l e – > I m p o r t 此 时 我 们 打 开 P o s t m a n , 使 用 快 捷 键 C t r l + O 或 C o m m a n d + O , 接 着 拖 拽 文 件 过 去 , 或 点 击 U p l o a d F i l e s , 弹 框 选 择 文 件 打 开 , 如 图 最 终 得 到 一 个 C o l l e c t i o n 如 图 : 不 管 是 请 求 , 返 回 示 例 , 文 档 , 或 者 说 u r l 变 量 , b o d y 和 参 数 处 理 , 都 帮 你 搞 定 了 , 你 只 需 要 修 改 下 参 数 的 实 际 值 ( 如 果 使 用 # e x a m p l e , 则 这 步 也 可 以 省 略 ) , 然 后 点 蓝 色 的 S e n d 按 钮 就 o k 了 ( 千 万 别 忘 记 启 动 项 目 ) ! 这 里 简 单 说 下 , u r l 的 组 成 1 . h t t p : / / 这 个 本 地 开 发 一 般 不 用 h t t p s 对 吧 , 嘿 嘿 2 . i p : 这 个 使 用 代 码 遍 历 网 卡 , 过 滤 掉 i p v 6 , 1 2 7 . 0 . 0 . 1 后 得 出 的 局 域 网 i p , 如 果 没 搞 虚 拟 机 啥 的 , 一 般 获 取 比 较 准 确 , 要 还 是 错 了 , 点 击 C o l l e c t i o n 名 称 , 在 V a r i a b l e s 下 修 改 N a N 的 C u r r e n t V a l u e 就 好 了 3 . p o r t : 这 个 默 认 8 0 8 0 , 然 后 支 持 S p r i n g B o o t 项 目 , 即 读 取 a p p l i c a t i o n . y m l / a p p l i c a t i o n . p r o p e r t i e s 文 件 获 取 s e r v e r . p o r t 的 值 , 嗯 ~ ~ 若 存 在 a p p l i c a t i o n x x x 这 种 情 况 , 还 真 不 好 取 , 只 能 读 取 s p r i n g . p r o f i l e s . a c t i v e 但 是 也 未 必 准 确 , 毕 竟 有 很 多 地 方 支 持 设 置 。 理 论 性 i d e a 的 东 西 都 可 以 获 取 , 但 i d e a 的 插 件 开 发 文 档 找 不 到 这 方 面 的 信 息 , 大 概 是 不 会 花 精 力 搞 了 , 毕 竟 错 了 直 接 改 变 量 就 好 了 , 改 一 处 , 所 有 请 求 生 效 。 4 . 剩 下 的 部 分 就 是 C o n t r o l l e r 的 @ R e q u e s t M a p p i n g 注 解 + 方 法 的 @ R e q u e s t M a p p i n g ( 或 @ G e t M a p p i n g 之 类 ) 注 解 的 值 拼 凑 起 来 。 若 方 法 为 G E T , 则 参 数 会 以 ? x x x = x x x 来 把 T 传 给 P a g e I n f o 呢 , 解 析 会 有 问 题 吗 ? 刚 开 始 会 , 后 来 解 决 了 ! ! ! 只 能 说 我 自 己 都 快 绕 晕 了 , 但 最 终 还 是 解 决 了 。 这 其 实 值 得 复 盘 的 , 不 过 我 这 人 比 较 懒 , 就 不 搞 了 。 其 实 这 种 情 况 繁 多 的 时 候 , 要 写 代 码 不 能 只 考 虑 部 分 情 况 , 或 是 来 一 种 情 况 加 一 种 情 况 , 必 须 找 到 通 用 的 方 法 , 当 然 未 必 什 么 时 候 都 有 通 用 的 方 法 , 不 过 还 是 要 去 追 求 的 ! ! 后 续 还 会 和 大 家 分 享 一 些 我 插 件 中 的 核 心 代 码 , 包 括 i d e a 插 件 提 供 的 a p i , 自 己 百 度 找 的 工 具 类 等 等 。 另 外 我 上 面 说 的 微 服 务 那 个 接 口 文 档 , 其 实 就 是 不 带 ( r e s t f u l ) 后 缀 的 菜 单 选 项 , 其 生 产 的 文 档 不 含 有 H T T P 协 议 相 关 的 信 息 , 而 是 纯 粹 的 入 参 、 出 参 、 c o d e 含 义 等 。 另 外 文 件 视 图 右 键 有 三 个 选 项 , 另 外 另 个 就 是 批 量 生 成 M a r k d o w n 文 件 , 毕 竟 一 个 一 个 复 制 粘 贴 很 累 的 , 而 很 多 笔 记 软 件 都 支 持 批 量 导 入 M a r k d o w n 文 件 , 这 样 就 不 就 简 单 了 。 简 单 说 S p r i n g 原 理 发 表 于 2 0 2 1 0 4 0 1 分 类 于 s i m p l e p r i n c i p l e D i s q u s : 简 单 说 S p r i n g 原 理 我 先 来 , 千 万 别 较 真 , 千 万 别 较 真 , 千 万 别 较 真 ! 先 看 官 网 介 绍 哈 T h e S p r i n g F r a m e w o r k p r o v i d e s a c o m p r e h e n s i v e p r o g r a m m i n g a n d c o n f i g u r a t i o n m o d e l f o r m o d e r n J a v a b a s e d e n t e r p r i s e a p p l i c a t i o n s o n a n y k i n d o f d e p l o y m e n t p l a t f o r m . A k e y e l e m e n t o f S p r i n g i s i n f r a s t r u c t u r a l s u p p o r t a t t h e a p p l i c a t i o n l e v e l : S p r i n g f o c u s e s o n t h e “ p l u m b i n g ” o f e n t e r p r i s e a p p l i c a t i o n s s o t h a t t e a m s c a n f o c u s o n a p p l i c a t i o n l e v e l b u s i n e s s l o g i c , w i t h o u t u n n e c e s s a r y t i e s t o s p e c i f i c d e p l o y m e n t e n v i r o n m e n t s . 我 来 翻 译 一 下 , 就 是 说 ( 等 等 , 我 软 件 呢 ? 谁 动 了 啊 ! ) 额 , 就 是 说 : S p r i n g 框 架 为 任 何 类 型 的 部 署 平 台 上 的 基 于 J a v a 的 现 代 企 业 应 用 程 序 提 供 了 全 面 的 编 程 和 配 置 模 型 。 S p r i n g 的 一 个 关 键 元 素 是 在 应 用 程 序 级 别 的 基 础 架 构 支 持 : S p r i n g 专 注 于 企 业 应 用 程 序 的 “ 管 道 ” , 以 便 团 队 可 以 专 注 于 应 用 程 序 级 别 的 业 务 逻 辑 , 而 不 必 与 特 定 的 部 署 环 境 建 立 不 必 要 的 联 系 。 简 单 理 解 呢 就 是 让 你 关 注 业 务 而 非 琐 碎 的 、 无 关 紧 要 的 其 他 东 西 。 好 的 , 那 么 S p r i n g 是 怎 么 做 到 的 呢 ? 其 实 也 不 难 , 先 这 样 , 再 这 样 , 然 后 再 那 样 , 最 后 再 这 样 ( 啊 , 放 错 了 ) 其 实 也 不 难 , 主 要 是 它 有 两 大 法 宝 , 唉 , 知 道 的 同 学 肯 定 要 说 了 啊 ; 我 知 道 , I O C 、 A O P 嘛 ! 没 错 就 是 这 两 玩 意 , 哪 怕 是 还 没 内 卷 那 会 , 我 也 听 腻 了 , 今 天 我 们 就 来 唠 叨 唠 叨 这 两 玩 意 它 的 一 些 原 理 或 者 说 特 点 。 I O C 咱 先 说 这 I O C , 英 文 那 就 是 I n v e r s i o n o f C o n t r o l , 什 么 意 思 呢 ? 控 制 反 转 , 不 让 你 控 制 我 了 , 我 要 自 己 控 制 自 己 , 这 就 是 控 制 反 转 , 我 说 那 还 得 了 , 这 程 序 它 不 听 话 了 都 ! 唉 , 不 是 这 样 理 解 的 , 其 实 啊 , 这 代 表 这 程 序 , 它 成 熟 了 , 它 呀 , 可 以 自 己 干 自 己 该 干 的 事 情 了 , 不 需 要 你 管 它 了 ; 这 样 子 有 什 么 好 处 呢 ? 有 啊 , 就 像 你 家 的 熊 孩 子 , 还 小 的 时 候 , 特 别 黏 人 , 不 能 没 人 带 , 你 呢 , 总 是 需 要 找 人 帮 忙 看 看 , 自 己 才 有 空 闲 出 去 玩 , 后 来 呢 , 它 长 大 了 , 它 就 会 自 己 出 去 玩 了 , 熊 是 熊 了 点 , 但 你 也 空 闲 不 少 啊 , 有 时 间 可 以 看 看 书 , 喝 喝 茶 , 多 好 啊 ! 咱 说 回 来 啊 , 这 控 制 反 转 呢 , 就 是 让 你 少 花 费 心 思 在 这 些 地 方 , 这 样 不 就 可 以 像 官 网 说 的 “ 可 以 专 注 于 应 用 程 序 级 别 的 业 务 逻 辑 ” 了 吗 。 那 前 面 呢 , 其 实 只 是 I O C 的 一 个 思 想 , 它 不 是 一 个 实 现 , 毕 竟 啊 , 你 不 能 指 望 它 真 的 能 自 己 控 制 自 己 。 所 以 呢 , 我 们 偷 偷 引 入 一 个 东 西 , 也 就 是 容 器 , 由 这 个 容 器 来 管 理 它 。 这 个 啊 , 就 像 你 把 你 家 小 孩 送 幼 儿 园 , 你 交 钱 , 剩 下 交 给 幼 儿 园 。 那 么 说 到 这 里 啊 , 大 家 应 该 也 明 白 了 , 它 呢 , 并 不 能 自 己 控 制 自 己 , 还 是 得 靠 容 器 ; 那 么 这 个 容 器 , 又 是 何 方 神 圣 呢 ? 其 实 这 个 容 器 呢 , 也 不 难 , 名 副 其 实 , 就 是 一 个 装 东 西 的 东 西 , 有 人 说 你 套 娃 呢 ? 我 没 有 , 不 过 这 容 器 确 实 不 禁 止 你 往 容 器 放 容 器 , 比 如 父 子 容 器 , 就 像 子 容 器 塞 进 了 父 容 器 里 面 , 有 时 候 呢 , 就 会 穿 过 子 容 器 , 从 父 容 器 取 东 西 。 好 了 咱 说 回 来 , 容 器 就 是 一 存 东 西 的 , 这 东 西 很 常 见 啊 , J a v a 集 合 框 架 啊 , 大 学 学 过 , 还 学 了 好 几 个 , 我 现 在 还 记 得 , 什 么 L i s t , M a p , S e t 啥 的 。 对 ! 没 错 , 真 让 你 蒙 对 了 ! 原 理 确 实 是 这 个 , 这 个 东 西 呢 , 选 来 选 取 , 我 们 就 选 M a p 吧 。 众 所 周 知 , M a p 是 数 组 + 链 表 为 底 层 实 现 的 键 值 对 容 器 啊 , 因 为 有 这 个 键 值 对 的 存 在 呢 , 我 们 就 可 以 非 常 准 确 无 误 的 存 放 和 读 取 , 就 像 银 行 账 户 吧 , 你 往 你 账 户 存 钱 , 再 从 你 账 户 就 能 取 到 之 前 存 的 钱 , 非 常 有 效 的 避 免 了 “ 乱 拿 乱 放 ” 问 题 。 好 的 , 那 我 们 就 说 完 了 容 器 的 第 一 个 特 点 , 就 是 能 存 能 取 , 这 时 候 你 就 会 说 , 这 不 废 话 吗 ? 啊 确 实 ! 行 , 我 们 整 点 正 常 的 特 点 , 那 其 实 接 下 来 要 说 的 特 点 呢 , 都 是 围 绕 着 取 这 个 动 作 的 。 其 实 上 面 的 特 点 呢 , 说 的 不 是 特 别 清 晰 , 这 存 的 是 什 么 ? 取 的 又 是 什 么 ? 总 不 可 能 和 银 行 一 样 , 都 是 钱 吧 ! 当 然 不 是 , 这 存 的 呢 , 一 般 是 C l a s s 。 什 么 是 C l a s s ? C l a s s 就 是 一 设 计 图 , 照 着 这 个 设 计 图 呢 , 容 器 D u a n g 的 一 下 , 就 给 了 一 个 对 象 ! 你 说 还 有 这 好 事 ? 写 个 代 码 还 有 对 象 领 ? 不 是 的 , 这 个 对 象 呢 , 不 是 那 个 对 象 哈 , 这 个 呢 , 是 J a v a 实 例 化 出 来 的 对 象 , 用 来 调 用 方 法 , 获 取 字 段 的 。 那 么 也 就 是 说 , 这 个 容 器 , 它 还 是 个 工 厂 ? 它 还 能 生 产 对 象 呢 ! 没 错 , 但 严 格 说 对 象 其 实 也 不 是 它 生 产 的 , 对 象 呢 , 其 实 是 J V M 生 产 的 对 不 对 ? 它 呢 , 就 负 责 加 工 , 所 以 说 , 其 实 也 就 是 个 加 工 工 厂 。 所 以 咱 这 第 二 个 特 点 呢 , 就 是 工 厂 , 能 照 着 设 计 图 加 工 一 个 对 象 出 来 。 你 肯 定 要 说 啦 , 这 有 啥 用 , 这 不 产 生 中 间 商 差 价 了 , 我 直 接 找 J V M 爸 爸 行 不 行 ? 别 急 , 可 以 是 可 以 , 但 咱 用 这 个 东 西 , 就 一 点 有 它 的 用 处 , 对 不 对 ? 这 不 , 第 三 个 特 点 就 来 了 ! 那 么 聪 明 的 小 伙 伴 呢 , 肯 定 已 经 知 道 我 要 讲 什 么 了 ? 对 , 没 错 ! 就 是 依 赖 注 入 , 前 面 说 了 C l a s s 是 一 个 设 计 图 , 但 没 说 清 楚 , 这 个 设 计 图 呢 , 它 只 是 一 个 小 零 件 的 设 计 图 , 但 和 真 正 的 零 件 设 计 图 还 是 有 一 些 不 一 样 的 , 比 方 说 啊 , 它 会 告 诉 你 它 与 另 一 个 零 件 的 关 系 , 有 了 这 个 关 系 呢 , 工 厂 的 作 用 就 有 了 , 工 厂 生 产 到 一 半 , 发 现 这 个 零 件 要 加 工 好 啊 , 还 需 要 另 一 个 零 件 , 那 它 又 转 头 去 生 产 另 一 个 零 件 ( 是 不 是 非 常 不 科 学 , 不 应 该 先 批 量 生 产 出 来 , 之 后 再 一 起 组 装 吗 ? ) , 生 产 好 了 呢 , 又 回 过 来 按 设 计 图 把 另 一 个 零 件 加 到 这 个 零 件 上 去 。 如 果 生 产 另 一 个 零 件 的 时 候 发 现 , 也 依 赖 另 外 某 个 零 件 , 那 也 照 旧 , 先 生 产 依 赖 的 。 这 时 候 你 肯 定 会 说 了 , 套 娃 就 算 了 , 万 一 你 依 赖 我 , 我 依 赖 你 , 那 不 无 限 套 娃 了 吗 ? 这 个 问 题 呢 ? 有 办 法 解 决 , 但 是 这 文 章 太 短 了 , 我 写 不 下 ! ( 请 叫 我 费 马 · 心 累 ) 最 后 说 下 容 器 的 另 一 个 特 点 , 其 实 都 是 层 层 递 进 的 , 你 甚 至 可 以 认 为 , 只 有 一 个 特 点 , 都 行 , 看 你 怎 么 看 ! 这 个 特 点 呢 就 是 插 件 D I Y ! 之 前 咱 也 说 了 , 工 厂 呢 , 不 搞 生 产 , 光 做 加 工 了 , 那 这 个 加 工 过 程 啊 , 除 了 依 赖 注 入 啊 , 一 些 属 性 配 置 注 入 这 样 的 通 过 配 置 的 方 式 去 影 响 对 象 , 能 不 能 开 放 一 个 接 口 , 我 想 怎 么 D I Y , 自 己 写 代 码 来 实 现 呢 ? 当 时 是 可 以 的 啊 ! 这 样 的 接 口 呢 , S p r i n g 早 就 准 备 好 了 , 您 呢 , 只 需 要 实 现 这 个 接 口 , 写 点 代 码 , 再 把 它 放 到 容 器 里 面 去 , 工 厂 呢 , 就 会 在 合 适 的 时 机 执 行 你 的 代 码 。 而 且 他 这 个 接 口 呢 , 一 共 有 好 几 个 , 每 个 接 口 呢 , 也 好 好 几 个 方 法 , 每 个 方 法 啊 , 都 是 代 表 了 相 应 的 时 机 。 这 时 候 你 就 要 问 了 , 这 有 什 么 用 呢 ? 别 急 , 咋 看 看 S p r i n g 怎 么 用 的 ! ( 再 多 嘴 一 句 啊 , 干 预 加 工 过 程 算 什 么 , 干 预 工 厂 本 身 才 牛 逼 呢 ! 我 说 的 啥 , 懂 得 都 懂 ! ) A O P S p r i n g 的 A O P 啊 , 终 于 说 到 了 , 其 实 呢 , 就 是 干 预 加 工 过 程 的 一 个 产 物 ! 著 名 历 史 事 件 狸 猫 换 太 子 大 家 都 听 过 吧 , A O P 呢 , 那 是 一 模 一 样 。 著 名 的 曹 操 挟 天 子 以 令 诸 侯 都 听 过 吧 , A O P 呢 , 还 是 一 模 一 样 ! 这 两 个 呢 , 一 个 是 说 的 A O P 的 实 现 原 理 , 另 一 个 说 的 , 就 是 它 的 特 点 : 把 真 正 的 对 象 当 傀 儡 使 ! 咱 先 说 说 实 现 原 理 啊 , 其 实 也 不 难 ( 请 问 这 是 第 几 遍 ? ) , 工 厂 都 被 咱 劫 持 了 , 加 工 的 时 候 , 得 到 成 品 了 的 时 候 , 做 一 个 壳 子 : 代 理 对 象 , 把 真 正 的 对 象 装 进 去 , 这 样 呢 , 有 什 么 方 法 被 调 用 , 都 是 先 到 代 理 对 象 这 里 , 代 理 对 象 呢 , 操 纵 着 真 正 的 对 象 , 心 情 好 了 , 就 执 行 一 下 真 正 的 对 象 对 应 的 方 法 , 得 到 劳 动 果 实 后 呢 , 再 返 回 出 去 , 谁 也 不 知 道 真 正 的 对 象 。 就 好 像 光 听 着 收 音 机 , 不 知 道 的 还 以 为 声 音 都 是 收 音 机 生 产 的 , 其 实 那 就 是 个 代 理 , 真 正 创 造 声 音 的 人 , 远 在 天 涯 呢 ! 所 以 说 啊 , A O P 的 特 点 是 不 是 如 我 所 言 呢 ! O K 各 位 , 这 就 是 这 期 文 章 的 全 部 内 容 啦 , 非 常 感 谢 你 能 看 到 这 里 , 如 果 你 觉 得 写 的 还 不 错 的 话 , 求 赞 , 求 收 藏 , 求 硬 币 ( 这 啥 玩 意 ) , 求 转 发 , 最 重 要 的 是 点 个 大 大 的 关 注 ! 你 的 支 持 就 是 我 做 文 章 的 最 大 动 力 ! O K 各 位 , 我 们 下 期 再 见 ! ( 动 作 指 导 : 何 同 学 ) J V M 底 层 探 秘 笔 记 发 表 于 2 0 2 1 0 2 0 4 更 新 于 2 0 2 1 0 3 2 8 分 类 于 i n t e r v i e w , j v m D i s q u s : J V M 底 层 探 秘 笔 记 J V M 速 记 什 么 是 J V M ? J V M 就 是 由 编 译 器 , 类 加 载 器 , 执 行 引 擎 , 运 行 时 数 据 区 组 成 . 其 中 数 据 区 包 含 堆 , 栈 , 本 地 方 法 栈 , 方 法 区 和 程 序 计 数 器 ( P C 寄 存 器 ) , 其 中 栈 是 由 局 部 变 量 表 , 操 作 数 栈 , 动 态 链 接 , 返 回 地 址 组 成 的 . 你 是 怎 么 对 j v m 垃 圾 回 收 进 行 优 化 的 ? 根 据 服 务 器 的 配 置 , 调 整 青 年 代 和 老 年 代 的 内 存 大 小 及 比 例 , 在 回 收 频 率 和 回 收 速 度 上 做 取 舍 , 使 用 G 1 垃 圾 回 收 期 控 制 S T W 停 顿 时 间 , 提 高 吞 吐 量 . J V M 内 存 模 型 每 个 线 程 有 自 己 的 内 存 区 域 , 多 线 程 之 间 通 信 主 要 通 过 共 享 内 存 来 实 现 . 有 序 性 : 在 C P U 执 行 指 令 时 , 可 能 会 对 非 h a p p e n s b e f o r e 指 令 进 行 重 排 , 优 化 执 行 效 率 . 在 单 线 程 情 况 , 往 往 不 会 产 生 问 题 , 但 涉 及 多 线 程 时 , 可 能 导 致 b u g . 可 见 性 : 一 个 线 程 修 改 了 一 个 共 享 变 量 , 另 一 个 线 程 不 会 知 道 这 个 改 变 , 这 就 是 不 可 见 , 要 确 保 可 见 性 , 一 般 使 用 v o l a t i l e 关 键 词 , 当 然 , 加 锁 也 可 以 . 原 子 性 : 即 对 于 某 代 码 , 实 际 执 行 时 会 分 为 好 几 个 原 子 指 令 , 确 保 原 子 性 必 须 加 锁 ( 如 s y n c h r o n i z e d ) 处 理 1 2 3 4 5 h a p p e n s b e f o r e : 读 后 写 写 后 写 锁 后 解 锁 可 传 递 性 多 线 程 线 程 是 一 个 进 程 中 的 不 同 执 行 路 径 , 一 个 进 程 至 少 有 一 个 主 线 程 . 进 程 是 一 个 程 序 的 抽 象 , 一 个 程 序 运 行 后 一 般 为 一 个 进 程 . 线 程 状 态 : 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 . N e w ( 新 建 ) 2 . R u n n a b l e ( 就 绪 ) 3 . R u n n i n g ( 运 行 中 ) 4 . B l o c k e d ( 阻 塞 ) 5 . W A I T I N G ( 等 待 ) 6 . T I M E D _ W A I T I N G ( 超 时 等 待 ) 7 . D e a d ( 死 亡 ) [ t : t h r e a d 对 象 , o b j : 同 步 块 中 的 对 象 ] N e w : n e w T h r e a d ( ) R u n n a b l e : t . s t a r t ( ) , t . y i e l d ( ) R u n n i n g : a f t e r t . s t a r t ( ) a n d c p u r u n i t B l o c k e d : w h e n e n t e r s y n c h r o n i z e d b l o c k W A I T I N G : o b j . w a i t ( ) , t . j o i n ( ) , L o c k S u p p o r t . p a r k ( ) T I M E D _ W A I T I N G : T h r e a d . s l e e p ( x ) , o b j . w a i t ( x ) , t . j o i n ( x ) D e a d : w h e n t . r u n ( ) i s o v e r J V M 对 象 结 构 对 象 头 : 存 储 对 象 运 行 时 数 据 和 类 型 指 针 M a r k W o r d : 运 行 时 数 据 标 志 位 为 0 1 未 锁 定 : 对 象 h a s h 码 , 对 象 分 代 年 龄 标 志 位 为 0 0 轻 量 级 锁 定 : 指 向 锁 记 录 的 指 针 标 志 位 为 1 0 重 量 级 锁 定 : 执 行 重 量 级 锁 的 指 针 标 志 位 为 1 1 G C 标 记 : 空 , 不 需 要 记 录 信 息 标 志 位 为 0 1 可 偏 向 : 偏 向 线 程 I D 、 偏 向 时 间 戳 、 对 象 分 代 年 龄 类 型 指 针 : 指 向 对 象 的 类 的 元 数 据 的 指 针 [ 数 组 长 度 ] : 若 对 象 时 数 组 , 则 会 保 存 数 组 长 度 实 例 数 据 : 保 存 字 段 内 容 , 包 括 父 级 对 齐 : 确 保 8 字 节 , 凑 整 垃 圾 回 收 标 记 算 法 引 用 计 数 法 : 通 过 计 算 对 象 的 引 用 数 来 判 断 对 象 是 否 可 回 收 . 缺 点 是 无 法 处 理 循 环 引 用 的 问 题 . 可 达 性 分 析 算 法 : 从 根 对 象 ( 两 个 栈 引 用 的 对 象 、 静 态 属 性 引 用 的 对 象 、 常 量 引 用 的 对 象 ) 出 发 , 寻 找 所 有 引 用 的 对 象 , 形 成 根 对 象 的 引 用 链 , 判 断 对 象 是 否 与 根 对 象 的 引 用 链 相 关 联 来 决 定 对 象 是 否 可 回 收 . 回 收 算 法 标 记 清 除 算 法 : 标 记 后 直 接 清 除 , 效 率 低 , 产 生 内 存 碎 片 标 记 复 制 算 法 : 需 要 两 个 大 小 相 同 的 内 存 区 域 , 其 中 一 块 保 持 空 闲 , 先 标 记 可 用 对 象 , 然 后 将 可 用 对 象 复 制 到 空 闲 区 域 , 再 清 空 整 块 内 存 , 使 其 满 足 一 块 保 持 空 闲 , 如 此 循 环 即 可 . 标 记 整 理 算 法 : 标 记 后 移 动 内 存 , 令 内 存 使 用 的 区 域 与 未 使 用 的 区 域 均 无 碎 片 , 缺 点 是 效 率 低 , 有 的 是 空 间 占 用 少 . 分 代 算 法 : 将 堆 分 为 新 生 代 与 老 年 代 , 根 据 自 个 区 域 的 特 定 采 用 不 同 的 回 收 算 法 . 新 生 代 又 分 为 E d e n 区 ( 复 制 算 法 ) 、 S u r v i v o r 区 ( 因 使 用 复 制 算 法 , 分 为 F r o m 、 T o 两 块 内 存 区 域 ) . 回 收 器 ( 前 3 个 Y o u n g G C 使 用 , 后 面 的 F u l l G C 使 用 ) S e r i a l : 单 线 程 , 使 用 复 制 算 法 , 整 个 过 程 一 直 S T W P a r N e w : 多 线 程 , 使 用 复 制 算 法 , 还 是 一 直 S T W P a r a l l e l S c a v e n g e : 多 线 程 , 使 用 复 制 算 法 , 与 P a r N e w 不 同 之 处 在 于 其 关 注 吞 吐 量 , 并 可 通 过 调 节 参 数 对 吞 吐 量 进 行 控 制 S e r i a l O l d : 单 线 程 , 使 用 标 记 整 理 算 法 , 老 年 代 使 用 P a r a l l e l O l d : 多 线 程 , 使 用 标 记 整 理 算 法 , 与 P a r a l l e l S c a v e n g e 一 样 , 关 注 吞 吐 量 。 C M S : 多 线 程 , 使 用 标 记 清 除 算 法 , 其 步 骤 为 : 初 始 标 记 ( S T W ) 并 发 标 记 重 新 标 记 ( S T W ) 清 除 , 具 有 低 停 顿 的 性 质 , 缺 点 是 占 用 C P U 资 源 严 重 , 且 产 生 内 存 碎 片 , 整 理 内 存 碎 片 依 旧 会 S T W G 1 : 多 线 程 , 与 C M S 类 似 , 使 用 标 记 整 理 算 法 , 步 骤 为 : 初 始 标 记 ( S T W ) 并 发 标 记 最 终 标 记 ( S T W ) 筛 选 清 除 ( 可 控 制 停 顿 时 间 ) , 其 优 点 是 引 入 R e g i o n 概 念 , 优 先 清 理 垃 圾 更 多 的 R e g i o n 对 象 分 配 策 略 对 象 优 先 在 E d e n 去 分 配 大 对 象 直 接 进 入 老 年 代 长 期 存 活 的 对 象 将 进 入 老 年 代 , 可 配 置 多 少 岁 进 入 ( 默 认 1 5 岁 ) , 熬 过 一 次 M i n o r G C 涨 一 岁 动 态 对 象 年 龄 判 定 , S u r v i v o r 区 空 间 中 相 同 年 龄 所 有 对 象 大 小 的 总 和 大 于 空 间 的 一 半 , 则 年 龄 大 于 或 等 于 该 年 龄 的 对 象 直 接 进 入 老 年 代 ; 空 间 分 配 担 保 , 即 防 止 新 生 代 的 对 象 大 量 存 活 时 , S u r v i v o r 区 装 不 下 , 则 需 要 判 定 老 年 代 是 否 还 有 足 够 大 的 连 续 空 间 ( 大 于 新 生 代 E d e n 区 或 开 启 参 数 则 取 历 代 存 活 平 均 值 ) , 若 有 则 可 无 需 F u l l G C , 反 之 需 要 F u l l G C J V M 详 记 组 成 图 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 g r a p h L R R ( J V M ) A ( 编 译 器 ) B ( 类 加 载 器 ) C ( 执 行 引 擎 ) D ( 运 行 时 数 据 区 ) D 1 ( 堆 ) D 2 ( 栈 ) D 3 ( 本 地 方 法 栈 ) D 4 ( 方 法 区 ) D 5 ( 程 序 计 数 器 P r o g r a m C o u n t R e g i s t e r ) D 2 A ( 局 部 变 量 表 ) D 2 B ( 操 作 数 栈 ) D 2 C ( 动 态 链 接 ) D 2 D ( 返 回 地 址 ) R A R B R C R D D D 1 D D 2 D D 3 D D 4 D D 5 D 2 D 2 A D 2 D 2 B D 2 D 2 C D 2 D 2 D 概 念 J V M : 编 译 器 : 对 J a v a 代 码 做 优 化 , 并 将 代 码 中 结 构 、 数 据 、 实 际 代 码 编 译 成 字 节 码 。 类 加 载 器 : 类 加 载 过 程 : 加 载 ( 把 字 节 码 二 进 制 流 加 载 到 方 法 区 , 如 文 件 到 内 存 ) 、 验 证 ( 文 件 格 式 、 元 数 据 合 法 性 、 字 节 码 指 令 等 的 校 验 ) 、 准 备 ( 静 态 变 量 分 配 内 存 、 初 始 化 零 值 ) 、 解 析 ( 字 符 符 号 引 用 解 析 成 直 接 引 用 ) 、 初 始 化 ( 执 行 生 成 的 c i n i t 方 法 , 里 面 是 对 静 态 变 量 的 赋 值 指 令 和 s t a t i c 块 代 码 ) n e w 对 象 过 程 : 先 进 行 类 加 载 ( 若 未 加 载 ) , 接 着 为 对 象 分 配 内 存 ( 内 存 大 小 是 固 定 的 ) , 接 着 讲 内 存 空 间 的 字 段 值 初 始 化 为 零 值 ( 即 内 存 中 的 值 都 是 根 据 字 段 类 型 所 对 应 的 默 认 值 ) , 对 对 象 进 行 必 要 的 设 置 ( 如 与 类 信 息 绑 定 , 对 象 头 的 数 据 初 始 化 等 ) , 到 此 , 一 个 对 象 产 生 了 , 然 后 再 执 行 它 的 i n i t 方 法 ( 构 造 方 法 ) 就 o k 了 . 执 行 引 擎 : 主 要 负 责 方 法 的 分 派 , 执 行 指 令 控 制 操 作 数 栈 。 运 行 时 数 据 区 : 堆 : 最 大 的 内 存 区 域 , 线 程 共 享 , 主 要 用 于 存 放 对 象 实 例 数 据 , 由 于 垃 圾 回 收 的 原 因 , 也 可 分 为 新 年 代 与 老 年 代 , 新 年 代 具 体 可 分 为 E d e n 区 , F r o m S u r v i v o r 区 , T o S u r v i o v r 区 . 本 地 方 法 栈 : 与 栈 功 能 类 似 , 但 服 务 于 N a t i v e 方 法 , 而 N a t i v e 方 法 使 用 何 种 语 言 实 现 由 具 体 虚 拟 机 实 现 . 方 法 区 : 用 于 存 储 加 载 的 类 信 息 、 常 量 、 静 态 变 量 等 , 线 程 共 享 . 程 序 计 数 器 P r o g r a m C o u n t R e g i s t e r : 一 块 较 小 的 内 存 空 间 , 线 程 私 有 . 存 储 线 程 所 执 行 的 字 节 码 指 令 的 行 号 , 分 支 、 循 环 、 跳 转 、 异 常 处 理 、 线 程 恢 复 等 功 能 都 需 要 依 赖 此 内 存 . 当 运 行 本 地 方 法 时 , 值 为 空 . 栈 : 是 J a v a 方 法 执 行 的 内 存 模 型 , 线 程 私 有 , 生 命 周 期 与 线 程 相 同 , 每 个 方 法 执 行 时 会 创 建 一 个 栈 桢 , 方 法 的 调 用 和 结 束 对 应 着 栈 桢 的 入 栈 和 出 栈 . ( 总 结 : 栈 像 个 集 合 , 存 储 着 每 个 方 法 的 栈 桢 ) ( 以 下 属 于 栈 桢 ) 局 部 变 量 表 : 一 组 变 量 值 存 储 空 间 , 用 于 存 放 方 法 参 数 和 方 法 内 部 定 义 的 局 部 变 量 操 作 数 栈 : 是 一 个 后 入 先 出 的 栈 , 数 据 的 写 入 与 写 出 都 由 字 节 码 指 令 控 制 , 一 开 始 是 空 的 ; 这 很 像 C P U 的 操 作 动 态 链 接 : 指 向 运 行 时 常 量 池 中 该 栈 桢 所 属 方 法 的 引 用 , 为 了 支 持 方 法 调 用 过 程 中 的 动 态 链 接 。 方 法 出 口 ( 返 回 地 址 ) : 提 供 用 于 回 到 方 法 被 调 用 的 位 置 的 地 址 , 一 般 为 进 入 前 P C 计 数 器 中 的 值 。 总 结 : 编 译 J a v a 源 代 码 , 创 建 内 存 并 划 分 区 域 , 加 载 类 字 节 码 , 从 入 口 开 始 执 行 指 令 , 本 质 上 , 所 有 的 执 行 都 是 方 法 直 接 的 组 合 或 嵌 套 而 成 , 因 此 最 终 所 有 的 指 令 , 都 在 方 法 栈 执 行 , 也 就 是 操 作 数 栈 . 所 以 需 要 了 解 常 用 的 指 令 , 如 内 存 相 关 , 锁 相 关 , 方 法 跳 转 , 指 令 间 跳 转 ( i f / f o r ) . 指 令 ( 操 作 数 栈 ) 字 节 码 与 数 据 类 型 i 开 头 代 表 对 i n t 类 型 的 数 据 操 作 l 开 头 代 表 对 l o n g 类 型 的 数 据 操 作 s 开 头 代 表 对 s h o r t 类 型 的 数 据 操 作 b 开 头 代 表 对 b y t e 类 型 的 数 据 操 作 c 开 头 代 表 对 c h a r 类 型 的 数 据 操 作 f 开 头 代 表 对 f l o a t 类 型 的 数 据 操 作 d 开 头 代 表 对 d o u b l e 类 型 的 数 据 操 作 a 开 头 代 表 对 r e f e r e n c e 类 型 的 数 据 操 作 加 载 和 存 储 指 令 讲 一 个 局 部 变 量 加 载 到 操 作 栈 : i l o a d 、 i l o a d _ 即 l o a d 将 一 个 数 值 从 操 作 数 栈 存 储 到 局 部 变 量 表 : i s t o r e 、 i s t o r e _ 即 s t o r e 将 一 个 常 量 加 载 到 操 作 数 栈 : b i p u s h 、 s i p u s h 、 l d c 扩 充 局 部 变 量 表 的 访 问 所 以 的 指 令 : w i d e 运 算 指 令 加 法 ( i a d d 、 l a d d ) 、 减 法 ( i s u b 、 l s u b ) 、 乘 法 ( i m u l 、 l m u l ) 、 除 法 ( i d i v 、 l d i v ) 、 求 余 ( i r e m 、 l r e m ) 取 反 ( i n e g 、 l n e g ) 、 位 移 ( i s h l 、 i s h r 、 i u s h r ) 、 按 位 或 ( i o r 、 l o r ) 、 按 位 与 ( i a n d 、 l a n d ) 、 按 位 异 或 ( i x o r 、 l x o r ) 局 部 变 量 自 增 指 令 ( i i n c ) 比 较 指 令 ( d c m p g 、 d c m p l 、 f c m p g 、 f c m p l ) 类 型 转 换 指 令 宽 化 不 需 要 转 换 ( 隐 式 ) 宅 化 有 i 2 b 、 i 2 c 、 i 2 s 、 l 2 i 、 f 2 i 、 f 2 l 、 d 2 i 、 d 2 l 、 d 2 f 对 象 创 建 于 访 问 指 令 创 建 实 例 的 指 令 : n e w 创 建 数 组 的 指 令 : n e w a r r a y 、 a n e w a r r a y 、 m u l t i a n e w a r r a y 访 问 类 字 段 ( s t a t i c 字 段 ) 和 实 例 字 段 的 指 令 : g e t f i e l d 、 p u t f i e l d 、 g e t s t a t i c 、 p u t s t a t i c 把 一 个 数 组 元 素 度 加 载 到 操 作 数 栈 : b a l o a d 、 c a l o a d 、 s a l o a d ; 即 a l o a d 将 一 个 操 作 数 栈 的 值 存 储 到 数 组 元 素 中 的 指 令 : b a s t o r e 、 c a s t o r e 、 s a s t o r e 、 即 a s t o r e 取 数 组 长 度 的 指 令 : a r r a y l e n g t h 检 查 类 实 例 类 型 的 指 令 : i n s t a n c e o f 、 c h e c k c a s t 操 作 数 栈 管 理 指 令 将 操 作 数 栈 的 站 定 一 个 或 两 个 元 素 出 栈 : p o p 、 p o p 2 复 制 栈 顶 一 个 或 两 个 数 值 并 将 复 制 值 或 双 份 复 制 值 重 新 压 入 栈 顶 : d u p 、 d u p 2 、 d u p _ x 1 、 d u p 2 _ x 1 将 栈 顶 最 顶 端 的 两 个 值 互 换 : s w a p 控 制 转 移 指 令 条 件 分 支 : i f e q 、 i f l t 、 i f l e 、 i f n e 、 i f g t 、 i f g e 、 i f n u l l 、 i f n o n n u l l 、 i f _ i c m p e q … 复 合 条 件 分 支 : t a b l e s w i t c h 、 l o o k u p s w i t c h 无 条 件 分 支 : g o t o 、 g o t o _ w 、 j s r 、 j s r _ w 、 r e t 方 法 调 用 和 返 回 指 令 i n v o k e v i r t u a l 调 用 对 象 的 实 例 方 法 , 根 据 对 象 的 实 际 类 型 进 行 分 派 i n v o k e i n t e r f a c e 调 用 接 口 方 法 , 搜 索 实 现 了 接 口 方 法 的 对 象 , 找 出 适 合 的 方 法 调 用 i n v o k e s p e c i a l 调 用 一 些 需 要 特 殊 处 理 的 方 法 , 包 括 实 例 初 始 化 方 法 、 私 有 方 法 、 父 类 方 法 i n v o k e s t a t i c 调 用 静 态 方 法 ( s t a t i c 方 法 ) i n v o k e d y n a m i c 指 令 用 于 在 运 行 时 动 态 解 析 出 调 用 点 限 定 符 所 引 用 的 方 法 返 回 指 令 i r e t u r n 、 l r e t u r n 、 f r e t u r n 、 d r e t u r n 、 a r e t u r n 、 r e t u r n ( v o i d 返 回 值 时 ) 异 常 处 理 指 令 a t h r o w ; 其 他 异 常 由 涉 及 的 指 令 抛 出 ; 另 外 c a t c h 不 是 由 字 节 码 指 令 实 现 , 而 是 采 用 异 常 表 同 步 指 令 m o n i t o r e n t e r 以 栈 顶 元 素 作 为 锁 开 始 同 步 m o n i t o r e x i t 推 出 同 步 类 文 件 结 构 魔 数 0 x C A F E B A B E 和 主 版 本 号 ( 判 断 兼 容 性 ) 常 量 池 文 本 字 符 串 声 明 为 f i n a l 的 常 量 值 类 和 接 口 的 全 限 定 名 字 段 的 名 称 和 描 述 符 方 法 的 名 称 和 描 述 符 常 量 池 类 型 : 字 符 , 字 段 , 方 法 , 类 名 , 普 通 类 型 常 量 字 符 串 C O N S T A N T _ U t f 8 _ i n f o : t a g u 1 , l e n g t h u 2 , b y t e s , u 1 [ ] I n t e g e r , F l o a t , D o u b l e , S t r i n g 类 C O N S T A N T _ C l a s s _ i n f o : t a g u 1 , i n d e x u 2 ( 指 向 字 符 串 ) C O N S T A N T _ N a m e A n d T y p e _ i n f o : t a g u 1 , i n d e x u 2 , i n d e x u 2 字 段 C O N S T A N T _ F i e l d r e f _ i n f o : t a g u 1 , i n d e x u 2 ( 指 向 C O N S T A N T _ C l a s s _ i n f o ) , i n d e x u 2 ( 指 向 C O N S T A N T _ N a m e A n d T y p e _ i n f o ) 字 段 C O N S T A N T _ M e t h o d r e f _ i n f o : t a g u 1 , i n d e x u 2 ( 指 向 C O N S T A N T _ C l a s s _ i n f o ) , i n d e x u 2 ( 指 向 C O N S T A N T _ N a m e A n d T y p e _ i n f o ) 访 问 标 识 : 两 个 字 节 , 标 识 类 还 是 接 口 , 是 否 p u b l i c , 是 否 f i n a l , 是 否 a b s t r a c t , 是 否 注 解 , 枚 举 … 类 索 引 、 父 类 索 引 、 接 口 索 引 集 合 : 都 是 C O N S T A N T _ C l a s s _ i n f o , 其 实 就 是 全 限 定 名 字 段 表 集 合 : 由 多 个 字 段 表 组 成 , 下 面 为 字 段 表 的 构 成 a c c e s s _ f l a g s 字 段 修 饰 符 : 描 述 字 段 是 否 p u b l i c , 是 否 p r i v a t e , 是 否 p r o t e c t e d 等 等 n a m e _ i n d e x 字 段 的 简 单 名 称 d e s c r i p t o r _ i n d e x 字 段 的 数 据 类 型 , 如 B ( b y t e ) 、 C ( c h a r ) 、 D ( d o u b l e ) 、 F ( f l o a t ) 、 L ( 对 象 类 型 ) 、 [ L ( 对 象 数 组 类 型 ) a t t r i b u t e _ i n f o 字 段 的 额 外 信 息 , 如 字 段 为 常 量 时 会 含 有 额 外 信 息 方 法 表 集 合 : 有 多 个 方 法 表 组 成 , 下 面 为 方 法 表 的 构 成 a c c e s s _ f l a g s 方 法 修 饰 符 : 修 饰 方 法 是 否 为 p u b l i c 、 是 否 为 p r i v a t e 、 是 否 为 s t a t i c 、 是 否 s y n c h r o n i z e d 等 等 n a m e _ i n d e x 方 法 的 简 单 名 称 d e s c r i p t o r _ i n d e x 方 法 的 参 数 类 型 和 返 回 值 类 型 , 先 参 数 , 后 返 回 值 , 且 参 数 被 括 号 包 围 , 如 ( ) V 、 ( L L D F ) L a t t r i b u t e _ i n f o 方 法 的 额 外 信 息 , 里 面 有 名 为 C o d e 的 属 性 , 存 放 方 法 代 码 编 译 成 的 字 节 码 指 令 属 性 表 集 合 : 类 、 字 段 和 方 法 的 额 外 信 息 存 放 处 , 类 型 有 方 法 表 的 C o d e : 字 段 表 的 C o n s t a n t V a l u e 方 法 表 的 异 常 信 息 E x c e p t i o n s 类 中 的 内 部 类 I n n e r C l a s s e s 源 码 行 号 与 字 节 码 行 号 的 对 应 关 系 L i n e N u m b e r T a b l e 栈 桢 中 局 部 变 量 表 中 变 量 与 J a v a 源 码 定 义 变 量 直 接 的 关 系 L o c a l V a r i a b l e T a b l e 泛 型 的 签 名 信 息 S i g n a t u r e 类 加 载 过 程 加 载 通 过 一 个 类 的 全 限 定 名 来 获 取 定 义 此 类 的 二 进 制 字 节 流 将 这 个 字 节 流 所 代 表 的 惊 天 存 储 结 构 转 化 为 方 法 区 的 运 行 时 数 据 结 构 在 内 存 中 生 成 一 个 代 表 这 个 类 的 j a v a . l a n g . C l a s s 对 象 , 作 为 方 法 区 这 个 类 的 各 种 数 据 的 访 问 入 口 验 证 文 件 格 式 验 证 ( 如 魔 数 , 版 本 号 、 常 量 的 类 型 等 等 ) 会 简 单 校 验 字 节 流 , 将 字 节 流 转 为 内 存 里 的 数 据 结 构 元 数 据 验 证 ( 这 个 类 是 否 有 父 类 、 继 承 的 类 是 否 合 法 、 非 抽 象 类 是 否 实 现 了 所 有 抽 象 方 法 等 等 ) 字 节 码 验 证 ( 校 验 方 法 代 码 中 的 字 节 码 指 令 语 义 是 否 正 确 、 保 证 方 法 的 类 型 转 换 时 有 效 的 ) 符 号 引 用 验 证 ( 校 验 常 量 区 的 符 号 引 用 是 否 正 确 , 确 保 解 析 阶 段 能 正 常 执 行 ) 准 备 为 静 态 变 量 分 配 内 存 , 并 初 始 化 为 零 值 解 析 类 或 接 口 的 解 析 : 解 析 的 符 号 引 用 的 类 不 是 数 组 则 需 要 先 加 载 这 个 类 , 再 校 验 访 问 权 限 字 段 解 析 : 先 从 自 身 找 , 自 身 无 且 实 现 了 接 口 , 则 找 继 承 的 接 口 中 的 引 用 , 自 身 无 也 无 实 现 接 口 , 则 找 父 类 , 都 找 不 到 则 报 错 , 找 到 则 校 验 权 限 。 方 法 解 析 : 与 字 段 类 似 , 从 自 身 到 实 现 的 接 口 、 继 承 的 父 类 中 找 , 找 到 后 校 验 权 限 。 接 口 方 法 解 析 : 从 自 身 接 口 中 或 父 接 口 中 找 、 找 到 无 需 校 验 权 限 ( 都 是 p u b l i c ) 初 始 化 执 行 c i n i t 方 法 , 方 法 中 执 行 对 静 态 变 量 的 赋 值 指 令 和 s t a t i c 快 父 类 的 初 始 化 方 法 一 定 先 于 子 类 执 行 执 行 时 会 加 锁 同 步 执 行 、 因 此 不 要 进 行 耗 时 操 作 顺 带 一 提 类 加 载 器 , 作 用 是 加 载 字 节 码 二 进 制 流 到 虚 拟 机 中 , 除 了 系 统 顶 级 的 类 加 载 器 ( 用 于 加 载 r t . j a r ) 是 由 C + + 实 现 外 , 其 他 的 类 加 载 器 都 是 J a v a 代 码 , 通 过 组 合 一 个 类 加 载 器 ( 即 父 类 加 载 器 ) , 实 现 双 亲 委 派 模 型 : 即 总 是 先 通 过 父 类 加 载 类 , 除 非 父 类 加 载 失 败 ; 若 自 己 实 现 一 个 类 加 载 器 , 一 般 需 要 组 合 C l a s s L o a d e r . g e t S y s t e m C l a s s L o a d e r ( ) 系 统 的 类 加 载 器 有 : 启 动 类 加 载 器 B o o t s t r a p C l a s s L o a d e r 加 载 J A V A _ H O M E / l i b 下 的 类 , 如 r t . j a r 扩 展 类 加 载 器 E x t e n s i o n C l a s s L o a d e r 加 载 J A V A _ H O M E / l i b / e x t 下 的 类 应 用 程 序 类 加 载 器 A p p l i c a t i o n C l a s s L o a d e r 加 载 c l a s s p a t h 下 的 类 J a v a 内 存 模 型 主 要 是 为 了 屏 蔽 调 各 种 硬 件 和 操 作 系 统 的 内 存 访 问 差 异 , 以 实 现 J a v a 程 序 在 各 种 平 台 下 都 能 达 到 一 致 的 内 存 访 问 效 果 。 可 有 效 防 止 不 同 平 台 的 并 发 访 问 因 平 台 差 异 有 所 不 同 引 发 线 程 安 全 问 题 。 主 内 存 与 工 作 内 存 : 这 里 变 量 不 包 括 线 程 私 有 的 内 存 区 域 所 有 变 量 都 存 储 主 内 存 中 每 条 线 程 有 自 己 的 工 作 内 存 线 程 的 工 作 内 存 中 保 存 了 该 线 程 使 用 到 的 变 量 的 主 内 存 副 本 拷 贝 线 程 对 变 量 的 所 有 操 作 ( 读 取 、 赋 值 等 ) 都 必 须 在 工 作 内 存 中 进 行 , 而 不 能 直 接 读 写 主 内 存 的 变 量 。 不 同 线 程 之 间 无 法 直 接 访 问 对 方 工 作 内 存 中 的 变 量 线 程 间 变 量 值 的 传 递 均 需 要 通 过 主 内 存 来 完 成 主 内 存 类 似 于 物 理 硬 件 中 的 内 存 , 而 工 作 内 存 优 先 存 储 于 寄 存 器 和 高 速 缓 存 中 ( 看 J V M 具 体 实 现 ) 内 存 间 交 互 操 作 l o c k : 作 用 于 主 内 存 的 变 量 , 它 把 一 个 变 量 表 示 为 一 条 线 程 独 占 的 状 态 。 u n l o c k : 作 用 于 主 内 存 的 变 量 , 它 把 一 个 处 于 锁 定 状 态 的 变 量 释 放 出 来 , 释 放 后 的 变 量 才 可 以 被 其 他 线 程 锁 定 。 r e a d : 作 用 于 主 内 存 的 变 量 , 它 把 一 个 变 量 的 值 从 主 内 存 传 输 到 线 程 的 工 作 内 存 中 , 以 便 随 后 的 l o a d 动 作 使 用 l o a d : 作 用 于 工 作 内 存 的 变 量 , 它 把 r e a d 操 作 从 主 内 存 中 得 到 的 变 量 值 放 入 工 作 内 存 的 变 量 副 本 中 。 u s e : 作 用 于 工 作 内 存 的 变 量 , 它 把 工 作 内 存 中 一 个 变 量 的 值 传 递 给 执 行 引 擎 , 每 当 虚 拟 机 遇 到 一 个 需 要 使 用 变 量 的 值 的 字 节 码 指 令 都 会 执 行 这 个 操 作 。 a s s i g n : 作 用 于 工 作 内 存 的 变 量 , 它 把 一 个 从 执 行 引 擎 接 收 到 的 值 赋 给 工 作 内 存 的 变 量 , 每 当 虚 拟 机 遇 到 一 个 需 要 给 变 量 赋 值 的 字 节 码 指 令 时 执 行 这 个 操 作 。 s t o r e : 存 储 作 用 于 工 作 内 存 的 变 量 , 它 把 工 作 内 存 中 一 个 变 量 的 值 传 递 给 主 内 存 中 , 以 便 随 后 的 w r i t e 操 作 使 用 w r i t e : 作 用 于 主 内 存 的 变 量 , 它 把 s t o r e 操 作 从 工 作 内 存 中 得 到 的 变 量 的 值 放 入 主 内 存 中 的 变 量 中 。 对 于 v o l a t i l e 型 变 量 的 特 殊 规 则 保 证 此 变 量 对 所 有 线 程 的 可 见 性 , 但 不 保 证 原 子 性 , 因 此 部 分 操 作 仍 是 线 程 不 安 全 的 , 如 i + + 禁 用 指 令 重 排 序 优 化 , 即 保 证 变 量 的 赋 值 操 作 的 顺 序 与 代 码 中 的 顺 序 一 致 ; 其 他 变 量 可 能 会 因 指 令 重 排 序 优 化 而 不 一 致 。 对 于 l o n g 和 d o u b l e 型 变 量 的 特 殊 规 则 对 于 这 两 类 型 变 量 , J V M 规 范 不 严 格 要 求 对 8 个 操 作 ( r e a d 、 l o a d 等 ) 都 具 有 原 子 性 但 大 多 数 虚 拟 机 实 现 仍 保 证 了 这 一 点 , 所 有 不 需 要 把 这 类 型 的 变 量 特 别 的 添 加 v o l a t i l e 修 饰 原 子 性 、 可 见 性 、 有 序 性 原 子 性 : 有 J a v a 内 存 模 型 来 直 接 保 证 原 子 性 变 量 操 作 包 括 ( r e a d 、 l o a d 、 a s s i g n 、 u s e 、 s t o r e 、 w r i t e ) , 基 本 可 以 认 为 基 本 数 据 类 型 的 访 问 读 写 是 具 有 原 子 性 的 , 可 使 用 s y n c h r o n i z e d 实 现 原 子 性 可 见 性 : 是 指 当 一 个 线 程 修 改 了 共 享 变 量 的 值 , 其 他 线 程 能 够 立 即 得 知 这 个 修 改 。 v o l a t i l e 、 s y n c h r o n i z e d 、 f i n a l 可 实 现 可 见 性 有 序 性 : 如 果 在 本 线 程 内 观 察 , 所 有 的 操 作 都 是 有 序 的 ; 如 果 在 一 个 线 程 观 察 另 一 个 线 程 , 所 有 的 操 作 都 是 无 序 的 。 可 使 用 v o l a t i l e 、 s y n c h r o n i z e d 实 现 有 序 性 先 行 发 生 原 则 程 序 次 序 规 则 : 在 一 个 线 程 中 , 按 照 程 序 代 码 顺 序 , 书 写 在 前 的 操 作 先 行 发 生 于 书 写 在 后 的 操 作 。 管 程 锁 定 规 则 : 一 个 u n l o c k 操 作 先 行 发 生 与 后 面 对 同 一 个 锁 的 l o c k 操 作 。 v o l a t i l e 变 量 规 则 : 对 一 个 v o l a t i l e 变 量 的 写 操 作 先 行 发 生 于 后 面 对 这 个 变 量 的 读 操 作 。 线 程 启 动 规 则 : T h r e a d 对 象 的 s t a r t 方 法 先 行 发 生 于 此 线 程 的 每 一 个 动 作 线 程 终 止 规 则 : 线 程 中 所 有 操 作 都 先 行 发 生 于 对 此 线 程 的 终 止 检 测 。 线 程 中 断 规 则 : 对 线 程 i n t e r r u p t 方 法 的 调 用 先 行 发 生 于 被 中 断 线 程 的 代 码 检 测 到 中 断 事 件 的 发 生 。 对 象 终 结 规 则 : 一 个 对 象 的 初 始 化 完 成 先 行 发 生 于 他 的 f i n a l i z e 方 法 的 开 始 传 递 性 : 如 果 操 作 A 先 行 发 生 于 操 作 B , 操 作 B 先 行 发 生 于 操 作 C , 那 就 可 以 得 出 操 作 A 先 行 发 生 于 操 作 C 的 结 论 。 J a v a 线 程 安 全 定 义 : 当 多 个 线 程 访 问 一 个 对 象 时 , 如 果 不 用 考 虑 这 些 线 程 在 运 行 时 环 境 下 的 调 度 和 交 替 执 行 , 也 不 需 要 进 行 额 外 同 步 ( 就 是 调 用 者 不 需 要 额 外 同 步 , 代 码 本 身 可 使 用 同 步 ) , 或 者 在 调 用 方 进 行 任 何 其 他 的 协 调 操 作 , 调 用 这 个 对 象 的 行 为 都 可 以 获 得 正 确 的 结 果 , 那 这 个 对 象 时 线 程 安 全 的 。 作 者 说 : 把 “ 调 用 这 个 对 象 的 行 为 ” 限 定 为 “ 单 词 调 用 ” , 也 可 称 为 线 程 安 全 。 这 是 个 弱 化 。 J a v a 语 言 中 的 线 程 安 全 不 可 变 : 不 可 变 的 对 象 一 定 是 线 程 安 全 的 ; 如 S t r i n g 绝 对 线 程 安 全 : 与 定 义 等 同 , 过 于 严 格 相 对 线 程 安 全 : 仅 保 证 对 这 个 对 象 单 独 的 操 作 是 线 程 安 全 的 , 如 V e c t o r 。 线 程 兼 容 : 对 象 本 身 不 安 全 , 但 通 过 操 作 前 后 加 同 步 手 段 来 保 证 操 作 线 程 安 全 。 则 称 为 线 程 兼 容 , 如 A r r a y L i s t 。 线 程 对 立 : 即 使 使 用 同 步 手 段 , 还 是 无 法 做 到 线 程 安 全 的 代 码 。 比 如 S y s t e m . s e t I n ( ) 线 程 安 全 的 实 现 方 法 互 斥 同 步 : 即 只 被 一 个 线 程 使 用 , 如 s y n c h r o n i z e d 非 阻 塞 同 步 : 一 般 指 乐 观 锁 , 即 先 进 行 操 作 , 若 无 其 他 线 程 争 用 共 享 数 据 , 那 操 作 就 成 功 了 ; 如 果 共 享 数 据 有 争 用 , 产 生 了 冲 突 , 那 就 采 用 其 他 的 补 偿 措 施 ( 通 常 是 重 试 ) ; 依 赖 C A S 原 子 操 作 , 即 系 统 底 层 支 持 无 同 步 方 案 : 一 般 指 T h r e a d L o c a l , 将 变 量 控 制 在 线 程 中 , 不 与 其 他 线 程 共 享 , 则 也 是 线 程 安 全 的 。 锁 优 化 自 旋 锁 与 自 适 应 锁 : 自 旋 指 线 程 在 等 待 锁 时 不 让 出 C P U 资 源 , 而 是 循 环 的 重 试 来 获 取 锁 ; 自 然 , 可 以 配 置 重 试 次 数 , 可 以 配 置 是 否 开 启 。 自 适 应 指 的 是 自 旋 的 时 间 或 者 说 次 数 , 根 据 虚 拟 机 统 计 的 自 旋 获 得 锁 的 成 功 与 否 , 来 增 长 或 缩 短 自 旋 的 时 间 。 锁 消 除 : 即 J V M 判 断 某 些 代 码 的 变 量 无 需 使 用 同 步 , 因 为 这 些 变 量 不 会 被 其 他 线 程 锁 读 写 , 如 方 法 里 是 局 部 变 量 的 S t r i n g B u f f e r 对 象 的 a p p e n d 方 法 。 其 使 用 s y n c h r o n i z e d , 但 局 部 变 量 都 是 线 程 私 有 的 , 并 不 会 被 其 他 线 程 读 写 。 锁 粗 化 : 避 免 锁 粒 度 太 小 导 致 频 繁 的 互 斥 , 带 来 额 外 的 开 销 , 虚 拟 机 会 对 这 种 情 况 将 锁 的 范 围 粗 化 。 轻 量 级 锁 : 即 当 一 个 锁 没 有 两 条 以 上 的 线 程 争 用 的 时 候 , 通 过 C A S 操 作 加 锁 和 解 锁 , 比 重 量 级 锁 开 销 更 少 。 若 超 过 两 个 线 程 争 用 , 则 通 过 修 改 对 象 头 标 志 位 将 锁 升 级 为 重 量 级 锁 , 因 为 此 时 再 使 用 C A S 反 而 是 一 种 消 耗 ( 这 是 因 为 C A S 总 是 会 失 败 ) 偏 向 锁 : 即 一 个 线 程 第 一 次 通 过 C A S 获 得 这 个 锁 后 , 之 后 再 获 取 将 不 再 需 要 加 锁 ( 即 使 释 放 了 锁 也 没 关 系 ) , 这 是 因 为 在 第 一 次 获 取 时 会 将 对 象 头 的 标 志 改 为 偏 向 锁 , 并 记 录 线 程 I D ( 这 个 动 作 也 是 通 过 C A S 进 行 的 ) , 这 样 以 后 只 需 要 对 比 线 程 I D , 刷 脸 入 场 。 大 致 流 程 编 译 器 编 译 . j a v a 后 缀 文 件 得 到 字 节 码 文 件 . c l a s s ; 类 加 载 器 加 载 字 节 码 文 件 到 运 行 时 区 域 ; 执 行 器 为 类 的 方 法 创 建 栈 桢 , 并 结 合 操 作 数 栈 执 行 字 节 码 指 令 , 遇 到 方 法 调 用 的 指 令 , 则 可 能 需 要 根 据 对 象 类 型 判 断 执 行 哪 个 具 体 的 方 法 , 然 后 执 行 对 应 的 字 节 码 指 令 。 R e d i s 底 层 探 秘 发 表 于 2 0 2 1 0 2 0 3 更 新 于 2 0 2 1 0 3 2 8 分 类 于 i n t e r v i e w , r e d i s D i s q u s : R e d i s 底 层 探 秘 R e d i s 数 据 结 构 实 现 原 理 c o p y f r o m h t t p s : / / j u e j i n . c n / p o s t / 6 8 4 4 9 0 3 8 5 6 3 1 3 3 6 8 5 8 9 # h e a d i n g 3 1 . s t r i n g 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 / / s d s h d r 6 4 变 成 s d s h d r 3 2 , 则 相 应 的 l e n 和 a l l o c 变 成 u i n t 3 2 _ t s t r u c t _ _ a t t r i b u t e _ _ ( ( _ _ p a c k e d _ _ ) ) s d s h d r 6 4 ; / * l e n : 已 使 用 的 长 度 , 即 字 符 串 的 真 实 长 度 a l l o c : 除 去 标 头 和 终 止 符 ( \ \ 0 ) 后 的 长 度 f l a g s : 低 3 位 表 示 字 符 串 类 型 , 其 余 5 位 未 使 用 ( 我 暂 时 没 发 现 r e d i s 在 哪 里 使 用 过 这 个 属 性 ) b u f [ ] : 存 储 字 符 数 据 * / r e d i s 写 的 字 符 串 库 有 以 下 4 个 优 点 : 降 低 获 取 字 符 串 长 度 的 时 间 复 杂 度 到 O ( 1 ) 减 少 了 修 改 字 符 串 时 的 内 存 重 分 配 次 数 兼 容 c 字 符 串 的 同 时 , 提 高 了 一 些 字 符 串 工 具 方 法 的 效 率 二 进 制 安 全 ( 数 据 写 入 的 格 式 和 读 取 的 格 式 一 致 ) 总 结 : s t r i n g 就 是 字 符 串 , 但 R e d i s 其 实 有 实 现 自 己 的 类 库 提 高 各 方 面 的 速 度 , 只 能 说 , 专 业 ! ! ! 2 . l i s t z i p l i s t z i p l i s t 并 不 是 一 个 类 名 , 其 结 构 是 下 面 这 样 的 : . . . 其 中 各 部 分 代 表 的 含 义 如 下 : z l b y t e s : 4 个 字 节 ( 3 2 b i t s ) , 表 示 z i p l i s t 占 用 的 总 字 节 数 z l t a i l : 4 个 字 节 ( 3 2 b i t s ) , 表 示 z i p l i s t 中 最 后 一 个 节 点 在 z i p l i s t 中 的 偏 移 字 节 数 e n t r i e s : 2 个 字 节 ( 1 6 b i t s ) , 表 示 z i p l i s t 中 的 元 素 数 e n t r y : 长 度 不 定 , 表 示 z i p l i s t 中 的 数 据 z l e n d : 1 个 字 节 ( 8 b i t s ) , 表 示 结 束 标 记 , 这 个 值 固 定 为 f f ( 2 5 5 ) 这 些 数 据 均 为 小 端 存 储 , 所 以 可 能 有 些 人 查 看 数 据 的 二 进 制 流 与 其 含 义 对 应 不 上 , 其 实 是 因 为 读 数 据 的 方 式 错 了 z i p l i s t 内 部 采 取 数 据 压 缩 的 方 式 进 行 存 储 , 压 缩 方 式 就 不 是 重 点 了 , 我 们 仅 从 宏 观 来 看 , z i p l i s t 类 似 一 个 封 装 的 数 组 , 通 过 z l t a i l 可 以 方 便 地 进 行 追 加 和 删 除 尾 部 数 据 、 使 用 e n t r i e s 可 以 方 便 地 计 算 长 度 q u i c k l i s t 1 2 3 4 5 6 7 8 t y p e d e f s t r u c t q u i c k l i s t q u i c k l i s t ; 我 们 可 以 明 显 地 看 出 , q u i c k l i s t 是 一 个 双 向 链 表 的 结 构 , 但 是 内 部 又 涉 及 了 z i p l i s t , 我 们 可 以 这 么 说 , 在 宏 观 上 , q u i c k l i s t 是 一 个 双 向 链 表 , 在 微 观 上 , 每 一 个 q u i c k l i s t 的 节 点 都 是 一 个 z i p l i s t 在 r e d i s . c o n f 中 , 可 以 使 用 下 面 两 个 参 数 来 进 行 优 化 : l i s t m a x z i p l i s t s i z e : 表 示 每 个 q u i c k l i s t N o d e 的 字 节 大 小 。 默 认 为 2 , 表 示 8 K B l i s t c o m p r e s s d e p t h : 表 示 q u i c k l i s t N o d e 节 点 是 否 要 压 缩 。 默 认 为 0 , 表 示 不 压 缩 这 种 存 储 方 式 的 优 点 和 链 表 的 优 点 一 致 , 就 是 插 入 和 删 除 的 效 率 很 高 , 而 链 表 查 询 的 效 率 又 由 z i p l i s t 来 进 行 弥 补 , 所 以 q u i c k l i s t 就 成 为 了 l i s t 数 据 结 构 的 首 选 总 结 : 是 一 个 双 向 链 表 + z i p l i s t , 同 时 具 有 两 者 的 优 点 ( 指 插 入 速 度 和 查 询 速 度 , 具 体 咋 回 事 , 怎 么 做 到 的 . . 完 全 不 知 道 啊 ) . 3 . h a s h z i p h a s h z i p m a p 其 格 式 形 如 下 面 这 样 : f o o b a r h e l l o w o r l d 各 部 分 的 含 义 如 下 : z m l e n : 1 个 字 节 , 表 示 z i p m a p 的 总 字 节 数 l e n : 1 ~ 5 个 字 节 , 表 示 接 下 来 存 储 的 字 符 串 长 度 f r e e : 1 个 字 节 , 是 一 个 无 符 号 的 8 位 数 , 表 示 字 符 串 后 面 的 空 闲 未 使 用 字 节 数 , 由 于 修 改 与 键 对 应 的 值 而 产 生 这 其 中 相 邻 的 两 个 字 符 串 就 分 别 是 键 和 值 , 比 如 在 上 面 的 例 子 中 , 就 表 示 f o o = > b a r , h e l l o = > w o r l d 这 样 的 对 应 关 系 这 种 方 式 的 缺 点 也 很 明 显 , 就 是 查 找 的 时 间 复 杂 度 为 O ( n ) , 所 以 只 能 当 作 一 个 轻 量 级 的 h a s h m a p 来 使 用 d i c t 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 t y p e d e f s t r u c t d i c t d i c t ; / / 真 正 的 t y p e d e f s t r u c t d i c t E n t r y v ; s t r u c t d i c t E n t r y * n e x t ; } d i c t E n t r y ; 很 明 显 是 一 个 链 表 , 我 们 知 道 这 是 采 用 链 式 结 构 存 储 就 足 够 了 这 种 方 式 会 消 耗 较 多 的 内 存 , 所 以 一 般 数 据 较 少 时 会 采 用 轻 量 级 的 z i p m a p 总 结 : 是 个 链 表 , 缺 点 是 消 耗 内 存 高 , 因 此 数 据 较 少 会 采 用 z i p m a p 这 种 … . 按 字 节 精 打 细 算 的 方 式 存 储 . 4 . s e t 1 2 3 4 5 t y p e d e f s t r u c t i n t s e t i n t s e t ; 其 中 各 字 段 含 义 如 下 : e n c o d i n g : 数 据 编 码 格 式 , 表 示 每 个 数 据 元 素 用 几 个 字 节 存 储 ( 可 取 的 值 有 2 、 4 , 和 8 ) l e n g t h : 元 素 个 数 c o n t e n t s : 柔 性 数 组 , 这 部 分 内 存 单 独 分 配 , 不 包 含 在 i n t s e t 中 i n t s e t 有 一 个 数 据 升 级 的 概 念 , 比 方 说 我 们 有 一 个 1 6 位 整 数 的 s e t , 这 时 候 插 入 了 一 个 3 2 位 整 数 , 所 以 就 导 致 整 个 集 合 都 升 级 为 3 2 位 整 数 , 但 是 反 过 来 却 不 行 , 这 也 就 是 柔 性 数 组 的 由 来 如 果 集 合 过 大 , 会 采 用 d i c t 的 方 式 来 进 行 存 储 总 结 : 底 层 是 个 数 组 的 i n s e t 结 构 体 , 另 外 集 合 过 大 会 采 用 d i c t 来 存 储 . 5 . z s e t z s e t , 有 很 多 地 方 也 叫 做 s o r t e d s e t , 是 一 个 键 值 对 的 结 构 , 其 键 被 称 为 m e m b e r , 也 就 是 集 合 元 素 ( z s e t 依 然 是 s e t , 所 以 m e m b e r 不 能 相 同 ) , 其 对 应 的 值 被 称 为 s c o r e , 是 一 个 浮 点 数 , 可 以 理 解 为 优 先 级 , 用 于 排 列 z s e t 的 顺 序 其 也 有 两 种 存 储 方 式 , 一 种 是 z i p l i s t / z i p m a p 的 格 式 , 这 种 方 式 我 们 就 不 过 多 介 绍 了 , 只 需 要 了 解 这 种 格 式 将 数 据 按 照 s c o r e 的 顺 序 排 列 即 可 另 一 种 存 储 格 式 是 采 用 了 s k i p l i s t , 意 为 跳 跃 表 , 可 以 看 成 平 衡 树 映 射 的 数 组 , 其 查 找 的 时 间 复 杂 度 和 平 衡 树 基 本 没 有 差 别 , 但 是 实 现 更 为 简 单 , 形 如 下 面 这 样 的 结 构 ( 图 来 源 跳 跃 表 的 原 理 ) : 总 结 : 看 不 懂 … . 再 看 看 这 个 吧 … 更 细 致 一 点 ! h t t p s : / / j u e j i n . c n / p o s t / 6 8 4 4 9 0 4 1 9 2 0 4 2 0 7 4 1 2 6 R e d i s 的 持 久 化 摘 记 一 下 : c o p y f r o m h t t p s : / / m p . w e i x i n . q q . c o m / s / z f k h Q F E B k K S R s f K F 6 3 R 9 4 A R D B 写 R D B 文 件 是 R e d i s 的 一 种 持 久 化 方 式 。 在 指 定 的 时 间 间 隔 内 将 内 存 中 的 数 据 写 入 到 磁 盘 , R D B 文 件 是 一 个 紧 凑 的 二 进 制 文 件 , 每 一 个 文 件 都 代 表 了 某 一 个 时 刻 ( 执 行 f o r k 的 时 刻 ) R e d i s 完 整 的 数 据 快 照 , 恢 复 数 据 时 , 将 快 照 文 件 读 入 内 存 即 可 。 触 发 保 存 R D B 文 件 4 种 情 况 手 动 执 行 s a v e 命 令 、 b g s a v e 满 足 配 置 文 件 中 配 置 的 s a v e 相 关 配 置 项 时 , 自 动 触 发 手 动 执 行 f l u s h a l l 关 闭 r e d i s , 执 行 s h u t d o w n 命 令 如 何 让 r e d i s 加 载 r d b 文 件 ? 只 需 要 将 r d b 文 件 放 在 r e d i s 的 启 动 目 录 下 , r e d i s 其 中 时 会 自 动 加 载 它 。 R D B 模 式 的 优 缺 点 : 优 点 : R D B 过 程 中 , 由 子 进 程 代 替 主 进 程 进 行 备 份 的 I O 操 作 。 保 证 了 主 进 程 仍 然 提 供 高 性 能 的 服 务 。 适 合 大 规 模 的 数 据 备 份 恢 复 过 程 。 缺 点 : 默 认 情 况 下 , 它 是 每 隔 一 段 时 间 进 行 一 次 数 据 备 份 , 所 以 一 旦 出 现 最 后 一 次 持 久 化 的 数 据 丢 失 , 将 丢 失 大 规 模 的 数 据 。 f o r k ( ) 子 进 程 时 会 占 用 一 定 的 内 存 空 间 , 如 果 在 f o r k ( ) 子 进 程 的 过 程 中 , 父 进 程 夯 住 了 , 那 也 就 是 r e d i s 卡 住 了 , 不 能 对 外 提 供 服 务 。 所 以 不 要 让 生 成 R D B 文 件 的 时 间 间 隔 太 长 , 不 然 每 次 生 成 的 R D B 文 件 过 大 对 R e d i s 本 身 也 是 有 影 响 的 。 总 结 : 每 隔 一 段 时 间 ( 一 般 比 较 久 ) 触 发 的 全 量 备 份 , 备 份 速 度 取 决 于 使 用 情 况 , 备 份 时 R e d i s 仍 然 可 读 可 写 , 但 写 还 是 有 些 问 题 . 缺 点 是 宕 机 容 易 丢 失 较 久 的 数 据 . A O F A p p e n d O n l y F i l e , 他 也 是 R e d i s 的 持 久 化 策 略 。 即 将 所 有 的 写 命 令 都 以 日 志 的 方 式 追 加 记 录 下 来 ( 只 追 加 , 不 修 改 ) , 恢 复 的 时 候 将 这 个 文 件 中 的 命 令 读 出 来 回 放 。 a o f 模 式 的 优 缺 点 优 点 : a o f 是 用 追 加 的 形 式 写 , 没 有 随 机 磁 盘 I O 那 样 的 寻 址 开 销 , 性 能 还 是 比 较 高 的 。 a o f 可 以 更 好 的 保 护 数 据 不 丢 失 或 者 尽 可 能 的 少 丢 失 : 设 置 让 r e d i s 每 秒 同 步 一 次 数 据 , 即 使 r e d i s 宕 机 了 , 最 多 也 就 丢 失 1 秒 的 数 据 。 即 使 a o f 真 的 体 积 很 大 , 也 可 以 设 置 后 台 重 写 , 不 影 响 客 户 端 的 重 写 。 a o f 适 合 做 灾 难 性 的 误 删 除 紧 急 恢 复 : 比 如 不 小 心 执 行 了 f l u s h a l l , 然 后 可 以 在 发 生 r e w r i t e 之 前 快 速 备 份 下 a o f 文 件 , 去 掉 末 尾 的 f l u s h a l l , 通 过 恢 复 机 制 恢 复 数 据 。 缺 点 : 使 用 a o f 一 直 追 加 写 , 导 致 a o f 的 体 积 远 大 于 R D B 文 件 的 体 积 , 恢 复 数 据 、 修 复 的 速 度 要 比 r d b 慢 很 多 。 a o f 的 重 写 A O F 采 取 的 是 文 件 追 加 的 方 式 , 文 件 的 体 积 越 来 越 大 , 为 了 优 化 这 种 现 象 , 增 加 了 重 写 机 制 , 当 a o f 文 件 的 体 积 到 达 我 们 在 上 面 的 配 置 文 件 上 的 阕 值 时 , 就 会 触 发 重 写 策 略 , 只 保 留 和 数 据 恢 复 相 关 的 命 令 。 手 动 触 发 重 写 1 2 3 # r e d i s 会 f o r k 出 一 条 新 的 进 程 # 同 样 是 先 复 制 到 一 份 新 的 临 时 文 件 , 最 后 再 r e n a m e , 遍 历 每 一 条 语 句 , 记 录 下 有 s e t 的 语 句 b g r e w r i t e a o f R D B 和 A O F 的 选 择 如 果 我 们 的 r e d i s 只 是 简 单 的 作 为 缓 存 , 那 两 者 都 不 要 也 没 事 。 如 果 数 据 需 要 持 久 化 , 那 不 要 仅 仅 使 用 R D B , 因 为 一 旦 发 生 故 障 , 你 会 丢 失 很 多 数 据 。 同 时 开 启 两 者 : 在 这 种 情 况 下 , r e d i s 优 先 加 载 的 是 a o f , 因 为 它 的 数 据 很 可 能 比 r d b 更 全 , 但 是 并 不 建 议 只 是 用 a o f , 因 为 a o f 不 是 那 么 的 安 全 , 很 可 能 存 在 潜 在 的 b u g 。 推 荐 : 建 议 在 从 机 s l a v e 上 只 备 份 r d b 文 件 , 而 且 只 要 1 5 分 钟 备 份 一 次 就 够 了 。 如 果 启 动 了 a o f , 我 们 尽 量 减 少 r e w r i t e 的 频 率 , 基 础 大 小 设 置 为 5 G 完 全 可 以 , 起 步 也 要 3 G 。 如 果 我 们 不 选 择 a o f , 而 是 选 择 了 主 从 复 制 的 架 构 实 现 高 可 用 同 样 可 以 , 能 省 掉 一 大 笔 I O 操 作 , 但 是 意 外 发 生 的 话 , 会 丢 失 十 几 分 钟 的 数 据 。 总 结 : A O F 记 录 的 是 对 R e d i s 数 据 库 做 更 改 的 命 令 列 表 , 类 似 M y S Q L 的 b i n l o g . 一 致 性 H a s h 算 法 c o p y f r o m h t t p s : / / j u e j i n . c n / p o s t / 6 8 4 4 9 0 3 6 7 0 4 3 0 0 4 0 0 7 8 # h e a d i n g 1 总 计 : 一 个 选 取 集 群 内 服 务 器 的 算 法 , 使 其 在 大 量 的 请 求 下 可 做 到 流 量 均 匀 的 落 到 每 台 服 务 器 上 . 首 先 引 入 一 个 概 念 , 就 是 h a s h 环 , 其 是 h a s h 的 取 值 范 围 大 小 , 展 开 就 是 范 围 下 限 范 围 上 限 , 围 起 来 则 是 一 个 环 . 实 现 原 理 是 , 对 每 个 服 务 器 取 h a s h , 记 录 下 h a s h 位 置 , 再 对 每 个 请 求 的 特 定 信 息 ( 如 i p , R e d i s K e y ) 也 取 h a s h , 在 根 据 这 两 个 h a s h 大 小 关 系 , 顺 时 针 ( 找 比 其 更 大 的 ) 寻 找 离 得 最 近 的 服 务 器 ; 因 为 大 量 的 请 求 会 均 匀 的 散 落 在 h a s h 环 上 , 这 个 是 h a s h 算 法 决 定 的 性 质 , 同 理 大 量 的 服 务 器 节 点 也 会 均 衡 的 散 落 在 h a s h 值 范 围 内 , 因 此 总 体 来 看 , 请 求 总 是 均 匀 的 打 落 到 每 台 服 务 器 . 但 这 也 引 出 一 个 问 题 , 就 是 h a s h 值 范 围 过 大 , 而 服 务 器 数 量 过 少 , 无 法 保 证 服 务 器 均 衡 的 散 落 在 整 个 h a s h 上 , 因 此 引 入 虚 拟 节 点 , 使 得 每 个 虚 拟 节 点 的 h a s h 与 原 节 点 不 一 致 , 然 后 每 个 节 点 创 建 大 量 的 ( 比 如 1 0 0 0 ) 虚 拟 节 点 , 计 算 的 h a s h 则 会 均 匀 的 散 落 在 h a s h 环 上 了 . 再 总 结 : 充 分 利 用 h a s h 算 法 的 特 性 , 以 及 加 入 取 h a s h 找 距 离 近 的 服 务 器 这 个 理 念 , 使 得 即 使 对 服 务 器 进 行 伸 缩 , 也 可 以 降 低 被 影 响 的 k e y . 对 比 H a s h S l o t 了 解 了 一 致 性 H a s h 算 法 的 特 点 后 , 我 们 也 不 难 发 现 一 些 不 尽 人 意 的 地 方 : 整 个 分 布 式 缓 存 需 要 一 个 路 由 服 务 来 做 负 载 均 衡 , 存 在 单 点 问 题 ( 如 果 路 由 服 务 挂 了 , 整 个 缓 存 也 就 凉 了 ) H a s h 环 上 的 节 点 非 常 多 或 者 更 新 频 繁 时 , 查 找 性 能 会 比 较 低 下 针 对 这 些 问 题 , R e d i s 在 实 现 自 己 的 分 布 式 集 群 方 案 时 , 设 计 了 全 新 的 思 路 : 基 于 P 2 P 结 构 的 H a s h S l o t 算 法 , 下 面 简 单 介 绍 一 下 : 使 用 H a s h S l o t 类 似 于 H a s h 环 , R e d i s C l u s t e r 采 用 H a s h S l o t 来 实 现 K e y 值 的 均 匀 分 布 和 实 例 的 增 删 管 理 。 首 先 默 认 分 配 了 1 6 3 8 4 个 S l o t ( 这 个 大 小 正 好 可 以 使 用 2 k b 的 空 间 保 存 ) , 每 个 S l o t 相 当 于 一 致 性 H a s h 环 上 的 一 个 节 点 。 接 入 集 群 的 所 有 实 例 将 均 匀 地 占 有 这 些 S l o t , 而 最 终 当 我 们 S e t 一 个 K e y 时 , 使 用 C R C 1 6 ( K e y ) % 1 6 3 8 4 来 计 算 出 这 个 K e y 属 于 哪 个 S l o t , 并 最 终 映 射 到 对 应 的 实 例 上 去 。 那 么 当 增 删 实 例 时 , S l o t 和 实 例 间 的 对 应 要 如 何 进 行 对 应 的 改 动 呢 ? 举 个 例 子 , 原 本 有 3 个 节 点 A , B , C , 那 么 一 开 始 创 建 集 群 时 S l o t 的 覆 盖 情 况 是 : 1 2 3 4 节 点 A 0 - 5 4 6 0 节 点 B 5 4 6 1 - 1 0 9 2 2 节 点 C 1 0 9 2 3 - 1 6 3 8 3 复 制 代 码 现 在 假 设 要 增 加 一 个 节 点 D , R e d i s C l u s t e r 的 做 法 是 将 之 前 每 台 机 器 上 的 一 部 分 S l o t 移 动 到 D 上 ( 注 意 这 个 过 程 也 意 味 着 要 对 节 点 D 写 入 的 K V 储 存 ) , 成 功 接 入 后 S l o t 的 覆 盖 情 况 将 变 为 如 下 情 况 : 1 2 3 4 5 节 点 A 1 3 6 5 5 4 6 0 节 点 B 6 8 2 7 1 0 9 2 2 节 点 C 1 2 2 8 8 1 6 3 8 3 节 点 D 0 1 3 6 4 , 5 4 6 1 6 8 2 6 , 1 0 9 2 3 1 2 2 8 7 复 制 代 码 同 理 删 除 一 个 节 点 , 就 是 将 其 原 来 占 有 的 S l o t 以 及 对 应 的 K V 储 存 均 匀 地 归 还 给 其 他 节 点 。 P 2 P 节 点 寻 找 现 在 我 们 考 虑 如 何 实 现 去 中 心 化 的 访 问 , 也 就 是 说 无 论 访 问 集 群 中 的 哪 个 节 点 , 你 都 能 够 拿 到 想 要 的 数 据 。 其 实 这 有 点 类 似 于 路 由 器 的 路 由 表 , 具 体 说 来 就 是 : 每 个 节 点 都 保 存 有 完 整 的 H a s h S l o t 节 点 映 射 表 , 也 就 是 说 , 每 个 节 点 都 知 道 自 己 拥 有 哪 些 S l o t , 以 及 某 个 确 定 的 S l o t 究 竟 对 应 着 哪 个 节 点 。 无 论 向 哪 个 节 点 发 出 寻 找 K e y 的 请 求 , 该 节 点 都 会 通 过 C R C ( K e y ) % 1 6 3 8 4 计 算 该 K e y 究 竟 存 在 于 哪 个 S l o t , 并 将 请 求 转 发 至 该 S l o t 所 在 的 节 点 。 总 结 一 下 就 是 两 个 要 点 : 映 射 表 和 内 部 转 发 , 这 是 通 过 著 名 的 G o s s i p 协 议 来 实 现 的 。 总 结 : 映 射 表 记 录 了 我 这 个 k e y 计 算 h a s h 位 于 的 槽 属 于 哪 个 节 点 , 若 是 节 点 自 身 , 则 处 理 请 求 , 若 不 是 则 转 发 到 那 个 节 点 . C A P 理 论 摘 记 一 下 : c o p y f r o m h t t p s : / / m p . w e i x i n . q q . c o m / s / z f k h Q F E B k K S R s f K F 6 3 R 9 4 A C ( C o n s i s t e n c y 强 一 致 性 ) A ( A v a i l a b i l i t y 可 用 性 ) P ( P a r t i t i o n t o l e r a n c e 分 区 容 错 性 ) C A P 的 理 论 核 心 是 : 一 个 分 布 式 的 系 统 , 不 可 能 很 好 的 满 足 一 致 性 , 可 用 性 , 分 区 容 错 性 这 三 个 需 求 , 最 多 同 时 只 能 满 足 两 个 . 因 此 C A P 原 理 将 n o s q l 分 成 了 三 大 原 则 : C A 单 点 集 群 , 满 足 强 一 致 性 和 可 用 性 , 比 如 说 o r a c l e , 扩 展 性 收 到 了 限 制 。 C P 满 足 一 致 性 , 和 分 区 容 错 性 R e d i s 和 M o n g o D B 都 属 于 这 种 类 型 。 A P 选 择 了 可 用 性 和 分 区 容 错 性 , 他 也 是 大 多 数 网 站 的 选 择 , 容 忍 数 据 可 以 暂 时 不 一 致 , 但 是 不 容 忍 系 统 挂 掉 。 R e d i s 配 置 文 件 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 5 3 5 4 5 5 5 6 5 7 5 8 5 9 6 0 6 1 6 2 6 3 6 4 6 5 6 6 # # 启 动 r e d i s 的 方 式 2 . / r e d i s s e r v e r / p a t h / t o / r e d i s . c o n f 3 4 # 可 以 像 下 面 这 样 让 在 当 前 配 置 文 件 包 含 引 用 其 他 配 置 文 件 5 i n c l u d e / p a t h / t o / l o c a l . c o n f 6 i n c l u d e / p a t h / t o / o t h e r . c o n f 7 8 # 指 定 哪 些 客 户 端 可 以 连 接 使 用 r e d i s 9 E x a m p l e s : 1 0 b i n d 1 9 2 . 1 6 8 . 1 . 1 0 0 1 0 . 0 . 0 . 1 # 指 定 i p 1 1 b i n d 1 2 7 . 0 . 0 . 1 : : 1 # 仅 限 于 本 机 可 访 问 1 2 1 3 # 是 否 处 于 受 保 护 的 模 式 , 默 认 开 启 1 4 p r o t e c t e d m o d e y e s 1 5 1 6 # 对 外 暴 露 的 端 口 1 7 p o r t 1 6 3 7 9 1 8 1 9 # T C P 的 通 用 配 置 2 0 t c p b a c k l o g 5 1 1 2 1 t i m e o u t 0 2 2 t c p k e e p a l i v e 3 0 0 2 3 2 4 # 是 否 以 守 护 进 程 的 方 式 运 行 , 默 认 为 n o 2 5 d a e m o n i z e y e s 2 6 2 7 # 如 果 进 程 在 后 台 运 行 , 需 要 指 定 这 个 p i d 文 件 2 8 p i d f i l e / v a r / r u n / r e d i s _ 6 3 7 9 . p i d 2 9 3 0 # 日 志 级 别 3 1 # d e b u g 测 试 开 发 节 点 3 2 # v e r b o s e ( 和 d u b u g 很 像 , 会 产 生 大 量 日 志 ) 3 3 # n o t i c e ( 生 产 环 境 使 用 ) 3 4 # w a r n i n g ( o n l y v e r y i m p o r t a n t / c r i t i c a l m e s s a g e s a r e l o g g e d ) 3 5 l o g l e v e l n o t i c e 3 6 3 7 # 日 志 文 件 名 3 8 l o g f i l e 3 9 4 0 # 数 据 库 的 数 量 , 默 认 1 6 个 4 1 d a t a b a s e s 1 6 4 2 4 3 # 是 否 总 是 显 示 l o g o 4 4 a l w a y s s h o w l o g o y e s 4 5 4 6 4 7 # 设 置 r e d i s 的 登 陆 密 码 ( 默 认 没 有 密 码 ) 4 8 # 设 置 完 密 码 后 , 使 用 r e d i s c l i 登 陆 时 , 使 用 a u t h p a s s w o r d 认 证 登 陆 4 9 r e q u i r e p a s s f o o b a r e d 5 0 5 1 # 设 置 能 连 接 上 r e d i s 的 客 户 端 的 最 大 数 量 5 2 m a x c l i e n t s 1 0 0 0 0 5 3 5 4 # 给 r e d i s 设 置 最 大 的 内 存 容 量 5 5 m a x m e m o r y 5 6 5 7 # 内 存 达 到 上 限 后 的 处 理 策 略 5 8 # v o l a t i l e l r u 只 针 对 设 置 了 过 期 时 间 的 k e y 进 行 L R U 移 除 5 9 # a l l k e y s l r u 删 除 L R U 算 法 的 K e y 6 0 # v o l a t i l e l f u 使 用 具 有 过 期 集 的 密 钥 在 近 似 的 L F U 中 进 行 驱 逐 。 6 1 # a l l k e y s l f u 使 用 近 似 的 L F U 退 出 任 何 密 钥 。 6 2 # v o l a t i l e r a n d o m 随 机 删 除 即 将 过 期 的 k e y 6 3 # a l l k e y s r a n d o m 随 机 删 除 6 4 # v o l a t i l e t t l 删 除 即 将 过 期 的 6 5 # n o e v i c t i o n 永 不 过 期 , 返 回 错 误 6 6 m a x m e m o r y p o l i c y n o e v i c t i o n M y S Q L 探 秘 笔 记 发 表 于 2 0 2 1 0 2 0 1 更 新 于 2 0 2 1 0 3 2 8 分 类 于 m y s q l , i n t e r v i e w D i s q u s : M y S Q L 探 秘 笔 记 由 S Q L 语 句 的 执 行 过 程 引 出 M y S Q L 核 心 组 件 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 1 . 客 户 端 发 送 S Q L 语 句 给 M y S Q L . 2 . M y S Q L 的 S e r v e r 层 与 客 户 端 通 信 , 得 到 S Q L 语 句 . 3 . S e r v e r 层 先 检 查 缓 存 , 后 调 用 分 析 器 . 4 . 分 析 器 解 析 S Q L 语 句 得 到 解 析 树 , 然 后 调 用 优 化 器 . 5 . 优 化 器 基 于 成 本 控 制 来 寻 找 较 优 解 , 如 逻 辑 转 换 / 选 取 索 引 / 计 算 成 本 / 改 进 计 划 , 最 终 得 到 查 询 计 划 ; 然 后 调 用 执 行 器 5 . 执 行 器 根 据 查 询 计 划 执 行 存 储 引 擎 并 获 取 返 回 结 果 再 返 回 给 客 户 端 . # 存 储 引 擎 I n n o D B 0 . 先 根 据 语 句 的 w h e r e 查 询 需 要 操 作 的 列 , 若 单 条 , 单 个 执 行 , 多 条 ( 未 知 , 遍 历 执 行 不 太 可 能 . . . ) 1 . 由 于 事 务 是 自 动 开 启 的 ( 默 认 设 置 ) , 因 此 单 条 语 句 也 会 自 动 被 事 务 包 围 . 2 . 所 以 先 写 u n d o l o g ( 默 认 置 于 共 享 表 空 间 ) , 写 这 个 是 用 于 事 务 回 滚 的 . 3 . 接 着 将 修 改 写 入 到 B u f f e r P o o l ( 即 修 改 内 存 中 的 值 ) . 4 . 二 阶 段 提 交 第 一 阶 段 , 写 r e d o l o g , 此 作 用 为 防 止 写 b i n l o g 时 宕 机 造 成 数 据 不 一 致 ( 前 提 是 开 了 b i n l o g ) ; 这 里 标 记 r e d o l o g 为 p r e p a r e 状 态 . 5 . 接 着 写 b i n l o g , 若 有 从 库 集 群 , 应 该 还 要 等 待 从 库 同 步 . 6 . 二 阶 段 提 交 第 二 阶 段 , 写 完 b i n l o g 后 , 将 r e d o l o g 标 记 成 c o m m i t , 代 表 这 次 提 交 和 b i n l o g 保 持 了 一 致 . # P S 二 阶 段 提 交 会 标 记 r e d o l o g 为 p r e p a r e 状 态 , 这 样 如 果 数 据 库 宕 机 ( 在 写 b i n l o g 时 ) 再 重 启 , 读 取 到 这 个 标 志 , 就 知 道 提 交 不 是 完 整 的 , 于 是 就 要 通 过 判 断 b i n l o g 的 L S N 做 一 些 处 理 了 . ( 啥 处 理 我 也 不 知 道 , 可 能 是 照 常 提 交 , 也 可 能 是 回 滚 ) P S : 选 取 索 引 只 能 用 一 个 索 引 , 除 了 u n i o n 好 像 会 触 发 合 并 索 引 , 但 合 并 后 也 算 一 个 索 引 . 即 使 是 u p d a t e 语 句 也 会 使 用 优 化 器 寻 找 查 询 计 划 , 因 为 当 带 条 件 时 , 需 要 先 锁 定 记 录 , 再 进 行 修 改 . 几 个 核 心 组 件 的 作 用 连 接 器 : 网 络 编 程 建 立 端 口 监 听 , 接 收 客 户 端 发 送 的 S Q L 语 句 分 析 器 : 对 S Q L 进 行 语 法 、 词 法 上 的 分 析 。 优 化 器 : 生 成 执 行 计 划 、 选 择 索 引 。 * 逻 辑 转 换 : * 包 括 否 定 消 除 、 等 值 传 递 和 常 量 传 递 、 常 量 表 达 式 求 值 、 外 连 接 转 换 为 内 连 接 、 子 查 询 转 换 、 视 图 合 并 等 ; * 优 化 准 备 : * 例 如 索 引 r e f 和 r a n g e 访 问 方 法 分 析 、 查 询 条 件 扇 出 值 ( f a n o u t , 过 滤 后 的 记 录 数 ) 分 析 、 常 量 表 检 测 ; * 基 于 成 本 优 化 : * 包 括 访 问 方 法 和 连 接 顺 序 的 选 择 等 ; * 执 行 计 划 改 进 : * 例 如 表 条 件 下 推 、 访 问 方 法 调 整 、 排 序 避 免 以 及 索 引 条 件 下 推 。 执 行 器 : 操 作 执 行 引 擎 , 获 取 S Q L 的 执 行 结 果 存 储 引 擎 ( 执 行 引 擎 ) : 负 责 具 体 的 语 句 执 行 , 查 询 等 . P S : 基 数 ( 值 某 列 数 据 去 重 后 剩 余 个 数 , 估 算 得 到 ) 会 被 用 于 分 析 索 引 的 过 滤 效 果 . 然 后 是 存 储 引 擎 里 面 的 一 些 概 念 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 # 存 储 引 擎 中 B u f f e r P o o l : 用 于 缓 存 表 数 据 的 改 动 , 有 自 己 的 落 盘 时 机 . R e d o l o g B u f f e r : 用 于 缓 存 r e d o l o g , 有 自 己 的 落 盘 时 机 . c o m m i t 事 务 时 落 盘 可 配 置 e v e r y s e c 每 秒 触 发 落 盘 B i n l o g B u f f e r : 用 于 缓 存 b i n l o g , 即 记 录 每 个 改 动 , 有 自 己 的 落 盘 时 机 . c o m m i t 事 务 时 u n d o l o g 文 件 : 默 认 存 于 共 享 表 空 间 中 , 也 可 单 独 存 放 于 一 个 表 空 间 . 保 存 u n d o l o g , 有 瘦 身 机 制 . r e d o l o g : 用 于 保 存 B u f f e r P o o l 发 送 的 变 动 . 防 止 B u f f e r P o o l 的 脏 页 未 刷 新 到 磁 盘 就 宕 机 导 致 数 据 丢 失 . b i n l o g : 记 录 逻 辑 表 的 改 动 , 可 用 于 集 群 同 步 数 据 , 审 计 S Q L 渗 透 , 备 份 / 恢 复 数 据 库 . u n d o l o g : 用 于 保 存 事 务 中 的 改 动 , 便 于 事 务 失 败 触 发 回 滚 时 回 滚 数 据 . r e d o l o g v s b i n l o g 一 个 ( r e d o l o g ) 保 存 数 据 页 变 动 , 而 数 据 页 是 实 际 的 物 理 空 间 加 载 到 内 存 中 的 缓 存 , 所 以 记 录 的 是 物 理 上 的 改 动 . 一 个 ( b i n l o g ) 保 存 逻 辑 上 的 改 动 , 比 如 x x 表 的 i d = x x x 的 行 的 x x 列 数 据 修 改 为 了 x x . 或 者 哪 张 表 新 增 了 一 行 , 数 据 是 x x x . . . 所 以 记 录 的 是 逻 辑 上 的 改 动 . 两 者 最 大 的 区 别 就 是 r e d o l o g 是 大 小 是 有 限 的 , 到 了 一 定 的 大 小 , 会 将 无 用 的 数 据 删 掉 , 而 b i n l o g 更 是 一 种 备 份 , 只 会 越 来 越 大 . . . 而 且 没 法 通 过 瘦 身 保 持 某 个 大 小 . . . 事 务 的 实 现 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 # 事 务 回 滚 1 . u n d o l o g : 分 i n s e r t / u p d a t e , u p d a t e 又 分 u p d a t e / d e l e t e ; 但 无 论 啥 类 型 , 目 的 都 是 辅 助 事 务 回 滚 , 其 中 i n s e r t 比 较 简 单 , 当 回 滚 时 根 据 记 录 下 的 主 键 ( 联 合 主 键 ) 通 过 索 引 找 到 对 应 行 , 删 除 即 可 . 当 回 滚 时 u p d a t e 是 根 据 记 录 的 主 键 找 到 记 录 后 , 再 根 据 记 录 下 的 修 改 过 的 列 数 据 , 反 向 修 改 回 去 . 当 回 滚 时 d e l e t e 是 根 据 记 录 的 整 行 数 据 , 然 后 i n s e r t 回 去 . 2 . 但 一 个 事 务 往 往 不 止 一 条 S Q L , 因 此 也 不 止 一 个 u n d o l o g , 每 增 加 一 条 S Q L , u n d o l o g 也 随 之 增 加 , 这 些 u n d o l o g 会 组 成 一 个 链 条 . 2 . 若 为 单 个 事 务 , 当 回 滚 时 , 情 况 比 较 简 单 , 即 只 需 从 链 条 尾 部 , 反 向 遍 历 , 往 前 回 滚 每 个 u n d o l o g 就 行 了 . 3 . 若 为 多 个 事 务 , 与 单 个 事 务 类 似 , 只 是 还 需 要 注 意 链 条 的 维 护 ( 即 维 持 链 条 的 连 通 性 ) # 隔 离 级 别 1 . 原 理 是 开 启 事 务 会 创 建 一 个 R e a d V i e w , 其 作 用 是 判 断 u n d o l o g 链 条 中 哪 些 数 据 是 可 读 的 . 2 . 先 说 R e a d V i e w , 其 存 有 当 前 事 务 i d , 事 务 启 动 时 那 会 未 提 交 的 事 务 i d 列 表 , 所 有 未 提 交 事 务 中 最 小 的 事 务 , 下 一 个 事 务 i d ; 这 里 面 未 提 交 的 事 务 是 重 点 . 3 . R R : 可 重 复 读 , 事 务 一 开 启 则 创 建 一 个 R e a d V i e w , 直 到 事 务 结 束 ; 接 着 倒 着 遍 历 链 条 , 直 到 u n d o l o g 是 比 自 己 小 且 不 在 未 提 交 事 务 中 的 事 务 记 录 时 停 下 , 仅 获 取 此 时 的 数 据 , 由 于 事 务 开 启 过 程 中 , R e a d V i e w 不 改 变 , 因 此 整 个 事 务 过 程 中 的 读 取 总 是 一 致 的 . 4 . R C : 读 已 提 交 , 和 R R 略 有 不 同 , 不 同 之 处 在 于 其 每 次 s e l e c t 都 会 重 新 获 取 R e a d V i e w , 这 使 得 若 有 事 务 提 交 后 , 再 s e l e c t 数 据 , 则 生 成 的 R e a d V i e w 数 据 会 发 生 变 化 ( 即 未 提 交 事 务 i d 列 表 中 少 了 刚 刚 提 交 的 事 务 ) . 因 此 同 样 的 逻 辑 进 行 判 断 , R C 能 读 取 到 已 提 交 的 事 务 的 改 动 . # P S : 居 然 问 我 读 未 提 交 ? ? 那 不 是 不 需 要 R e a d V i e w 就 能 实 现 吗 . . . 图 为 回 滚 对 应 的 u n d o 链 ; 以 及 隔 离 级 别 原 理 的 R e a d V i e w . M y S Q L 速 记 S Q L 优 化 索 引 原 理 M y S Q L 索 引 一 般 选 择 B + 树 做 为 数 据 结 构 存 储 . B + 树 的 优 点 是 , 对 文 件 I O 的 访 问 次 数 控 制 在 3 次 , 保 证 速 度 的 同 时 , 能 存 储 千 万 行 数 据 . 索 引 1 2 3 1 . 对 常 用 列 添 加 索 引 , 视 具 体 情 况 选 择 单 一 索 引 或 复 合 索 引 ( 一 般 为 复 合 ) 2 . 通 过 E x p l a i n 语 句 分 析 执 行 计 划 , 将 t y p e 提 升 到 至 少 i n d e x 级 别 . 3 . 通 过 E x p l a i n 语 句 分 析 执 行 计 划 , 将 e x t r a 中 U s i n g f i l e s o r t 消 除 ( 排 序 列 加 索 引 ) , U s i n g j o i n b u f f e r 消 除 ( 通 过 给 关 联 表 的 关 联 列 加 索 引 ) , U s i n g t e m p o r a r y ( 一 般 通 过 分 组 列 加 索 引 ) , U s i n g w h e r e ( 根 据 最 左 原 则 对 条 件 列 加 复 合 索 引 ) 事 务 1 2 3 4 5 A C I D : A : 原 子 性 , 多 个 操 作 要 么 都 做 , 要 么 都 不 做 C : 一 致 性 , 数 据 库 文 件 的 状 态 必 须 从 一 个 一 致 性 状 态 到 另 一 个 一 致 性 状 态 . I : 隔 离 性 , 事 物 之 间 相 互 隔 离 , 互 不 影 响 . D : 持 续 性 , 一 个 事 务 一 但 提 交 , 则 对 数 据 库 的 改 变 是 永 久 的 . 隔 离 级 别 1 2 3 4 1 . 读 未 提 交 : 可 读 取 其 他 未 提 交 事 务 的 执 行 结 果 ( 如 更 新 了 某 个 字 段 ) , 可 能 会 造 成 读 取 错 误 的 数 据 ( 未 提 交 的 事 务 回 滚 了 ) , 造 成 脏 读 . 2 . 读 已 提 交 : 可 读 取 其 他 已 提 交 事 务 的 执 行 结 果 , 2 次 读 取 数 据 还 是 可 能 不 一 致 ( 其 他 事 务 又 提 交 了 ) , 造 成 不 可 重 复 读 . 3 . 可 重 复 读 : 确 保 同 一 事 务 内 多 次 读 取 数 据 时 , 会 看 到 相 同 的 数 据 . 但 可 能 造 成 幻 读 , 如 批 量 修 改 登 录 密 码 后 , 另 一 个 事 务 新 增 了 一 条 记 录 , 导 致 新 纪 录 未 修 改 . 4 . 串 行 化 : 事 务 串 行 化 执 行 , 效 率 低 . M y S Q L 默 认 隔 离 级 别 可 重 读 读 数 据 库 锁 锁 原 理 1 2 行 锁 : 分 为 排 它 锁 ( X ) 和 共 享 锁 ( S ) . 即 写 锁 和 读 锁 . 表 锁 : 分 为 元 数 据 锁 ( M D L ) 和 表 锁 . 锁 触 发 方 式 1 2 行 锁 : 隐 式 ( 条 件 带 有 索 引 则 锁 对 应 列 , 不 带 索 引 则 锁 全 部 行 , R R 总 会 带 有 G A P 锁 , R C 不 会 ) , 显 式 ( 使 用 f o r u p d a t e , l o c k i n s h a r e m o d e ) 表 锁 : 隐 式 ( 对 整 个 表 不 带 条 件 进 行 增 删 改 , 或 任 何 D D L 操 作 ) 显 示 ( 使 用 f o r u p d a t e , l o c k i n s h a r e m o d e ) S p r i n g G a t e w a y 源 码 笔 记 发 表 于 2 0 2 1 0 1 3 0 更 新 于 2 0 2 1 0 3 2 8 分 类 于 j a v a , s o u r c e c o d e , s p r i n g c l o u d D i s q u s : S p r i n g G a t e w a y 源 码 笔 记 关 键 类 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 4 7 4 8 4 9 5 0 5 1 5 2 1 . D i s p a t c h e r H a n d l e r S p r i n g W e b f l u x 的 核 心 类 , 负 责 协 调 H a n d l e r M a p p i n g 和 H a n d l e r A d a p t e r 2 . H a n d l e r M a p p i n g S p r i n g W e b f l u x 的 核 心 类 , 负 责 根 据 请 求 信 息 查 找 h a n d l e r 3 . H a n d l e r A d a p t e r S p r i n g W e b f l u x 的 核 心 类 , 负 责 执 行 h a n d l e r 4 . R o u t e P r e d i c a t e H a n d l e r M a p p i n g S p r i n g G a t e w a y 实 现 的 H a n d l e r M a p p i n g , 负 责 根 据 谓 词 查 找 R o u t e 对 象 并 返 回 h a n d l e r ( F i l t e r i n g W e b H a n d l e r ) 5 . F i l t e r i n g W e b H a n d l e r 是 一 个 h a n d l e r 用 于 获 取 r o u t e 对 象 的 信 息 ( 主 要 是 G a t e w a y F i l t e r ) , 然 后 封 装 所 有 拦 截 器 ( 包 括 G l o b a l F i l t e r ) 到 D e f a u l t G a t e w a y F i l t e r C h a i n , 挨 个 执 行 , 倒 叙 回 归 . 6 . R o u t e P r e d i c a t e F a c t o r y 谓 词 实 现 类 的 工 厂 类 负 责 创 建 具 体 的 谓 词 工 厂 ( 如 P a t h , M e t h o d , B e f o r e 等 ) a p p l y ( ) 返 回 一 个 P r e d i c a t e 7 . P r e d i c a t e 定 义 了 t e s t 方 法 , 返 回 B o o l e a n 值 , t r u e 代 表 匹 配 , f a l s e 代 表 不 匹 配 ( 指 匹 配 R o u t e ) 8 . G l o b a l F i l t e r / G a t e w a y F i l t e r 定 义 了 一 个 拦 截 方 法 , 可 拦 截 请 求 进 行 相 应 处 理 9 . A s y n c P r e d i c a t e / A n d A s y n c P r e d i c a t e A s y n c P r e d i c a t e 本 质 上 是 一 个 方 法 ( 单 方 法 接 口 ) , 方 法 被 调 用 时 会 调 用 保 存 的 P r e d i c a t e 类 型 字 段 的 t e s t ( ) 方 法 . A n d A s y n c P r e d i c a t e 是 一 个 左 右 结 构 的 A s y n c P r e d i c a t e , 进 行 判 断 时 先 判 断 左 边 , 再 判 断 右 边 若 不 断 的 a n d , 会 形 成 树 结 构 . 所 以 执 行 时 类 似 遍 历 二 叉 树 . 1 0 . R o u t e D e f i n i t i o n R o u t e L o c a t o r 负 责 从 不 同 的 L o c a t o r ( 如 配 置 文 件 ) 获 取 R o u t e D e f i n i t i o n , 并 负 责 将 R o u t e D e f i n i t i o n 转 成 R o u t e 对 象 1 1 . R o u t e D e f i n i t i o n 包 含 有 路 由 的 所 有 配 置 信 息 , 含 谓 词 , 拦 截 器 , i d , u r l 等 等 , 但 都 是 字 符 串 . 1 2 . R o u t e 含 有 的 配 置 信 是 转 化 好 了 的 , 如 P r e d i c a t e 和 G a t e w a y F i l t e r . 1 3 . N e t t y R o u t i n g F i l t e r 使 用 n e t t y 发 送 h t t p / w s s 等 请 求 . 1 4 . G a t e w a y F i l t e r F a c t o r y 拦 截 器 实 现 类 的 工 厂 类 负 责 创 建 具 体 的 G a t e w a y F i l t e r 对 象 . 1 5 . A b s t r a c t C o n f i g u r a b l e 负 责 处 理 谓 词 的 配 置 和 拦 截 器 的 配 置 转 化 成 不 同 的 C l a s s 配 置 . 实 际 上 由 s h o r t c u t F i e l d O r d e r 属 性 配 合 B i n d e r 实 现 . 即 按 s h o r t c u t F i e l d O r d e r 配 置 的 字 段 列 表 , 按 顺 序 从 P r o p e r t y S o u r c e 中 读 取 数 据 进 行 绑 定 ; 而 P r o p e r t y S o u r c e 则 是 从 R o u t e D e f i n i t i o n 的 配 置 信 息 加 入 到 M a p 后 再 用 M a p C o n f i g u r a t i o n P r o p e r t y S o u r c e 包 装 M a p 而 得 到 的 . 总 结 : 除 了 谓 词 工 厂 和 拦 截 器 工 厂 这 块 的 实 现 复 杂 , 其 他 都 算 比 较 简 单 , 哪 怕 响 应 式 编 程 的 代 码 到 处 都 是 , 也 还 是 可 以 大 致 的 理 解 代 码 的 意 思 . 这 两 个 工 厂 其 实 基 本 是 同 一 套 逻 辑 , 同 一 套 代 码 , 就 是 有 一 个 接 口 名 不 同 , 然 后 其 作 用 也 不 同 , 但 很 相 似 . 谓 语 的 实 现 原 理 ( 如 何 判 断 哪 些 请 求 该 走 哪 个 道 ) ? 1 2 3 4 5 6 7 8 9 1 . S p r i n g g a t e w a y 基 于 S p r i n g w e b f l u x , 因 此 会 执 行 D i s p a t c h e r H a n d l e r , 这 是 一 个 W e b H a n d l e r , 所 以 会 调 用 D i s p a t c h e r H a n d l e r . h a n d l e ( ) , 这 个 类 通 过 H a n d l e r M a p p i n g 查 找 对 应 的 h a n d l e r 来 执 行 . 2 . 在 初 始 化 时 会 从 容 器 中 查 找 H a n d l e r M a p p i n g 类 型 的 b e a n , 用 于 查 找 h a n d l e r ; 而 g a t e w a y 实 现 了 一 个 R o u t e P r e d i c a t e H a n d l e r M a p p i n g ( G a t e w a y A u t o C o n f i g u r a t i o n 中 注 册 进 去 的 ) ; 因 此 这 里 是 入 口 ! ! ! 3 . 再 看 R o u t e P r e d i c a t e H a n d l e r M a p p i n g 的 逻 辑 , 其 通 过 继 承 抽 象 类 , 因 此 会 在 g e t H a n d l e r I n t e r n a l ( ) 中 获 取 h a n d l e r . 接 着 回 顾 下 R o u t e 对 象 的 获 取 . 4 . 其 使 用 R o u t e D e f i n i t i o n R o u t e L o c a t o r 对 象 来 调 用 P r o p e r t i e s R o u t e D e f i n i t i o n L o c a t o r . g e t R o u t e D e f i n i t i o n s ( ) 获 取 R o u t e D e f i n i t i o n 集 合 对 象 ( 这 里 还 有 好 几 个 不 同 的 L o c a t o r ) , 然 后 在 R o u t e D e f i n i t i o n R o u t e L o c a t o r . c o n v e r t T o R o u t e ( ) 中 将 R o u t e D e f i n i t i o n 转 成 R o u t e 对 象 , 此 时 会 调 用 R o u t e D e f i n i t i o n R o u t e L o c a t o r . c o m b i n e P r e d i c a t e s ( ) 将 R o u t e D e f i n i t i o n 中 的 P r e d i c a t e D e f i n i t i o n 集 合 信 息 转 成 了 A s y n c P r e d i c a t e 对 象 集 合 . 这 个 A s y n c P r e d i c a t e 是 通 过 解 析 谓 词 字 符 串 , 根 据 谓 词 名 称 获 取 工 厂 类 ( P r e d i c a t e F a c t o r y ) 再 调 用 相 应 工 厂 类 的 方 法 ( a p p l y 方 法 ) 生 成 含 相 应 逻 辑 判 断 的 G a t e w a y P r e d i c a t e 类 ( 判 断 逻 辑 在 t e s t 方 法 中 ) ; 顺 带 一 提 谓 词 配 置 信 息 是 从 a p p l y 的 参 数 中 传 递 过 来 的 . 5 . S p r i n g G a t e w a y 默 认 注 入 了 很 多 工 厂 ( 见 G a t e w a y A u t o C o n f i g u r a t i o n ) , 如 H o s t , P a t h , M e t h o d , Q u e r y , C o o k i e 等 等 . 6 . 这 样 在 R o u t e P r e d i c a t e H a n d l e r M a p p i n g . l o o k u p R o u t e ( ) 中 的 r . g e t P r e d i c a t e ( ) . a p p l y ( e x c h a n g e ) 就 会 执 行 R o u t e 中 的 谓 词 判 断 , 仅 保 留 匹 配 的 R o u t e , 然 后 再 剩 下 的 R o u t e 中 取 第 一 个 返 回 . 最 后 将 R o u t e 对 象 存 到 e x c h a n g e 中 , 然 后 返 回 F i l t e r i n g W e b H a n d l e r . 7 . 这 是 一 个 W e b H a n d l e r , 会 由 自 带 的 适 配 器 S i m p l e H a n d l e r A d a p t e r 执 行 , 即 调 用 其 h a n d l e 方 法 . 8 . F i l t e r i n g W e b H a n d l e r 从 e x c h a n g e 中 取 出 R o u t e 对 象 , 在 将 g l o b a l F i l t e r 和 g a t e w a y F i l t e r 放 到 集 合 中 ( 相 当 于 链 ) 再 递 归 调 用 所 有 F i l t e r ; 其 中 有 几 个 F i l t e r 会 执 行 请 求 , 即 将 请 求 分 发 到 指 定 地 址 . 如 N e t t y R o u t i n g F i l t e r ( 见 G a t e w a y A u t o C o n f i g u r a t i o n ) . 9 . 到 此 以 将 S p r i n g g a t e w a y 接 收 到 的 请 求 根 据 谓 语 匹 配 对 应 的 R o u t e ( 路 由 ) 再 执 行 所 有 的 F i l t e r 后 请 求 r o u t e 配 置 的 地 址 . 总 结 : 从 S p r i n g w e b f l u x 的 入 口 , 先 g e t H a n d l e r ( ) , 得 到 的 是 返 回 值 F i l t e r i n g W e b H a n d l e r , 这 个 返 回 值 会 被 S i m p l e H a n d l e r A d a p t e r 执 行 , 但 与 谓 词 的 逻 辑 无 关 ; 但 g e t H a n d l e r ( ) 还 将 配 置 文 件 ( 以 及 其 他 地 方 ) 获 取 到 的 R o u t e D e f i n i t i o n 转 成 R o u t e 对 象 , 同 时 也 将 R o u t e D e f i n i t i o n 中 的 P r e d i c a t e D e f i n i t i o n 转 换 成 了 P r e d i c a t e , 再 将 多 个 P r e d i c a t e 组 成 树 结 构 变 成 一 个 A s y n c P r e d i c a t e ; 然 后 调 用 A s y n c P r e d i c a t e 遍 历 执 行 每 个 谓 词 判 断 . 有 一 个 返 回 f a l s e , 则 整 个 结 果 返 回 f a l s e ( 指 a n d 相 连 ) . 如 此 便 完 成 了 根 据 谓 词 判 断 是 否 匹 配 R o u t e ! ! 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 4 5 4 6 g r a p h T B A 1 ( D i s p a t c h e r H a n d l e r ) A 2 ( H a n d l e r M a p p i n g # g e t H a n d l e r ) A 3 ( R o u t e P r e d i c a t e H a n d l e r M a p p i n g # g e t H a n d l e r I n t e r n a l ) A 4 ( R o u t e D e f i n i t i o n R o u t e L o c a t o r # g e t R o u t e D e f i n i t i o n s ) A 5 ( R o u t e D e f i n i t i o n ) A 6 ( R o u t e D e f i n i t i o n R o u t e L o c a t o r # c o n v e r t T o R o u t e ) A 7 ( R o u t e ) A 8 ( R o u t e D e f i n i t i o n R o u t e L o c a t o r # c o m b i n e P r e d i c a t e s ) A 9 ( P r e d i c a t e D e f i n i t i o n # 谓 词 配 置 信 息 ) A 0 ( A s y n c P r e d i c a t e # 可 执 行 的 谓 词 ) B 0 ( P r e d i c a t e F a c t o r y # a p p l y ) B 1 ( G a t e w a y P r e d i c a t e # t e s t 谓 词 判 断 ) B 2 ( G l o b a l F i l t e r 含 N e t t y R o u t i n g F i l t e r ) B 3 ( F i l t e r i n g W e b H a n d l e r ) B 4 ( S i m p l e H a n d l e r A d a p t e r # 适 配 器 ) B 5 ( D e f a u l t G a t e w a y F i l t e r C h a i n # 拦 截 器 链 ) A 1 调 用 A 2 A 2 调 用 子 类 A 3 A 3 后 触 发 所 有 A 0 A 0 通 过 B 1 A 4 从 配 置 文 件 等 地 方 获 得 A 5 A 5 通 过 A 6 A 6 还 调 用 A 8 A 8 将 A 9 A 9 通 过 调 用 B 0 B 0 得 到 P r e d i c a t e 对 象 , 再 由 多 个 对 象 组 合 得 到 A 0 B 1 返 回 匹 配 的 A 7 A 7 将 其 存 到 e x c h a n g e 对 象 中 , 然 后 返 回 B 3 B 4 负 责 执 行 B 3 B 3 从 e x c h a n g e 对 象 获 取 R o u t e 后 再 将 B 2 B 2 打 包 封 装 成 一 个 B 5 B 5 最 终 会 执 行 G 1 ( N e t t y R o u t i n g F i l t e r # 发 起 H T T P 请 求 ) A 1 调 用 B 4 与 L o a d B a l a n c e r 对 接 步 骤 1 2 1 . 上 面 讲 到 执 行 所 有 的 F i l t e r , 那 么 除 了 用 户 配 置 的 G a t e w a y F i l t e r , G a t e w a y 配 置 的 全 局 F i l t e r 也 会 执 行 ( 见 G a t e w a y A u t o C o n f i g u r a t i o n ) ; 而 负 责 处 理 l b : / / 的 F i l t e r 是 R e a c t i v e L o a d B a l a n c e r C l i e n t F i l t e r ( 见 G a t e w a y R e a c t i v e L o a d B a l a n c e r C l i e n t A u t o C o n f i g u r a t i o n ) 2 . 具 体 方 法 为 R e a c t i v e L o a d B a l a n c e r C l i e n t F i l t e r . f i l t e r ( ) , 其 逻 辑 是 取 出 h o s t , 调 用 L o a d B a l a n c e r 的 c h o o s e ( ) 获 取 S e r v i c e I n s t a n c e , 然 后 将 u r l p u t 回 e x c h a n g e 的 上 下 文 中 存 起 来 即 可 . 拦 截 器 的 执 行 方 式 ? 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 2 9 3 0 3 1 3 2 3 3 3 4 3 5 3 6 3 7 3 8 3 9 4 0 4 1 4 2 4 3 4 4 / / 拦 截 链 是 肯 定 的 , 所 有 的 F i l t e r 都 可 以 先 执 行 自 己 逻 辑 , 再 使 用 c h a i n 触 发 下 一 个 F i l t e r 直 到 无 拦 截 器 / / 然 后 开 始 返 回 , 因 为 是 顺 序 进 入 , 所 以 是 倒 叙 返 回 / / 返 回 后 正 常 是 一 路 不 断 往 回 返 回 , 但 你 的 F i l t e r 也 可 以 在 调 用 c h a i n 的 时 候 不 直 接 返 回 , 而 是 先 暂 存 返 回 值 , 再 通 过 e x c h a n g e 对 象 ( 此 时 执 行 了 其 他 F i l t e r 包 括 实 际 请 求 也 执 行 了 , 因 此 会 有 响 应 数 据 ) 取 出 响 应 数 据 ( 或 返 回 值 ) , 进 行 修 改 , 再 r e t u r n 暂 存 的 变 量 . p r i v a t e s t a t i c c l a s s D e f a u l t G a t e w a y F i l t e r C h a i n i m p l e m e n t s G a t e w a y F i l t e r C h a i n p r i v a t e D e f a u l t G a t e w a y F i l t e r C h a i n ( D e f a u l t G a t e w a y F i l t e r C h a i n p a r e n t , i n t i n d e x ) p u b l i c L i s t g e t F i l t e r s ( ) @ O v e r r i d e p u b l i c M o n o f i l t e r ( S e r v e r W e b E x c h a n g e e x c h a n g e ) e l s e } ) ; } } S p r i n g C l o u d A l i b a b a S e n t i n e l 源 码 笔 记 发 表 于 2 0 2 1 0 1 3 0 更 新 于 2 0 2 1 0 3 2 8 分 类 于 j a v a , s p r i n g c l o u d a l i b a b a , s o u r c e c o d e D i s q u s : S e n t i n e l 与 O p e n f e i g n 整 合 关 键 类 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 1 . S e n t i n e l F e i g n A u t o C o n f i g u r a t i o n 注 入 了 F e i g n . B u i l d e r ( 即 S e n t i n e l F e i g n . B u i l d e r ) 到 容 器 中 2 . S e n t i n e l F e i g n . B u i l d e r 重 写 b u i l d 方 法 注 入 s e n t i n e l 的 I n v o c a t i o n H a n d l e r ( S e n t i n e l I n v o c a t i o n H a n d l e r ) 3 . S e n t i n e l I n v o c a t i o n H a n d l e r 拦 截 方 法 , 包 装 方 法 为 一 个 资 源 , 进 行 流 控 降 级 等 处 理 4 . S e n t i n e l A u t o C o n f i g u r a t i o n 注 入 了 S e n t i n e l R e s o u r c e A s p e c t 来 支 持 @ S e n t i n e l R e s o u r c e 注 解 注 入 了 S e n t i n e l B e a n P o s t P r o c e s s o r 来 处 理 @ S e n t i n e l R e s t T e m p l a t e 注 入 了 S e n t i n e l D a t a S o u r c e H a n d l e r 来 加 载 各 种 数 据 源 为 规 则 配 置 5 . S e n t i n e l R e s o u r c e A s p e c t 对 加 了 @ S e n t i n e l R e s o u r c e 的 方 法 添 加 @ A r o u n d 通 知 , 包 围 原 方 法 已 实 现 流 控 降 级 等 处 理 . 6 . S e n t i n e l B e a n P o s t P r o c e s s o r 对 加 了 @ S e n t i n e l R e s t T e m p l a t e 注 解 的 R e s t T e m p l a t e b e a n , 添 加 一 个 S e n t i n e l P r o t e c t I n t e r c e p t o r 7 . S e n t i n e l D a t a S o u r c e H a n d l e r 解 析 s p r i n g . c l o u d . s e n t i n e l . d a t a s o u r c e 的 配 置 , 加 载 配 置 的 规 则 到 S e n t i n e l 中 . 8 . S e n t i n e l P r o t e c t I n t e r c e p t o r 包 装 R e s t T e m p l a t e 的 请 求 , 使 其 可 被 流 控 降 级 等 操 作 . 整 合 步 骤 1 2 3 4 5 6 1 . F e i g n 那 边 的 步 骤 是 , 先 从 容 器 中 获 取 F e i g n . B u i l d e r 对 象 , 并 且 F e i g n C o n t e x t 也 会 注 入 一 个 默 认 的 B u i l d e r 对 象 , 但 是 毕 竟 是 子 容 器 , 优 先 级 没 有 父 容 器 高 ( 加 载 配 置 更 后 , 所 以 @ C o n d i t i o n a l O n M i s s i n g B e a n 触 发 , 子 容 器 就 不 注 册 了 ) . 因 此 我 们 在 父 容 器 中 中 配 置 一 个 B u i l d e r 就 能 进 行 对 接 . 2 . F e i g n 的 实 现 是 通 过 J D K 生 成 一 个 代 理 对 象 拦 截 方 法 来 构 造 并 执 行 H T T P 请 求 , 因 此 其 需 要 一 个 I n v o c a t i o n H a n d l e r 来 拦 截 配 置 ; 在 F e i g n 中 , 通 过 字 段 i n v o c a t i o n H a n d l e r F a c t o r y 来 创 建 这 个 I n v o c a t i o n H a n d l e r , 所 以 我 们 注 入 自 己 实 现 的 B u i l d e r 需 要 设 置 这 个 字 段 . 3 . 即 S e n t i n e l F e i g n . B u i l d e r . b u i l d ( ) 中 调 用 s u p e r . i n v o c a t i o n H a n d l e r F a c t o r y ( x x x ) 来 设 置 . 4 . x x x 是 匿 名 内 部 类 , 直 接 看 c r e a t e 方 法 , 这 里 根 据 @ F e i g n C l i e n t 注 解 的 配 置 ( f a l l b a c k / f a l l b a c k F a c t o r y ) 创 建 了 一 个 S e n t i n e l I n v o c a t i o n H a n d l e r 5 . S e n t i n e l I n v o c a t i o n H a n d l e r . i n v o k e ( ) 的 逻 辑 是 使 用 S p h U . e n t r y ( ) 包 围 f e i g n 生 成 的 m e t h o d ( 这 个 m e t h o d 是 干 正 事 的 : 执 行 负 载 均 衡 和 发 送 H t t p 请 求 ) , 这 就 对 这 个 m e t h o d 进 行 流 量 控 制 了 ; 然 后 还 在 c a t c h 中 处 理 f a l l b a c k . 6 . 至 此 , 与 f e i g n 的 对 接 就 完 成 了 总 结 : 新 建 一 个 B u i l d e r 令 生 成 的 F e i g n 对 象 持 有 我 们 指 定 的 i n v o c a t i o n H a n d l e r F a c t o r y , 使 其 创 建 代 理 对 象 时 使 用 我 们 创 建 的 S e n t i n e l I n v o c a t i o n H a n d l e r 拦 截 对 象 方 法 ; 这 样 就 把 方 法 的 执 行 包 围 起 来 , 进 行 流 量 控 制 和 熔 断 降 级 ( c a t c h 异 常 调 用 f a l l b a c k ) 了 . 1 2 3 4 5 6 7 8 9 1 0 1 1 1 2 1 3 1 4 1 5 1 6 1 7 1 8 1 9 2 0 2 1 2 2 2 3 2 4 2 5 2 6 2 7 2 8 g r a p h T B A 1 ( F e i g n C l i e n t s R e g i s t r a r ) A 2 ( F e i g n C l i e n t F a c t o r y B e a n ) A 3 ( 真 实 X x x S e r v i c e 接 口 ) A 4 ( S e n t i n e l I n v o c a t i o n H a n d l e r ) A 5 ( S e n t i n e l F e i g n A u t o C o n f i g u r a t i o n ) A 6 ( F e i g n . B u i l d e r 即 S e n t i n e l F e i g n . B u i l d e r ) A 7 ( F e i g n 对 象 ) A 8 ( 代 理 对 象 ) A 9 ( s e n t i n e l 将 方 法 当 做 资 源 进 行 拦 截 ) B 1 ( 在 c a t c h 中 处 理 f a l l b a c k 熔 断 逻 辑 ) A 1 扫 描 F e i g n C l i e n t 注 解 , 注 入 A 2 A 3 被 c o n t r o l l e r 调 用 , 触 发 A 4 A 5 注 入 了 一 个 A 6 A 2 调 用 A 6 A 6 的 b u i l d 方 法 创 建 一 个 A 7 A 7 调 用 n e w I n s t a n c e 方 法 创 建 了 含 A 4 A 8 用 来 代 替 A 3 A 4 的 A 8 A 4 调 用 A 9 A 9 然 后 B 1 整 合 F e i g n C i r c u i t B r e a k e r . B u i l d e r 步 骤 即 不 注 入 自 己 的 B u i l d e r , 使 用 o p e n f e i g n 提 供 的 B u i l d e r , 通 过 扩 展 C i r c u i t B r e a k e r F a c t o r y ( 即 扩 展 C i r c u i t B r e a k e r ) 来 实 现 流 控 降 级 ( 倒 是 f a l l b a c k 的 处 理 便 轻 松 了 不 少 ) 1 2 3 4 1 . 在 S e n t i n e l C i r c u i t B r e a k e r A u t o C o n f i g u r a t i o n 注 入 一 个 C i r c u i t B r e a k e r F a c t o r y . 2 . 在 O p e n f e i g n 中 , 会 调 用 其 c r e a t e ( ) 创 建 得 到 一 个 C i r c u i t B r e a k e r ( 即 S e n t i n e l C i r c u i t B r e a k e r ) 3 . 接 着 会 在 F e i g n C i r c u i t B r e a k e r I n v o c a t i o n H a n d l e r . i n v o k e ( ) 中 获 取 这 个 C i r c u i t B r e a k e r , 调 用 其 r u n ( ) 将 要 执 行 的 m e t h o d 交 给 S e n t i n e l C i r c u i t B r e a k e r 来 处 理 . 4 . S e n t i n e l C i r c u i t B r e a k e r 中 r u n ( ) 的 实 现 就 是 简 单 的 S p h U . e n t r y ( ) 来 包 装 方 法 为 资 源 进 行 流 控 降 级 , 至 于 f a l l b a c k 则 直 接 调 用 a p p l y 交 由 O p e n f e i g n 处 理 . 总 结 : 不 写 自 己 的 B u i l d e r , 简 单 多 了 ! 主 要 是 去 掉 了 f a l l b a c k 相 关 配 置 的 获 取 与 处 理 . 1 2 3 文 章 目 录 站 点 概 览 g u d q s 7 心 累 没 钱 躺 尸 中 2 5 日 志 1 8 分 类 2 2 标 签 G i t H u b E M a i l © 2 0 2 1 g u d q s 7 由 H e x o & N e x T . P i s c e s 强 力 驱 动 琼 I C P 备 2 0 2 4 0 3 9 3 1 8 号 琼 公 网 安 备 4 6 0 1 0 0 0 2 0 0 0 3 8 2

站点概括

关于gudqs7.cn说明:
gudqs7.cn由网友主动性提交被整理收录的,仅提供gudqs7.cn的基础信息并免费向大众网友展示,gudqs7.cn的是IP地址:- 地址:-,gudqs7.cn的百度权重为0、百度手机权重为0、百度收录为0条、360收录为0条、搜狗收录为0条、谷歌收录为0条、百度来访流量大约在-之间、百度手机端来访流量大约在-之间、gudqs7.cn的备案号是-、备案人叫-、被百度收录的关键词有0个、手机端关键词有0个、该站点迄今为止已经创建未知。

内容声明:

1、本站收录的内容来源于大数据收集,版权归原网站所有!
2、本站收录的内容若侵害到您的利益,请联系我们进行删除处理!
3、本站不接受违规信息,如您发现违规内容,请联系我们进行清除处理!
4、本文地址:https://www.xingzitai.com/xxzddh/1103bd39b25c8ffaa178.html,复制请保留版权链接!


温馨小提示:在您的网站做上本站友情链接,访问一次即可自动收录并自动排在本站第一位!
您可能还喜欢

80s手机电影-80s电影天堂-最新手机电影在线观看-80s电影网

80s电影网(www.ryyhdz.com)为广大用户提供追剧看片的免费平台,最新高清热播影视剧全部无广告免费在线观看,超多好看的影片作品都能在这里找到,欢迎广大影迷来到80s.

广东七大洲|LED体育照明|LED球场灯|国家标准制定企业||体育照明解决方案|足球场照明|篮球场照明|综合馆照明|羽毛球场照明|网球场照明|LED球场灯|体育场-广东七大洲实业有限公司

广东七大洲实业有限公司是国内LED体育照明的高新技术企业。公司主要从事LED体育照明等LED球场灯的研发与设计生产与销售。产品涵盖足球场照明、综合馆照明、冰球场照明、羽毛球场照明、篮球场照明、高尔夫球场照明、网球场照明等。公司产品经权威机构检测,并取得第三方检测报获得RoHsC-CK、CE、IEC62471光学认证。 中国的七大洲,照亮7个大洲

深圳云易智慧科技有限公司_共享机_消费机_电控制_智能水电_身份识别

深圳云易智慧科技有限公司是一家物联网方案提供商,为客户提供从硬件、软件、APP、云服务及应用平台的一体化服务。为企业和机构提供从产品定义、研发、生产、销售、服务到产品运营的全链路解决方案。

童乐福儿童网 - 有趣的幼儿科学小实验、科技小制作、发明

童乐福儿童网(www.tonglefu.com)致力于少儿科学知识的讲解,以有趣的幼儿科学小实验、儿童科技小制作为主,结合幼儿最想知道的科普知识,让少儿、小学生能够通过科学小实验、小制作、小发明等直观的方式读懂科普知识、了解科学。童乐福儿童网力争做最好的少儿科普知识网站。

明星衡器

南昌衡中衡电子有限公司成立于1995年8月,是集研发、生产、销售、服务为一体的浙商民营企业,公司以大型工业衡器和各种特殊要求的工业专用衡器及电子智能仪表工业控制计算机为主导产品,采用先进的制衡技术、生产设备和管理经验,结合中国工商业应用环境,专业开发制造各类电子衡器,产品远销华东、华南、华中、华北和西南等地,并出口海外。

龙旗游戏

龙旗游戏

常州梦之达汽车电机有限公司_汽车发电机

常州梦之达汽车电机有限公司常州梦之达汽车电机有限公司创始于2000年,是一家专业生产汽车发电机,起动机及各种零部件的专业公司。本公司生产的之达牌汽车发电机起动机,品种齐全,主要配件经过严格的筛选及精细的组装加工,配有设备HSFD-3型发电机性能测试控制台、HSFD-8型发电机常州梦之达汽车电机有限公司成立于2000年,是一家专业生产汽车发电机,起动机及各种零部件的公司。 本公司生产的之达牌汽车发电机起动机,品种齐全,主要配件经过严格的筛选及精细的组装加工,配有设备HSFD-3型发电机性能测试控制台、HSFD-8型发电机高温急变速性能试验台等,使产品技术标准达到国内外先进水平。

企业宣传册印刷_企业画册印刷_深圳宣传海报印刷厂-卓艺印刷

深圳市卓艺印刷制品有限公司是一家提供企业宣传册印刷,企业画册印刷,宣传海报印刷,宣传册印刷,月饼礼盒定制,不干胶印刷,包装礼盒定制等印刷方案的深圳印刷厂。

随机文章