Spring之Bean创建流程图
2021-06-07 18:12:04 0 举报
SpringIOC之Bean实例创建过程
作者其他创作
大纲/内容
是
判断该Bean正处于创建中且检查排除集合中并不包含该Bean名称
1. 判断一级缓存中是否存在,存在就直接返回,不存在则继续向下执行2. 判断二级缓存中是否存在,存在就直接返回,不存在且允许提前引用则继续向下执行3. 对一级缓存加锁,实际上就是采用双重检查锁机制4. 再次判断一级缓存中是否存在,存在就直接返回,不存在则继续向下执行5. 再次判断二级缓存中是否存在,存在就直接返回,不存在则继续向下执行6. 判断三级缓存是否存在 6.1 如果存在,则调用缓存值ObjectFactory实例的getObject()方法生成Bean实例 6.2 并将生成的Bean实例放入二级缓存中,同时删除三级缓存中的值 6.3 如果不存在,则返回null
调用工厂Bean实例的getObject方法生成实例并返回
省略......
对Bean实例进行初始化
否
创建Bean实例
转换BeanName若BeanName为别名将返回别名指定的BeanName
获取Bean定义依赖的BeanName集
false
在这一步之前还会去一级缓存中尝试获取一下Bean实例,若不为null则将直接返回该实例,否则才继续向创建Bean实例的流程执行
原型
判断Bean定义是否为抽象类型
true
初始化包括一些后置处理器的执行和初始化方法的执行
遍历所依赖的BeanName集并对其注册且获取实例(实际上为创建实例)
判断Bean定义的作用域
返回工厂Bean实例
返回Bean实例返回前还得执行一次是否为工厂Bean实例的检查
获取Bean定义
如果依赖的值是Spring Bean实例,那么又会从流程起点开始去获取被依赖的实例,所以这里就是循环依赖问题的入口
单例
直接返回该实例
注意:这里的依赖并不是指@Autowired的依赖,而是指xml中bean标签的depends-on属性或者Bean类型中的@DependsOn注解的值;获取(创建)被依赖的实例又会回到流程起点
抛出BeanCurrentlyInCreationException异常
不存在
抛出BeanIsNotAFactoryException异常
判断Bean实例是否为工厂Bean类型
存在
判断BeanName是否为工厂引用
抛出BeanIsAbstractException异常
放入三级缓存
获取父容器
对Bean实例成员变量进行依赖注入
判断获取Bean实例是否仅用于类型检查
判断Bean是否为原型模式正在被创建的实例
标记该Bean已被创建或者即将被创建
调用父容器的获取Bean实例方法
其他
获取Bean实例
判断单例Bean三级缓存中是否存在对应实例
判断父容器不为null且当前容器中不存在该BeanName的Bean定义
放入一级缓存删除二三级缓存的值
0 条评论
回复 删除
下一页