《我想进大厂》之Spring夺命连环10问(二)

发布于 2022-6-8 17:47
浏览
0收藏

 

假设一个简单的循环依赖场景,A、B互相依赖。

 《我想进大厂》之Spring夺命连环10问(二)-开源基础软件社区
A对象的创建过程:

  1. 创建对象A,实例化的时候把A对象工厂放入三级缓存
     《我想进大厂》之Spring夺命连环10问(二)-开源基础软件社区
  2. A注入属性时,发现依赖B,转而去实例化B
  3. 同样创建对象B,注入属性时发现依赖A,一次从一级到三级缓存查询A,从三级缓存通过对象工厂拿到A,把A放入二级缓存,同时删除三级缓存中的A,此时,B已经实例化并且初始化完成,把B放入一级缓存。
     《我想进大厂》之Spring夺命连环10问(二)-开源基础软件社区
  4. 接着继续创建A,顺利从一级缓存拿到实例化且初始化完成的B对象,A对象创建也完成,删除二级缓存中的A,同时把A放入一级缓存
  5. 最后,一级缓存中保存着实例化、初始化都完成的A、B对象
     《我想进大厂》之Spring夺命连环10问(二)-开源基础软件社区
    因此,由于把实例化和初始化的流程分开了,所以如果都是用构造器的话,就没法分离这个操作,所以都是构造器的话就无法解决循环依赖的问题了。

8. 为什么要三级缓存?二级不行吗?

不可以,主要是为了生成代理对象。

因为三级缓存中放的是生成具体对象的匿名内部类,他可以生成代理对象,也可以是普通的实例对象。

使用三级缓存主要是为了保证不管什么时候使用的都是一个对象。

假设只有二级缓存的情况,往二级缓存中放的显示一个普通的Bean对象,BeanPostProcessor去生成代理对象之后,覆盖掉二级缓存中的普通Bean对象,那么多线程环境下可能取到的对象就不一致了。

 《我想进大厂》之Spring夺命连环10问(二)-开源基础软件社区
9.Spring事务传播机制有哪些?

  1. PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,这也是通常我们的默认选择。
  2. PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
  3. PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则按REQUIRED属性执行。
  4. PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
  5. PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
  6. PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
  7. PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘

10.最后,说说Spring Boot 启动流程吧?

这个流程,网上一搜基本都是这张图了,我也不想再画一遍了。那其实主要的流程就几个步骤:

  1. 准备环境,根据不同的环境创建不同的Environment
  2. 准备、加载上下文,为不同的环境选择不同的Spring Context,然后加载资源,配置Bean
  3. 初始化,这个阶段刷新Spring Context,启动应用
  4. 最后结束流程

《我想进大厂》之Spring夺命连环10问(二)-开源基础软件社区

图片来源网络,如有侵权请联系我删除

 

文章转自公众号:艾小仙

分类
标签
已于2022-6-8 17:47:40修改
收藏
回复
举报
回复
添加资源
添加资源将有机会获得更多曝光,你也可以直接关联已上传资源 去关联
    相关推荐