码迷,mamicode.com
首页 > 移动开发 > 详细

读spring源码(三)-ClassPathXmlApplicationContext-getBean

时间:2018-08-25 19:00:15      阅读:242      评论:0      收藏:0      [点我收藏+]

标签:缓存   获取对象   属性   creat   tap   image   oge   rac   autowire   

这次主要看了下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

标签:缓存   获取对象   属性   creat   tap   image   oge   rac   autowire   

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

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!