8)Spring中单例模式(源码解读)实战笔记

单例模式: 一个类只有一个实例

注:Spring源码的版本4.3.4

Spring依赖注入Bean实例默认是单例的

getBean的doGetBean方法调用getSingleton进行bean的创建。Spring的依赖注入(包括lazy-init方式)都是发生在AbstractBeanFactory的getBean里。

lazy-init方式,在容器初始化时候进行调用

非lazy-init方式,在用户向容器第一次索要bean时进行调用

同步线程安全的单例核心代码:


8)Spring中单例模式(源码解读)实战笔记_第1张图片


spring依赖注入时,使用了双重判断加锁的单例模式:

从缓存中获取bean实例,如果为null,对缓存map加锁,然后再从缓存中获取bean,

如果继续为null,就创建一个bean。

这样双重判断,避免在加锁的瞬间,有其他依赖注入引发bean实例的创建,造成重复创建。

Spring并没有用私有构造方法来创建bean,通过singletonFactory.getObject()返回具体beanName对应的ObjectFactory来创建bean。调用了AbstractAutowireCapableBeanFactory的doCreateBean方法,返回了BeanWrapper包装并创建的bean实例。

(ObjectFactory主要检查是否有用户定义的BeanPostProcessor后处理内容,并在创建bean时进行处理,如果没有,就直接返回bean本身)

见如下代码:

512行创建bean实例返回给BeanWrapper

540行addSingletonFactory增加beanName和ObjectFactory的键值对应关系。

8)Spring中单例模式(源码解读)实战笔记_第2张图片

getEarlyBeanReference获取bean的所有后处理器,并进行处理。如果是SmartInstantiationAwareBeanPostProcessor类型,就进行处理,如果没有相关处理内容,就返回默认的实现。


8)Spring中单例模式(源码解读)实战笔记_第3张图片


8)Spring中单例模式(源码解读)实战笔记_第4张图片

各种单例实现方式(5种):

懒汉模式,

饿汉线程非安全模式,

饿汉线程安全模式,

内部类模式,

枚举模式。

最推荐的方式是枚举单例模式。对这些模式的描述和介绍,请仔细看代码中的注释:


8)Spring中单例模式(源码解读)实战笔记_第5张图片


8)Spring中单例模式(源码解读)实战笔记_第6张图片


8)Spring中单例模式(源码解读)实战笔记_第7张图片
8)Spring中单例模式(源码解读)实战笔记_第8张图片


8)Spring中单例模式(源码解读)实战笔记_第9张图片

你可能感兴趣的:(8)Spring中单例模式(源码解读)实战笔记)