spring--bean加载流程

spring bean的建模对象,普通的class对象无法完成spring bean的抽象,bean的作用域、注入模型、懒加载信息等。所以抽象出BeanDefinition,以便spring实例化一个bean。

class对象描述一个类的属性、方法等信息。

BeanDefinition描述spring bean中的scope、lazy、roll、属性和方法等等。

在这里插入图片描述

 

AnnotatedBeanDefinitionReader-----1.可用于编程式动态注册一个带注解的bean。2.可以代替ClassPathBeanDefinitionScanner这个类,具备相同的注解解析功能

在这里插入图片描述

  • spring启动时会先将内置的后置处理器实例化并放到有序的set中。并且由ConfigurationClassPostProcessor去完成扫描----读取这些类的信息,放在beanDefinition中,调用这个对象的set方法进行填充(还会实例化beanFactory、类扫描器等等),填充后放到  DefaultListableBeanFactory--->beanDefinitionMap 缓存中,最后调用所有实现了BeanFactoryPostProcessor的 postProcessBeanFactory()方法

在这里插入图片描述

1:实例化一个ApplicationContext的对象;
2:调用bean工厂后置处理器完成扫描;
3:循环解析扫描出来的类信息;
4:实例化一个BeanDefinition对象来存储解析出来的信息;
5:把实例化好的beanDefinition对象put到beanDefinitionMap当中缓存起来,以便后面实例化bean;
6:再次调用bean工厂后置处理器;
7:当然spring还会干很多事情,比如国际化,比如注册BeanPostProcessor等等,如果我们只关心如何实例化一个bean的话那么这一步就是spring调用finishBeanFactoryInitialization方法来实例化单例的bean,实例化之前spring要做验证,需要遍历所有扫描出来的类,依次判断这个bean是否Lazy,是否prototype,是否abstract等等;
8:如果验证完成spring在实例化一个bean之前需要推断构造方法,因为spring实例化对象是通过构造方法反射,故而需要知道用哪个构造方法;
9:推断完构造方法之后spring调用构造方法反射实例化一个对象;注意我这里说的是对象、对象、对象;这个时候对象已经实例化出来了,但是并不是一个完整的bean,最简单的体现是这个时候实例化出来的对象属性是没有注入,所以不是一个完整的bean;
10:spring处理合并后的beanDefinition;
11:判断是否支持循环依赖,如果支持则提前把一个工厂存入singletonFactories——map;
12:判断是否需要完成属性注入
13:如果需要完成属性注入,则开始注入属性
14:判断bean的类型回调Aware接口
15:调用生命周期回调方法
16:如果需要代理则完成代理
17:put到单例池——bean完成——存在spring容器当中
 

在这里插入图片描述在这里插入图片描述

 

在这里插入图片描述在这里插入图片描述
 

在这里插入图片描述在这里插入图片描述

 

  • 6
    点赞
  • 25
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值