Java Spring Bean的生命周期 三级缓存

SpringBean的生命周期:是从 Bean 实例化之后(即通过反射创建出对象之后),到Bean成为一个完整对象,最终存储到单例池中,这个过程被称为Spring Bean的生命周期。Spring Bean的生命周期大体上分为三个阶段:

  • 实例化阶段:Spring框架会取出BeanDefinition的信息进行判断当前Bean的范围是否是singleton的,是否不是延迟加载的,是否不是FactoryBean等,最终将一个普通的singleton的Bean通过反射进行实例化
  • 初始化阶段:Bean创建之后还仅仅是个"半成品",还需要对Bean实例的属性进行填充、执行一些Aware接口方法、执行BeanPostProcessor方法、执行InitializingBean接口的初始化方法、执行自定义初始化init方法等
  • 存储阶段:经过初始化阶段,Bean就成为了一个完整的Spring Bean,被存储到单例池singletonObjects中去了,即完成了Spring Bean的整个生命周期


Bean的实例化链接:Bean的实例化
Bean后处理器链接:Bean后处理器


Bean的初始化阶段

  • Bean实例的属性填充
  • Aware接口属性注入
  • BeanPostProcessor的before()方法回调
  • InitializingBean接口的初始化方法回调
  • 自定义初始化方法init回调
  • BeanPostProcessor的after()方法回调

Spring在进行属性注入时,会分为如下几种情况:

  • 注入普通属性,String、int或存储基本类型的集合时,直接通过set方法的反射设置进去;
  • 注入单向对象引用属性时,从容器中getBean获取后通过set方法反射设置进去,如果容器中没有,则先创建被注入对象Bean实例(完成整个生命周期)后,在进行注入操作;
  • 注入双向对象引用属性时,就比较复杂了,涉及了循环引用(循环依赖)问题,下面会详细阐述解决方案。

Spring循环依赖和三级缓存

当Object1中需要属性注入Object2,Object2也需要属性注入Object1,将Object1和Object2都交给Spring管理时,Spring初始化Bean过程中,假如先初始化Object1,Spring发现需要依赖注入Object2,就会从singletonObjects中去getBean()尝试获取Object2,此时Object2并没有初始化,所以获取不到,那么Object1的初始化挂起,先进行Object2的初始化,又发现了Object2需要依赖注入Object1,此时Object1初始化挂起,并没有实际初始化结束存储到singletonObjects中,所以又去尝试初始化Object1,这就出现循环依赖闭环注入的问题,如下所示

为了解决循环依赖的问题,Spring提供了三级缓存来存储不同初始化完成度的Bean实例

  • singletonObjects/一级缓存:存储单例Bean成品,即初始化完成的Bean实例
  • earlySingletonObjects/二级缓存:存储早期Bean单例池缓存半成品对象,且当前对象已经被其他对象引用了
  • singletonFactories/三级缓存:缓存半成品对象,对象未被引用,使用时在通过工厂创建Bean

还是上述的问题,有了三级缓存就能解决,当Object2从三级缓存中获取到了Object1的引用,那么Object2就可以当作Object1初始化成功,进而完成自己的初始化

