单例模式(Singleton Pattern)是 Java中最简单的设计模式之一,此模式保证某个类在运行期间,只有一个实例对外提供服务,而这个类被称为单例类。
单例模式也比较好理解,比如一个人一生当中只能有一个真实的身份证号,一个国家只有一个政府,类似的场景都是属于单例模式。
使用单例模式要做的两件事
- 保证一个类只有一个实例
- 为该实例提供一个全局访问节点单例模式结构
单例模式结构:
单例的实现:
饿汉式
public class Singleton{
//类加载时就初始化
private static final Singleton instance = new Singleton();
private Singleton(){}
public static Singleton getInstance(){
return instance;
}
}
懒汉式
public static synchronized Singleton getInstance() {
if (instance == null) {
instance = new Singleton();
}
return instance;
}
双重检测
public static Singleton getSingleton() {
if (instance == null) { //Single Checked
synchronized (Singleton.class) {
if (instance == null) { //Double Checked
instance = new Singleton();
}
}
}
return instance ;
}
静态内部类
public class Singleton {
private static class SingletonHolder {
private static final Singleton INSTANCE = new Singleton();
}
private Singleton (){}
public static final Singleton getInstance() {
return SingletonHolder.INSTANCE;
}
}
枚举方式
public enum EasySingleton{
INSTANCE;
}
在 Spring 框架中,单例模式被广泛应用于以下几个方面:
- Spring Bean 默认是单例的。在 Spring 容器中,所有默认情况下都是单例 Bean,也就是说,每次请求时都会返回相同的实例。
- Spring 的 AOP 代理默认也是单例的。Spring 通过 JDK 动态代理和 CGLIB 代理来实现 AOP,这些代理默认都是单例的,这样可以减少对象创建和销毁的开销。
- Spring MVC 中的控制器默认也是单例的。在 Spring MVC 中,控制器是单例的,也就是说,每个请求都会使用相同的控制器实例来处理请求。