3随笔-生活工作点滴

Spring 应用之单例设计模式

2019-10-08  本文已影响0人  happyJared

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

使用单例模式的好处:

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

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

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));
        }
}
上一篇下一篇

猜你喜欢

热点阅读