Java Spring Bean的生命周期 三级缓存相关推荐

  1. Spring Bean的生命周期(非常详细)

    Spring作为当前Java最流行.最强大的轻量级框架,受到了程序员的热烈欢迎.准确的了解Spring Bean的生命周期是非常必要的.我们通常使用ApplicationContext作为Spring ...

  2. 字节跳动面试题:“请你描述下 Spring Bean 的生命周期?”

    1. 引言 "请你描述下 Spring Bean 的生命周期?",这是面试官考察 Spring 的常用问题,可见是 Spring 中很重要的知识点. 我之前在准备面试时,去网上搜过 ...

  3. 带你读懂Spring Bean 的生命周期,嘿,就是玩儿~

    带你读懂Spring Bean 的生命周期,嘿,就是玩儿~ 一.前言 今天我们来说一说 Spring Bean 的生命周期,小伙伴们应该在面试中经常遇到,这是正常现象.因为 Spring Bean 的 ...

  4. 再聊Spring Bean的生命周期

    Spring Bean的生命周期是Spring面试热点问题.这个问题即考察对Spring的微观了解,又考察对Spring的宏观认识,想要答好并不容易!本文希望能够从源码角度入手,帮助面试者彻底搞定Sp ...

  5. 简述 Spring Bean的生命周期

    "请你描述下 Spring Bean 的生命周期?",这是面试官考察 Spring 的常用问题,可见是 Spring 中很重要的知识点. 其实要记忆该过程,还是需要我们先去理解,本 ...

  6. Spring Bean的生命周期(二)

    上一篇文章大致说明了Spring Bean的生命周期,本章详细说明各个阶段调用的接口方法. 1.1 - 3.2 对应 实例化 Instantiation 4.1 - 4.2 对应 属性赋值 Popul ...

  7. java 中 bean 的生命周期

    java 中 bean 的生命周期 本篇中会对涉及到的知识点皆做出描述: 首先,我们先了解先虚拟机的类加载机制: 虚拟机把描述类的数据从Class 文件中加载到内存,并对数据进行校验.转换解析和初始化 ...

  8. Spring bean 实现生命周期的三种解决方案

    Spring bean 实现生命周期的三种解决方案 参考文章: (1)Spring bean 实现生命周期的三种解决方案 (2)https://www.cnblogs.com/javawebsoa/a ...

  9. 请解释Spring Bean 的生命周期?

    Spring Bean 的生命周期简单易懂.在一个bean 实例被初始化时,需要执行一系列的初始化操作以达到可用的状态.同样的,当一个bean 不在被调用时需要进行相关的析构操作,并从bean 容器中 ...

最新文章

  1. Windows客户端C/C++编程规范“建议”——前言
  2. crc生成多项式怎么算_利用system Verilog生成任意CRC多项式
  3. Linux查看谁修改的文件,linux如何查看近来修改的文件
  4. 第一篇:Entity Framework 简介
  5. Cookie和Session 登录
  6. LeetCode 2068. 检查两个字符串是否几乎相等
  7. 执行公式_一学就会,一吃就瘦,超简单又好执行的减肥食谱公式!
  8. Convert to Ones(CF-998C)
  9. factory service provide自定义服务
  10. 深度学习2.0-20.Keras高层API-metrics
  11. Java基础——详尽说明try-catch-finally的用法
  12. html武侠文字游戏源码,执剑行!最新武侠文字mud游戏
  13. 打包下载 java_java实现文件打包下载
  14. 【re】python正则表达式的用法汇总 + 使用正则表达式提取不让复制的网页的文本内容!
  15. klouderr什么意思_bought是什么意思_bought的翻译_音标_读音_用法_例句_爱词霸在线词典...
  16. RankWarning: Polyfit may be poorly conditioned问题的解决
  17. JavaScript系列之去掉字符串前后的空格
  18. Recap|Hadoop User Group France
  19. 谷歌无法打开微信二维码链接解决方案 之 使用谷歌模拟微信浏览器
  20. 浅谈基于openssl的多级证书,Multi-level CA的签发和管理,以及双向认证

热门文章

  1. 装win10测试软件,这个系统比较高级:测试告诉你有必要重装一个Win10工作站版吗?...
  2. 【金猿人物展】91科技集团董事长许泽玮:数据是元宇宙最核心资产,数据安全是元宇宙的生命线价值...
  3. D1. Great Vova Wall (Version 1)
  4. CodeForces - 140E New Year Garland (DP 计数)
  5. MySQL的50条经典语句(更新中...
  6. 研发效能管理如何建立闭环?
  7. SQL Server的数据排序
  8. html左右分隔可调整,word里面如何设置横向页面和纵向页面同时显示?分隔符号轻松搞定!...
  9. 第七章 短语宏与XML IVR
  10. 保证分布式数据一致性的6种方案