1. Spring 单例模式的底层逻辑解析
在 Spring 生态中,单例(singleton)模式就像空气一样无处不在却又容易被忽视。作为 Spring 容器的默认作用域,它背后蕴含着对现代服务端架构的深刻理解。让我们先从一个实际案例开始:
假设你正在开发一个电商平台的订单服务,其中 OrderService 会被频繁调用。如果采用 prototype 作用域,每次请求都会创建一个新实例。在 QPS 1000 的场景下,意味着每秒要初始化 1000 个包含完整依赖注入、AOP 代理的复杂对象。而使用 singleton 时,无论多少请求都共享同一个实例。
关键区别:单例模式下,Spring 容器启动时就会完成 Bean 的实例化和依赖注入,后续所有请求都复用这个实例。这种设计直接减少了 99.9% 的对象创建开销。
1.1 无状态服务的本质特征
现代服务端应用的核心特征就是无状态(stateless),这恰好与单例模式完美契合:
-
无状态服务的特点:
- 不保存客户端会话信息
- 每个请求相互独立
- 所有必要数据都来自请求参数或外部存储
-
典型无状态组件:
java复制@Service public class PaymentService { // 没有成员变量存储状态 public PaymentResult process(PaymentRequest request) { // 仅使用参数和外部资源 } }
这种设计下,单例不仅安全,反而是最优解。因为无论创建多少个实例,它们的行为都完全一致,那为何要浪费资源重复创建?
1.2 对象创建的真实成本分析
很多开发者低估了 Spring Bean 的创建成本。让我们用数据说话:
| 操作 | 耗时(纳秒) | 说明 |
|---|---|---|
| 普通 new 对象 | 10-100 | 简单 POJO 的创建时间 |
