美文网首页3随笔-生活工作点滴
Spring 应用之单例设计模式

Spring 应用之单例设计模式

作者: happyJared | 来源:发表于2019-10-08 08:40 被阅读0次

    在系统开发中,有些对象其实只需要一个,比如说:线程池、缓存、日志对象等。在 Spring 框架中,就大量应用到了单例设计模式。

    使用单例模式的好处:

    • 对于频繁使用的对象,可以省略创建对象所花费的时间,这对于那些重量级对象而言,是非常可观的一笔系统开销;
    • 由于 new 操作的次数减少,因而对系统内存的使用频率也会降低,这将减轻 GC 压力,缩短 GC 停顿时间。

    Spring 中 bean 的默认作用域就是 singleton 的

    除了 singleton 作用域,Spring 中 bean 还有下面几种作用域:

    • prototype : 每次请求都会创建一个新的 bean 实例。
    • request : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP request 内有效。
    • session : 每一次 HTTP 请求都会产生一个新的 bean,该 bean 仅在当前 HTTP session 内有效。
    • global-session: 全局 session 作用域,仅仅在基于 Portlet 的 web 应用中才有意义,Spring5 已经没有了。Portlet 是能够生成语义代码 (如:HTML) 片段的小型 Java Web 插件。它们基于 Portlet 容器,可以像 servlet 一样处理 HTTP 请求。但是,与 servlet 不同,每个 Portlet 都有不同的会话。

    Spring 实现单例的方式:

    XML:<bean id="userService" class="cn.mariojd.UserService" scope="singleton"/>

    注解:@Scope(value = "singleton")

    Spring 是借助 ConcurrentHashMap 来实现单例注册表。Spring 实现单例的核心代码如下:

    private final Map<String, Object> singletonObjects = new ConcurrentHashMap<String, Object>(64);
    
    public Object getSingleton(String beanName, ObjectFactory<?> singletonFactory) {
            Assert.notNull(beanName, "'beanName' must not be null");
            synchronized (this.singletonObjects) {
                // 检查缓存中是否存在实例  
                Object singletonObject = this.singletonObjects.get(beanName);
                if (singletonObject == null) {
                    //...省略了很多代码
                    try {
                        singletonObject = singletonFactory.getObject();
                    }
                    //...省略了很多代码
                    // 如果实例对象在不存在,我们注册到单例注册表中。
                    addSingleton(beanName, singletonObject);
                }
                return (singletonObject != NULL_OBJECT ? singletonObject : null);
            }
    }
    
    //将对象添加到单例注册表
    protected void addSingleton(String beanName, Object singletonObject) {
            synchronized (this.singletonObjects) {
                this.singletonObjects.put(beanName, (singletonObject != null ? singletonObject : NULL_OBJECT));
            }
    }
    

    相关文章

      网友评论

        本文标题:Spring 应用之单例设计模式

        本文链接:https://www.haomeiwen.com/subject/butmpctx.html