首页 > 移动平台 > 详细

读spring源码(三)-ClassPathXmlApplicationContext-getBean

时间:2018-08-25 18:27:08      阅读:251      评论:0      收藏:0      [点我收藏+]

这次主要看了下bean的生成过程,发现个画时序图很好用的软件plantuml,充分发挥程序员的能力,能用代码解决的别叨叨别的??

技术分享图片

 

1、调用ApplicationContext的genBean方法会调用到AbstractApplicationContext的getBean方法,这个方法里面其实就是交由BeanFactory调用getBean

2、DefaultListableBeanFactory中会先根据类型获取beanNames,然后根据beanName调用AbstractBeanFactory的doGetBean方法

3、AbstractBeanFactory中首先转化beanName,然后看去缓存map中看是否存在已有数据,第一次调用肯定返回null。然后去获取RootBeanDefinition,获取DependsOn依赖的bean,如果存在依赖Bean需要先初始化依赖的bean,之后调用getSingleton方法来获取单例类

4、在DefaultSingletonBeanRegistry#getSingleton中又调用ObjectFactory#getObject来获取对象,这个函数里面主要调用了createBean来生成对象

5、AbstractAutowireCapableBeanFactory#createBean

  5.1、resolveBeanClass根据BeanDefinition获取Bean的类并加载

  5.2、doCreateBean-->createBeanInstance这里会获取Bean的构建方法,并根据是否有构建方法,是否有构建参数最终bean的构建方式

      5.3、autowireConstructor会构建ConstructorResolver来构建Bean

6、ConstructorResolver#autowireConstructor,从BeanDefinition中获取构建参数,之后根据Bean的class获取已有的构造函数并根据构造参数值获取相匹配的构造函数,之后就是调用SimpleInstantiationStrategy#instantiate方法,这个方法里面其实就是调用BeanUtils.instantiateClass(ctor, args)方法,利用java的反射机制来构建一个对象,到此就得到了需要构建的对象

7、之后再AbstractAutowireCapableBeanFactory中会调用bean相关的PostProcessor,之后会调用populateBean方法

8、populateBean这个方法会判断Bean是否autowire,如果是的话会进行自动注入,最后会调用applyPropertyValues方法,这个方法看名字也很好理解,就是对配置的属性值进行写入。到这里这个Bean的构建基本全部完成了,后续就是将Bean写入缓存Map,注册单例类等操作。

 

读spring源码(三)-ClassPathXmlApplicationContext-getBean

原文:https://www.cnblogs.com/lcxdever/p/9501517.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!