spring bean加载流程解析

1. Spring 基本流程解析

参考芋道源码 的spring 解析 http://svip.iocoder.cn/Spring/IoC-get-Bean-createBean-1/

1) IOC 容器初始化

a) BeanDefinition 生成

Ioc容器 初始化:rescourse 定位、 beanDefinition 载入和解析、beanDefinition 注册
从xml、jar和网络流量通过rescourse 定位 然后解析为beanDefinition 对象

b) BeanDefinition 注册

通过调用BeanDefinitionRegistry 方法注入到一个hashMap 的容器中,这样ioc容器初始化完成

2) Bean 的加载

a) 获取bean

调用getBean 方法 触发里面的doGetBean 方法,如果没有找到对应的bean 会触发createBean 方法 创建bean

b) Spring 解决循环依赖问题—提前暴露

Bean 的三级缓存:
在这里插入图片描述
在调用getBean 方法的时候,触发调用getObjectForBeanInstance 里的getSingleton()从一级缓存(singletonObjects)里获取,如果一级缓存没有从二级缓存(ealarySingletionObjects)中获取,如果没有获取到从三级缓存(singletonFactories)获取
在三级缓存中获取
获取到 将bean 放到二级缓存中,并从三级缓存中删除
如果没有获取到则调用createBean方法

3) Bean 创建

调用doCreateBean 方法
当一个bean 在满足以下三个条件将bean
1.这个bean 正在创建中
2.该bean 为单例模式
3.该bean 为循环依赖
调用addSigletonFactory() 方法放到三级缓存中,该方法在createBeanInstance()方法后 说明bean 已创建了实例引用 但没有进行属性填充和初始化操作
对象创建并初始化完成后将调用addSigleton()方法将对象放到一级缓存中,同时将二级缓存、三级缓存中的该bean 删除。

4) Bean 创建步骤

单例bean 创建过程
在这里插入图片描述

5) 利用bean 的三级缓存条件

  1. 该bean 为单例(默认是单例),如果bean 是protoType 原型模式下的循环依赖不会引用直接抛异常
  2. 该bean 为单例 并且bean是属性注入的,如果是构造器注入抛beanCurrentCreateExcepion 异常
    .在这里插入图片描述

2. BeanDefinition 的解析过程

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

3. Ioc 初始化过程

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

4. Ioc 容器加载和初始化

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

5. Spring bean 解决循环依赖

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

6. Aware 接口

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

猜你喜欢

转载自blog.csdn.net/fengyun1990/article/details/84880838