Spring 中 bean 的默认作用域就是 singleton(单例) 的
<!-- more -->
## 场景
1. **节省系统资源**,空间和时间
2. **提供全局访问点**:单例模式提供了一个易于访问的全局接口,其他对象可以通过这个接口访问单例类的实例,无需自行管理其生命周期和状态。
## 如何实现单例
### 饿汉式
1、私有化构造方法
2、双重校验防止加锁过程中状态发生变化
3、加 volatile 防止重排序导致的假 singleton
### 枚举实现单例模式
枚举 1: 想通过枚举的反射拿构造函数会抛 IllegalArgumentException
枚举 2: 被反序列化时,不会通过调用构造函数来创建新的实例。相反,反序列化方法会返回已经存在的 enum 常量,这确保了 enum 的单例性。
## 如何破坏单例
反射和反序列化都会破坏单例模式,相当于绕开了 Java 提供的常规的 new 一个对象,用构造方法的机制