Spring中Bean的获取分析
![](https://img.haomeiwen.com/i7416970/288ee039f8d2f952.jpg)
当我们在Spring中获取bean时,会调用applicationContext.getBean("")方法,我们就从这里开始分析。
首先他会进入父类AbstractApplicationContext的getBean(),
![](https://img.haomeiwen.com/i7416970/8026a46ee266802e.png)
我们看到他会得到BeanFactory并通过Bean工厂进行bean的获取。让我们进入方法内部的getBean方法,他会进入到AbstractBeanFactory中的getBean方法。
![](https://img.haomeiwen.com/i7416970/bebe7ea0b8d983da.png)
调用doGetBean,继续,进入该方法,这个方法实在是太长,让我们一段段分析
![](https://img.haomeiwen.com/i7416970/2081307c4efafd3b.png)
首先将传入的bean名称进行相应的转换,然后先从缓存中获取bean,让我们进入getObjectForBeanInstance
![](https://img.haomeiwen.com/i7416970/2530f94d707b3643.png)
他会判断是否为FactoryBean,若不是则直接返回,若是则返回通过其FactoryBean接口的getObject()方法获取的bean,FactoryBean接口是Spring留给我们的扩展点,用于返回自定义的bean。如果是第一次创建则缓存中不会有,进入doGetBeaan中的else
![](https://img.haomeiwen.com/i7416970/62c7e7004450424d.png)
检查BeanFactory中是否有该bean的定义信息,若没有从父类中寻找。继续往下走
![](https://img.haomeiwen.com/i7416970/a92061efdee119f7.png)
首先进行循环依赖的检查。接下来进入bean的创建流程,如果是单实例的bean,最终会调用createBean,进入createBean方法,先进行单例bean的创建分析
![](https://img.haomeiwen.com/i7416970/e0a0347050ba0ca5.png)
注意注释部分,给BeanPostProcess一个机会返回代理Bean,我们熟悉的Aop代理对象就是在这个返回的,他会判断bean有没有实现InstantiationAwareBeanPostProcessor接口。若返回代理对象为null则进入正常bean的创建,调用doCreateBean。这个方法也很长。。
![](https://img.haomeiwen.com/i7416970/c7fd619144e1a537.png)
首先调用createBeanInstance创建该bean的包装器,然后执行MergedBeanDefinitionPostProcessor接口中的方法修改bean的定义信息
![](https://img.haomeiwen.com/i7416970/17535ce9abe93865.png)
首先提前暴露该bean的引用用于解决循环依赖问题,然后调用populateBean进行bean属性的设置,然后调用initializeBean执行bean的创建。
![](https://img.haomeiwen.com/i7416970/c1018c5a7204f55f.png)
首先调用invokeAwareMethods方法用于执行各种aware接口的回调。
然后执行applyBeanPostProcessorsBeforeInitialization,调用BeanPostProcessors的postProcessBeforeInitialization方法
接着执行invokeInitMethods方法,其中执行了InitializingBean中的afterPropertiesSet,接着是invokeCustomInitMethod即自定义的init方法。
最后执行applyBeanPostProcessorsAfterInitialization方法,执行BeanPostProcessors的postProcessAfterInitialization方法。
![](https://img.haomeiwen.com/i7416970/e67332f64a5029cb.png)
最后进行Disposable生命周期接口的注册,用于在bean销毁时执行销毁方法。创建完成后返回bean接下来来看其他类型的bean的创建
![](https://img.haomeiwen.com/i7416970/6ba68e4575a64c4c.png)
如图,创建过程大同小异,就不分析了。至此Spring中bean的创建流程就分析完了,接下来总结一下。
getBean()获取bean -> doGetBean()-> doGetBean中先从缓存获取,若获取到判断是否为FactoryBean类型,若是则调用getObject()。缓存中未取到 -> 检查该BeanFactory是否有该Bean的定义信息,若没有,调用父容器的getBean() -> createBean()创建bean -> 给Beanpostprocess机会返回代理Bean,若代理bean为null,则调用doCreateBean() -> 创建bean的wrapper,然后进行引用的提前暴露,执行populateBean进行bean属性的设置,最后执行initializeBean进,这里主要调用自定义的bean的处理方法 -> 顺序为aware接口回调,BeanPostProcessors的postProcessBeforeInitialization方法,InitializingBean中的afterPropertiesSet方法,invokeCustomInitMethod即自定义的init方法,BeanPostProcessors的postProcessAfterInitialization方法 -> 最后返回该bean。
写的有点乱。。。。。。。凑合看吧