spring Bean加载流程
一、读取注解先通过扫描指定路径下的spring注解或者XML配置,然后将其解析并封装到BeanDefintaion这个接口的实现类中。二、bean生命周期2.1 实例化AbstractAutoWireCapableBeanFactory.doCreateBean中会调用createBeaninstance()方法,该阶段主要是从beanDefinitionMap循环读取bean,获取他的属性,然后
一、读取注解
先通过扫描指定路径下的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,由此,成功将其初始化。
更多推荐
所有评论(0)