spring源码解析 – spring容器加载源码(bean实例化过程)

前言

上篇我们介绍了spring容器加载的方式,并重点介绍了基于xml配置解析和注解扫描两种容器加载的方式,封装和注册beandefinition的过程。今天我们分享BeanDef{ # Y O ] X jinition注册后的另一个] ^ 1 N 重要过程 ---bean的实例化过程的源码

容器加载流程


在整个bean实例化的过程中,spring主要干了以下几件大事:
1.bean的实例化过程算法;2.IOC依赖注入;3.注解支撑;4.系列BeanPostProcessors的接口执行;5.AOP动态代理构M b x Y @ w建;
下面我们就追随整个过程的源码4 S M j @ v,去一探究竟...

AbstractApplicationContext.finishBeanFactoryInitialization()实例化bean入口方法
spring源码解析 - spring容器加载源码(bean实例化过程)
Dw u + :ef8 C waultListableBeanFactory.preInstantiateSingZ ` 9 Lletons()开始实例化流程
spring源码解析 - spring容器加载源码(bean实例化过程)
AbstractBeanFactory.doGetBean()抽象实例化bean骨架方法
spring源码解析 - spring容器加载源码(bean实例化过程)
DefaultSingletonBea0 V j & R C mnRegistry.getSingleton()获取三个级别缓存的流程
spring源码解析 - spring容器加载源码(bean实例化过程)
返回factorybean中定义的对象实例,getObjectForBeanInstance()
spring源码解析 - spring容器加载源码(bean实例化过程)
spring源码解析 - spring容器加载源码(bean实例化过程)
多例情况(Scope=ProtoType)下,有循环依赖则直接I x c : Z H j z抛出异常
spring源码解析 - spring容器加载源码(bean实例化过程)
检测是否抽象be C Y H M V s z :eanW d 6definition对象,则直接抛出J 1 ` e E i v异常
spring源码解析 - spring容器加载源码(bean实例化过程)
缓存依赖的depend的bean对象

创建并缓存单例bean实例
spring源码解析 - spring容器加载源码(bean实例化过程)
spring源码解析 - spring容器加载源码(bean实例化过程)
创建bean实例createBean()核心封装
spring源码解析 - spring容器加载源码(bean实例化过程)
spring源码解析 - spring容器加载源码(bean实例化过程)
反射创建bean实例

spring源码解析 - spring容器加载源码(bean实例化过程)
spring源码解析 - spring容器加载源码(bean实例化过程)

spring源码解析 - spring容器加载源码(bean实例化过程)
spring源码解析 - spring容器加载源码(bean实例化过程)
bean的依赖对象IOC注入:AbstractAutowireCapableBeanFactorS w f { W - m K %y.populateBean()
spring源码解析 - spring容器加载源码(bean实例化过程)
bean实例化后置处理,主要是AOP动态代理的创建,这个后面会详细展开分享:initializeBean()
spring源码解析 - spring容器加载源码(bean实例化过程)
bean实例销毁注册,供外部servlet容器调用:registerDisposableBeanIfNecessarI 9 J M `y()
spring源码解析 - spring容器加载源码(bean实例化过程)
spring源码解析 - spring容器加载源码(bean实例化过程)

调用时序

spring源码解析 - spring容器加载源码(bean实例化过程)

总结

O@ y p w } H cK,bean实例化的整个过( % g w d ? 6 r程就先分享到这里,后面我们将会分享spring源码是如何解决循环依赖的问题,AOP源码,Spring事务源码等诸多干货,请继续关注!欢迎在下方留言关于这块的问题,大家一起探讨!