一、Bean实例化策略InstantiationStrategy
代码分支:instantiation-strategy
现在bean是在AbstractAutowireCapableBeanFactory.doCreateBean方法中用beanClass.newInstance()来实例化,仅适用于bean有无参构造函数的情况。

针对bean的实例化,抽象出一个实例化策略的接口InstantiationStrategy,有两个实现类:
- SimpleInstantiationStrategy,使用bean的构造函数来实例化
- CglibSubclassingInstantiationStrategy,使用CGLIB动态生成子类
二、源码阅读
createBean方法:

2.1 doCreateBean方法追踪


先看SimpleInstantiationStrategy,直接根据无参构造函数创建实例:

再看CglibSubclassingInstantiationStrategy,使用CGLIB动态生成子类:

2.2 为解决循环依赖问题,将实例化后的bean放进缓存中提前暴露

详情请见这篇文章:spring中解决循环依赖的核心代码之一:将实例化后的bean放进缓存中提前暴露
我们只要知道这几点就行:
- 这里是把bean对象放到三级缓存里;
- 三级缓存放到是BeanFactory对象;
- BeanFactory对象,通过实现FactoryBean接口并重写getObject()方法,可以自定义Bean的创建逻辑,FactoryBean本身也由Spring容器管理,但它不支持依赖注入;
- getEarlyBeanReference类是从二级缓存拿对象;
getEarlyBeanReference代码后面再讲。
2.3 中间这些暂时不讲

2.4 后续



本篇的源码阅读部分内容,现在留个大概的印象,后续会更详细得讲解。