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 小时前
CSS3新特性概述
前端·css·css3
前端小端长2 小时前
qiankun 微前端应用入门教程:从搭建到部署
前端
yinuo4 小时前
前端跨页面通讯终极指南⑥:SharedWorker 用法全解析
前端
PineappleCoder8 小时前
还在重复下载资源?HTTP 缓存让二次访问 “零请求”,用户体验翻倍
前端·性能优化
拉不动的猪9 小时前
webpack编译中为什么不建议load替换ast中节点删除consolg.log
前端·javascript·webpack
李姆斯9 小时前
Agent时代下,ToB前端的UI和交互会往哪走?
前端·agent·交互设计
源码获取_wx:Fegn08959 小时前
基于springboot + vue健身房管理系统
java·开发语言·前端·vue.js·spring boot·后端·spring
闲谈共视9 小时前
基于去中心化社交与AI智能服务的Web钱包商业开发的可行性
前端·人工智能·去中心化·区块链
Mr1ght9 小时前
为什么 InheritableThreadLocal 在 Spring 线程池中“偶尔”能传递变量?——一次线程池上下文传播的误解
java·spring
CreasyChan9 小时前
C# 反射详解
开发语言·前端·windows·unity·c#·游戏开发