2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下!

最近很多水友在后台留言问:

Spring到底是怎么循环依赖问题的,这也是最近两年新出的面试频度较高的面试题!

下面我们就通过这篇文章让大家了解循环依赖的问题。

什么是循环依赖?

循环依赖其实是指两个及以上bean相互持有对方,最终形成闭环的过程(一般聊循环依赖都是默认的单例bean),简单说就是A依赖B,B依赖C,C又依赖A。

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

其实在Spring中,有两种循环依赖的场景…

  • 第一种:构造器的循环依赖
  • 第二种:setter的依赖注入

第一种是没有办法解决的,而第二种可以使用提前暴露对象的方式进行解决

那么肯定有很多小伙伴会有疑问,为什么?

其实想搞明白这个问题,需要对Spring的Bean的生命周期有一个完整的了解,如下图:

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

大家可能对这个图不太熟悉,但是我要强调的是,图中我已经用三种颜色标识了,除了使用这部分之外,可以分为实例化和初始化,这也是解决问题的核心。

同时,Spring中还使用了三级缓存来解决问题:

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

面对大厂问Spring源码而言,很多的Java面试者都纷纷败北,源码没有一个正确的方法学起来确实挺吃力的,在这把之前学源码的一些经验和笔记分享给大家,希望对那些还在学习Spring源码的朋友有所帮助!

Spring源码复习笔记

由于文案内容过长,只把Spring源码笔记文档内部部分截图出来,对学习Spring源码感兴趣的小伙伴点击这里即可获取免费领取方式!

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

第一部分 Spring 概述

  • 第1节Spring简介
  • 第2节Spring发展历程
  • 第3节Spring的优势
  • 第4节Spring的核心结构
  • 第5节Spring框架版本

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

第二部分:AOP与IOC核心思想

  • 什么是loC?
  • loC解决了什么问题
  • loC和DI的区别
  • 什么是AOP
  • AOP在解决什么问题
  • 为什么叫做面向切面编程

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

第三部分 手写实现 IoC 和 AOP

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

第四部分 Spring IOC 应用

  • BeanFactory与ApplicationContext区别
  • 纯xml模式
  • xml与注解相结合模式
  • 纯注解模式
  • lazy-Init延迟加载
  • FactoryBean和BeanF actory
  • 后置处理器
  • BeanPostProcessor
  • BeanFactoryPostProcessor

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

第五部分 Spring IOC源码深度剖析

  • Spring loC容器初始化主体流程
  • BeanFactory创建流程
  • Bean创建流程
  • lazy-init延迟加载机制原理
  • Spring loC循环依赖问题

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

第六部分 Spring AOP 应用

  • 第1节AOP相关术语
  • 第2节Spring中AOP的代理选择
  • 第3节Spring中AOP的配置方式
  • 第4节Spring中AOP实现
  • 第5节Spring声明式事务的支持

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

第七部分 Spring AOP源码深度剖析

  • 代理对象创建
  • AOP基础用例准备
  • 时机点分析
  • 代理对象创建流程
  • @EnableTransaction Management
  • 加载事务控制组件

2020大厂面试一道高频Spring题,90%的Java开发者都拜倒在它脚下

总结

最后要说的是,要想不被淘汰,我们必须学习源码。 现在程序员越来越多,可以说竞争尤其激烈。如果我们想不被淘汰,则我们时刻要保持竞争力,那么必然要时刻学习,终生学习,生而有涯而学无涯。因为CRUD大家都会,要提高自己的技术能力,此时学习开源项目的源码就尤为关键了。如果我们不想成为CRUD工程师,还有更高的技术追求,那么我们就要有更高的要求。当然,学习开源项目源码的目的是借鉴大牛们的优秀作品,最终要学以致用。另外,个人观点:学习源码是提高自己编码能力的最好方式。

如果我们走的是技术路线而非管理路线,若还有更高的技术追求,那么学习源码是我们绕不过去的坎。 真的,学习源码实在是太重要了。只要我们还有更高的技术追求,或许你想成为技术大牛,但是学习源码是成为大牛的必经之路。不是每个人都能成为大牛,但不学源码就肯定成为不了大牛,因为学习源码是提高自己的最好方式,不论何时,学习源码都不会晚,共勉!

猜你喜欢

转载自blog.csdn.net/rxh811/article/details/107343360
今日推荐