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可以根据需要选择不同的事务管理策略,以满足不同的业务需求。

相关推荐
变与不变8066 小时前
jQuery怎么使用
前端·javascript
神膘护体小月半6 小时前
flex 布局的 order 属性
前端·css
paopaokaka_luck6 小时前
流浪动物救助与收养系统(DeepSeek AI对话、 ECharts多维分析、救助流程衔接、领养与回访衔接、 捐赠确认与公示、志愿者协作)
java·前端·javascript·人工智能·mysql·echarts·推荐算法
仰望.6 小时前
vue 表格组件 vxe-table 树表格懒加载支持拖拽排序的详细用法
前端·javascript·vue.js·vxe-table
前端 贾公子6 小时前
vite-plugin-uni-manifest 升级指南
前端
小码哥_常7 小时前
iPhone 用户传了张 HEIC,我的前端崩了
前端
小码哥_常7 小时前
你发的原图可能暴露你家地址——聊聊图片 EXIF 隐私
前端
java1234_小锋7 小时前
【技术专题】CSS3 网页技术 - CSS3 优先级
前端·css·css3
鸿蒙开发8 小时前
共享 Schema 与 SchemaFactory
前端·后端·harmonyos
屏什么录8 小时前
录屏超过两小时就卡顿崩盘?从参数调优到代码实现,一文彻底搞定长时间录屏
前端·音视频开发