2020 大厂面试一道高频 Spring 题,90% 的 Java 开发者都拜倒在它脚下!
最近很多水友在后台留言问:
Spring 到底是怎么循环依赖问题的,这也是最近两年新出的面试频度较高的面试题!
下面我们就通过这篇文章让大家了解循环依赖的问题。
什么是循环依赖?
循环依赖其实是指两个及以上 bean 相互持有对方,最终形成闭环的过程(一般聊循环依赖都是默认的单例 bean),简单说就是 A 依赖 B,B 依赖 C,C 又依赖 A。
其实在 Spring 中,有两种循环依赖的场景…
第一种:构造器的循环依赖
第二种:setter 的依赖注入
第一种是没有办法解决的,而第二种可以使用提前暴露对象的方式进行解决
那么肯定有很多小伙伴会有疑问,为什么?
其实想搞明白这个问题,需要对 Spring 的 Bean 的生命周期有一个完整的了解,如下图:
大家可能对这个图不太熟悉,但是我要强调的是,图中我已经用三种颜色标识了,除了使用这部分之外,可以分为实例化和初始化,这也是解决问题的核心。
同时,Spring 中还使用了三级缓存来解决问题:
面对大厂问 Spring 源码而言,很多的 Java 面试者都纷纷败北,源码没有一个正确的方法学起来确实挺吃力的,在这把之前学源码的一些经验和笔记分享给大家,希望对那些还在学习 Spring 源码的朋友有所帮助!
Spring 源码复习笔记
由于文案内容过长,只把 Spring 源码笔记文档内部部分截图出来,对学习 Spring 源码感兴趣的小伙伴点赞此文后添加助手 vx:bjmsb10 即可获取免费领取方式!
第一部分 Spring 概述
第 1 节 Spring 简介
第 2 节 Spring 发展历程
第 3 节 Spring 的优势
第 4 节 Spring 的核心结构
第 5 节 Spring 框架版本
第二部分:AOP 与 IOC 核心思想
什么是 loC?
loC 解决了什么问题
loC 和 DI 的区别
什么是 AOP
AOP 在解决什么问题
为什么叫做面向切面编程
第三部分 手写实现 IoC 和 AOP
第四部分 Spring IOC 应用
BeanFactory 与 ApplicationContext 区别
纯 xml 模式
xml 与注解相结合模式
纯注解模式
lazy-Init 延迟加载
FactoryBean 和 BeanF actory
后置处理器
BeanPostProcessor
BeanFactoryPostProcessor
第五部分 Spring IOC 源码深度剖析
Spring loC 容器初始化主体流程
BeanFactory 创建流程
Bean 创建流程
lazy-init 延迟加载机制原理
Spring loC 循环依赖问题
第六部分 Spring AOP 应用
第 1 节 AOP 相关术语
第 2 节 Spring 中 AOP 的代理选择
第 3 节 Spring 中 AOP 的配置方式
第 4 节 Spring 中 AOP 实现
第 5 节 Spring 声明式事务的支持
第七部分 Spring AOP 源码深度剖析
代理对象创建
AOP 基础用例准备
时机点分析
代理对象创建流程
@EnableTransaction Management
加载事务控制组件
总结
最后要说的是,要想不被淘汰,我们必须学习源码。 现在程序员越来越多,可以说竞争尤其激烈。如果我们想不被淘汰,则我们时刻要保持竞争力,那么必然要时刻学习,终生学习,生而有涯而学无涯。因为 CRUD 大家都会,要提高自己的技术能力,此时学习开源项目的源码就尤为关键了。如果我们不想成为 CRUD 工程师,还有更高的技术追求,那么我们就要有更高的要求。当然,学习开源项目源码的目的是借鉴大牛们的优秀作品,最终要学以致用。另外,个人观点:学习源码是提高自己编码能力的最好方式。
如果我们走的是技术路线而非管理路线,若还有更高的技术追求,那么学习源码是我们绕不过去的坎。 真的,学习源码实在是太重要了。只要我们还有更高的技术追求,或许你想成为技术大牛,但是学习源码是成为大牛的必经之路。不是每个人都能成为大牛,但不学源码就肯定成为不了大牛,因为学习源码是提高自己的最好方式,不论何时,学习源码都不会晚,共勉!
下面是本人学习源码入门时看的 Spring 源码 100 集,点赞此文后添加助手 vx:bjmsb10 免费获取
评论