单例模式(设计模式层面)
单例模式是一种设计模式,目的是保证一个类在整个应用中只有一个实例。通常通过私有化构造方法 + 静态方法返回唯一实例来实现。以 Class 为维度,无论在何处获取,返回的都是同一个对象(内存地址相同)。其作用域是 JVM 级别,只要类加载器相同,实例就唯一。
单例 Bean(Spring 容器层面)
Spring 的单例 Bean 是容器管理的概念,以 BeanName 为主键存储在单例池(singletonObjects)中。同一个类如果注册了多个不同名称的 Bean,容器中就会存在多个实例,因此它并不是严格意义上的单例模式。其作用域是 容器级别,不同的 ApplicationContext 容器即使 BeanName 相同,也会各自持有独立的实例。
两者核心区别对比:
| 单例模式 | 单例 Bean | |
|---|---|---|
| 唯一性依据 | Class(类型) | BeanName(名称) |
| 作用域 | JVM / ClassLoader | Spring 容器 |
| 能否多实例 | 不能 | 能(不同 BeanName) |
| 实现方式 | 私有构造 + 静态持有 | 容器统一管理 |
| 默认行为 | 需手动实现 | Spring Bean 默认就是单例 |
一句话总结:单例模式保证的是"一个类只有一个对象",而 Spring 单例 Bean 保证的是"同一个 BeanName 只有一个对象",两者维度不同,不能混为一谈。