Spring IOC之Bean的创建

上一篇文章讲述了从配置文件到Bean定义的过程。容器初始化完成后,在IOC容器内建立了BeanDefinition,具体的依赖关系还没有注入。当使用者第一次向IOC容器请求Bean时,IOC容器才会对这个Bean注入的依赖关系。在依赖注入完成后,使用者调用getBean方法来获得bean。不难想象这个bean创建的过程一定是一个递归的的。当我们要创建一个bean时,会递归的在context中查找需要的bean来递归创建;在依赖注入的时候,一直要获取当前bean依赖的bean,对依赖的bean进行创建和注入。

  1. ?AbstractBeanFactory ?getBean

2.??doGetBean

3. ??AbstractAutowireCapableBeanFactory? createBean

4.?AbstractAutowireCapableBeanFactory?? doCreateBean

核心是通过createBeanInstance方法创建了一个BeanWrapper实例,封装了最终的Object类型的bean,并提供对该bean的操作。在populateBean中,从definition中得到解析的bean的propertyvalue,找到为Bean赋值的方法,以反射的方式调用该方法,进而实现对bean实例赋值。

以下5-9是createBeanInstance的调用,作用是创建一个实例,10-* 是populateBean的调用,作用是为创建的bean添加配置的属性。

5. ??createBeanInstance

6. ??instantiateBean

7. ??SimpleInstantiationStrategy

8. ?BeanUtils.instantiateClass

9. ?Constructor

10. ?AbstractAutowireCapableBeanFactory populateBean 使用definition中bean的定义来为BeanWrapper的属性赋值。可以认为beandifination只是个定义,BeanWrapper实例才是真正封装了最终对象的bean。

11. ?AbstractAutowireCapableBeanFactory applyPropertyValues,上个方法中从BeanDifinition中得到xml中定义的PropertyValues,在本方法中真正的把这些PropertyValues赋值到BeanWrapper上去。

12. ?? ? ? ?AbstractPropertyAccessor ?setPropertyValues

13.

14. ?BeanWrapperImpl setPropertyValue 为一个属性设置一个值

15. ??setPropertyValue 调用writeMethod.invoke(this.object, value);方法,即BeanWrapper封装的object的write方法来为object的属性赋值。

16. ?接方法4的中调用initializeBean方法,注意该方法中init的对象是最终的object,不是前面createBean和populateBean中的BeanWrapper。

17.

18. ?invokeInitMethods方法最终是根据BeanDefinition中定义的init方法,用反射的方法inovoke该方法来执行init操作。

19. ?invokeCustomInitMethod

 

原创文章。为了维护文章的版本一致、最新、可追溯,转载请注明: 转载自idouba

本文链接地址: Spring IOC之Bean的创建


, ,

Trackbacks/Pingbacks

  1. Spring IOC之Bean的定义和解析 | idouba - 2017年1月10日

    […] 本文重点关心spring ioc中bean的解析部分,bean的创建可以参照另外一篇文章:Spring IOC之Bean的创建 […]

发表评论