【Spring源码系列- IOC】
本文目录
我们来概述下refresh()中的最后一个也是极其重要的方法finishBeanFactoryInitialization(),它是Spring IOC的核心
这个方法主要用于初始化剩余非懒加载的单实例的,先进入finishBeanFactoryInitialization()方法
这个方法中主要可以分为六个部分:
第一步:设置转换服务
Spring在启动时就已经准备了很多的转换器,如下图:
第二步:设置值处理器
如果之前没有BeanFactoryPostProcessor(例如PropertySourcesPlaceholderConfigurer)注册任何东西,就注册一个默认的嵌入式值解析器在,这个主要是为了解决注解属性值的问题
第三步:设置织入的方式
这个主要是与AOP相关的
第四步:设置临时的类加载器
第五步:冻结当前已经定义好的BeanDefinition
这步结束后就不能再对BeanDefinition做相关的修改工作了
第六步:真正的实例化操作
这个函数中会遍历beanNames,触发所有非懒加载单例Bean的初始化,每个遍历过程会再进行一大堆判断后,基本按照getBean->doGetBean->createBean->doCreateBBean的基本流程执行(中间会涉及很多判断,所以不一定每一步都会执行到下一步)
我们先大致瞅瞅这四个重要的函数(后面会逐个详细分析)
getBean()
doGetBean()
实际获取bean的方法,也是触发依赖注入的方法
createBean()
只有在获取不到Bean的时候,才会进入创建的流程
doCreateBean()
实际执行创建Bean的地方
Spring创建对象的方式
Spring创建对象的主要方式有:
-
自定义BeanPostProcessor,生成代理对象InstantiationAwareBeanPostProcessor
-
createBean() -> resolveBeforeInstantiation()
-
-
通过supplier创建对象
-
createBean() -> doCreateBean() -> createBeanInstance() -> obtainFromSupplier()
-
-
通过FactoryMethod创建对象
-
createBean() -> doCreateBean() -> createBeanInstance() -> instantiateUsingFactoryMethod()
-
-
通过反射创建对象
-
createBean() -> doCreateBean() -> createBeanInstance() -> instantiateBean()
-
-
通过FactoryBean创建对象
后面我们会一一介绍并实践下(。・ω・。)ノ
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/135393.html