中间件原理程序员

Spring中Bean的获取分析

2018-07-11  本文已影响28人  不知名的程序员

当我们在Spring中获取bean时,会调用applicationContext.getBean("")方法,我们就从这里开始分析。

首先他会进入父类AbstractApplicationContext的getBean(),

AbstractApplicationContext的getBean方法

我们看到他会得到BeanFactory并通过Bean工厂进行bean的获取。让我们进入方法内部的getBean方法,他会进入到AbstractBeanFactory中的getBean方法。

AbstractBeanFactory中的getbean

调用doGetBean,继续,进入该方法,这个方法实在是太长,让我们一段段分析

AbstractBeanFactory中doGetBeaan-1

首先将传入的bean名称进行相应的转换,然后先从缓存中获取bean,让我们进入getObjectForBeanInstance

getObjectForBeanInstance

他会判断是否为FactoryBean,若不是则直接返回,若是则返回通过其FactoryBean接口的getObject()方法获取的bean,FactoryBean接口是Spring留给我们的扩展点,用于返回自定义的bean。如果是第一次创建则缓存中不会有,进入doGetBeaan中的else

AbstractBeanFactory中doGetBeaan-2

检查BeanFactory中是否有该bean的定义信息,若没有从父类中寻找。继续往下走

AbstractBeanFactory中doGetBeaan-3

首先进行循环依赖的检查。接下来进入bean的创建流程,如果是单实例的bean,最终会调用createBean,进入createBean方法,先进行单例bean的创建分析

createBean方法一部分

注意注释部分,给BeanPostProcess一个机会返回代理Bean,我们熟悉的Aop代理对象就是在这个返回的,他会判断bean有没有实现InstantiationAwareBeanPostProcessor接口。若返回代理对象为null则进入正常bean的创建,调用doCreateBean。这个方法也很长。。

createBean中doCreateBean方法-上

首先调用createBeanInstance创建该bean的包装器,然后执行MergedBeanDefinitionPostProcessor接口中的方法修改bean的定义信息

createBean中doCreateBean方法-中

首先提前暴露该bean的引用用于解决循环依赖问题,然后调用populateBean进行bean属性的设置,然后调用initializeBean执行bean的创建。

initializeBean

首先调用invokeAwareMethods方法用于执行各种aware接口的回调。

然后执行applyBeanPostProcessorsBeforeInitialization,调用BeanPostProcessors的postProcessBeforeInitialization方法

接着执行invokeInitMethods方法,其中执行了InitializingBean中的afterPropertiesSet,接着是invokeCustomInitMethod即自定义的init方法。

最后执行applyBeanPostProcessorsAfterInitialization方法,执行BeanPostProcessors的postProcessAfterInitialization方法。

createBean中doCreateBean方法-下

最后进行Disposable生命周期接口的注册,用于在bean销毁时执行销毁方法。创建完成后返回bean接下来来看其他类型的bean的创建

AbstractBeanFactory中doGetBeaan-4

如图,创建过程大同小异,就不分析了。至此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。

写的有点乱。。。。。。。凑合看吧

上一篇下一篇

猜你喜欢

热点阅读