spring中的单例模式

单例模式(Singleton Pattern)

在Spring框架中,单例模式是一种确保某个类仅有一个实例,并提供一个全局访问点来获取该实例的设计模式。在Spring中,单例模式的应用非常广泛,并且是Bean默认的作用域。以下是对Spring中单例模式的详细介绍:

实现方式

Spring使用单例模式来管理其Bean的实例化。当在Spring配置文件或者使用注解定义一个Bean时,除非明确指定作用域(scope),否则Spring容器默认会将该Bean定义为单例。

<bean id="exampleBean" class="com.example.ExampleBean" scope="singleton"/>

或使用@Scope("singleton")注解来实现。

java 复制代码
@Component
@Scope("singleton")
public class MyBean {
    // 类定义
}

单例模式分类

饿汉式:类加载就会导致该单实例对象被创建

饿汉式单例

该模式的特点是类一旦加载就创建一个单例,保证在调用 getInstance 方法之前单例已经存在了。

java 复制代码
public class HungrySingleton
{
    private static final HungrySingleton instance=new HungrySingleton();
    private HungrySingleton(){}
    public static HungrySingleton getInstance()
    {
        return instance;
    }
}
懒汉式:类加载不会导致该单实例对象被创建,而是首次使用该对象时被创建

懒汉式单例

该模式的特点是类加载时没有生成单例,只有当第一次调用 getlnstance 方法时才去创建这个单例。代码如下:

java 复制代码
public class LazySingleton
{
    private static volatile LazySingleton instance=null;    //保证 instance 在所有线程中同步
    private LazySingleton(){}    //private 避免类在外部被实例化
    public static synchronized LazySingleton getInstance()
    {
        //getInstance 方法前加同步
        if(instance==null)
        {
            instance=new LazySingleton();
        }
        return instance;
    }
}

使用场景

  • 单例模式适用于那些需要在整个应用程序中共享状态或资源的情况,以及需要频繁创建和销毁实例开销较大的情况。
  • 例如,数据库连接池、线程池、配置管理器等可以使用单例模式

线程安全

  • 单例模式在多线程环境中可能涉及到线程安全问题。在默认的懒汉式单例模式中,如果多个线程同时访问,可能会导致创建多个实例。
  • 可以使用双重检查锁定或者使用volatile关键字来保证线程安全。
java 复制代码
public class Singleton {
    private static volatile Singleton instance;
 
    private Singleton() {
        // 初始化操作
    }
 
    public static Singleton getInstance() {
        if (instance == null) {
            synchronized (Singleton.class) {
                if (instance == null) {
                    instance = new Singleton();
                }
            }
        }
        return instance;
    }
}

其他设计模式

二、工厂模式(Factory Pattern):

Spring使用工厂模式来创建和管理Bean实例。Spring容器充当了一个工厂,根据配置信息创建和返回所需的Bean对象。通过使用工厂模式,Spring可以将对象的实例化和配置细节与应用程序的其他部分分离开来。

三、依赖注入模式(Dependency Injection Pattern):

依赖注入是Spring框架的核心特性之一。它通过将对象的依赖关系委托给外部容器来管理对象之间的依赖关系。通过使用依赖注入模式,Spring可以减少类之间的耦合度,并提供更好的可测试性和灵活性。

四、观察者模式(Observer Pattern):

Spring框架中的事件机制是基于观察者模式实现的。通过定义事件和监听器接口,应用程序可以发布事件并让感兴趣的监听器处理这些事件。这种松耦合的设计模式使得事件的发布者和订阅者之间的解耦成为可能。

五、代理模式(Proxy Pattern):

Spring AOP(面向切面编程)使用了代理模式来实现横切关注点的模块化。Spring AOP通过创建代理对象来包装原始对象,并在方法调用前后插入横切逻辑。代理模式允许在不修改原始对象的情况下,对其进行扩展和增强。

六、模板模式(Template Pattern):

Spring框架中的JdbcTemplate是基于模板模式实现的。它提供了一组模板方法,简化了对数据库的操作。使用模板模式,开发人员 只需关注业务逻辑,而无需关注底层的数据访问细节。

七、策略模式(Strategy Pattern):

Spring框架中的事务管理是基于策略模式实现的。Spring提供了多个事务管理策略,如基于注解、基于XML配置等。通过使用策略模式,Spring可以根据需要选择不同的事务管理策略,以满足不同的业务需求。

相关推荐
王哈哈^_^1 小时前
【数据集】【YOLO】【目标检测】交通事故识别数据集 8939 张,YOLO道路事故目标检测实战训练教程!
前端·人工智能·深度学习·yolo·目标检测·计算机视觉·pyqt
cs_dn_Jie2 小时前
钉钉 H5 微应用 手机端调试
前端·javascript·vue.js·vue·钉钉
开心工作室_kaic2 小时前
ssm068海鲜自助餐厅系统+vue(论文+源码)_kaic
前端·javascript·vue.js
有梦想的刺儿3 小时前
webWorker基本用法
前端·javascript·vue.js
cy玩具3 小时前
点击评论详情,跳到评论页面,携带对象参数写法:
前端
Wx-bishekaifayuan3 小时前
django电商易购系统-计算机设计毕业源码61059
java·spring boot·spring·spring cloud·django·sqlite·guava
WaaTong4 小时前
《重学Java设计模式》之 单例模式
java·单例模式·设计模式
qq_390161774 小时前
防抖函数--应用场景及示例
前端·javascript
小白冲鸭4 小时前
【报错解决】使用@SpringJunitConfig时报空指针异常
spring·java后端开发
John.liu_Test4 小时前
js下载excel示例demo
前端·javascript·excel