一、读取注解

先通过扫描指定路径下的spring注解或者XML配置,然后将其解析并封装到BeanDefintaion这个接口的实现类中。

二、bean生命周期

2.1 实例化

AbstractAutoWireCapableBeanFactory.doCreateBean中会调用createBeaninstance()方法,该阶段主要是从beanDefinitionMap循环读取bean,获取他的属性,然后利用反射读取对象的构造方法,进行实例化对象,此时是一个空对象在JVM堆中所有属性并未赋值

2.2 初始化

初始化包括两个步骤,一个是属性填充,另一个是具体初始化过程,比如Bean PostProcessor后置处理器,具体初始化。

属性赋值
PopulateBean()会对bean的依赖属性进行填充,@Autowirde注解注入就发生在这个阶段,若Bean有很多依赖的对象,则Spring会依次调用这些依赖的对象进行实例化,注意可能会出现循环依赖。

初始化
初始化即将bean放入Spring的缓存中、填充我们预设的属性并进一步做后置处理。

2.3使用

初始化完成之后 加载到spring容器中,程序中可以调用。

2.4 销毁

随着Spring的关闭,SpringBean会被移除,此时Bean的生命周期结束。

3、解决循环依赖

三级缓存技术:spring依次从一级、二级、三级缓存中获取对象,首次创建对象先实例化在三级缓存中,实例化完成之后,移到一级缓存中。下次寻找时,则会在一级缓存中寻找。
设A->B,B->A,根据加载顺序,创建A时,先对其进行实例化及初始化,此时寻找A的属性B,B经过实例化和初始化,也开始寻找依赖A,此时去一级缓存中可以查到A,则将其返回给B,由此,成功将其初始化。

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