1. Singleton 的工程取舍中进程级、classloader 级、容器级的生命周期反模式
讨论 Singleton 模式的工程取舍,以及进程级、classloader 级、容器级生命周期的反模式问题?
- Singleton 的利弊
- 生命周期级别问题
- 反模式与替代
Singleton 确保全局唯一实例,但常被批评为反模式:隐藏依赖、难以测试、全局可变状态。生命周期问题:进程级 Singleton 在每个 JVM 进程各有一份,多进程部署下失去"全局唯一";classloader 级 Singleton 依赖 classloader 作用域,多个 classloader 加载同一类会产生多个实例,易出 bug;容器级 Singleton(如 Spring 单例)由 IoC 容器管理生命周期,作用域可控,是较健康的"单例"。工程取舍:慎用"手写 getInstance() 单例",尽量用容器管理单例(依赖注入 + 单例作用域)或静态无状态工具。反模式的核心是"全局可访问的可变状态 + 隐藏依赖"。
Singleton 的真正问题不是"唯一实例",而是"全局可访问 + 隐藏依赖 + 难测试"。容器级单例(DI 管理)保留单例特性又显式依赖,可测试。手写单例应避免携带可变状态。理解生命周期级别(进程/classloader/容器)是诊断单例 bug 的关键。