前面完成了beanDefinition的初始化,注册,下面开始另一个核心的内容实现 bean初始化
十一、finishBeanFactoryInitialization: 初始化所有的singleton beans,不包括懒加载lazy-init的bean
Spring在这个阶段,需要完成所有singletonBean的初始化
1. 先初始化LoadTimeWeaverAware 类型的 Bean,一般用于织入第三方模块,在 class 文件载入 JVM 的时候动态织入,这里不展开说
2.beanFactory.freezeConfiguration(); 马上就要初始化bean了,此时需要冻结bean的解析,加载,注册
3.beanFactory.preInstantiateSingletons(); 实例化singletonBean
只实例化非抽象的,单例的,非懒加载的bean
4. 如果是factoryBean,需要在beanName前面增加 “&”
5. 历经漫长等待,终于到了getBean()方法,从BeanFactory 中获取一个 Bean
6.需要检查下是否已经创建过了
7.如果是普通 Bean 的话,直接返回 sharedInstance;如果是 FactoryBean 的话,返回它创建的那个实例对象
8.检查beanDefinition是否存在,没有的话,就去父容器查询一下,看看有没有
9.先获取依赖关系,然后检查是否存在循环依赖关系,有的话,就需要抛出异常
10. 注册一下依赖关系 registerDependentBean(dep, beanName);
11.然后是核心逻辑,createBean
让BeanPostProcessor 在这一步有机会返回代理,而不是 bean 实例
12. 重头戏,创建 bean ,调用 Object beanInstance = doCreateBean(beanName, mbdToUse, args)
12.1 如果不是factoryBean,就实例化 Bean;如果是factoryBean,就instanceWrapper.getWrappedInstance()
12.2.继续看核心逻辑createBeanInstance
12.3 校验一下这个类的访问权限
12.4 采用工厂方法实例化,不熟悉这个概念的读者请看附录
12.5 采用无参构造函数,还是构造函数依赖注入 来完成实例化
13. 核心逻辑 beanInstance = getInstantiationStrategy().instantiate(mbd, beanName, parent);
反射获取constructorToUse,然后BeanUtils.instantiateClass(constructorToUse); 根据这个构造函数实例化bean出来
14.实例化bean出来后,我们继续进行属性注入
14.1 通过名字找到所有属性值,如果是 bean 依赖,先初始化依赖的 bean。记录依赖关系
14.2 通过类型装配。复杂一些
15. initializeBean 属性注入完成后,这一步其实就是处理各种回调了。
16. 如果 bean 实现了 BeanNameAware、BeanClassLoaderAware 或 BeanFactoryAware 接口,回调
17.
-
// 处理 bean 中定义的 init-method,
-
// 或者如果 bean 实现了 InitializingBean 接口,调用 afterPropertiesSet() 方法