spring中的单例模式

本文详细介绍了Spring框架中单例模式的实现方式(饿汉式和懒汉式)、分类,以及它在多线程环境下的线程安全问题。此外,还涵盖了工厂模式、依赖注入、观察者模式、代理模式和策略模式在Spring中的应用。
摘要由CSDN通过智能技术生成

单例模式(Singleton Pattern)

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

实现方式

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

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

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

@Component
@Scope("singleton")
public class MyBean {
    // 类定义
}

单例模式分类

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

饿汉式单例

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

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

懒汉式单例

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

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关键字来保证线程安全。
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可以根据需要选择不同的事务管理策略,以满足不同的业务需求。
 

  • 23
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值