死磕Spring之IoC篇 - 深入了解Spring IoC(面试题)

本文详细探讨了Spring Framework的核心组件IoC,包括IoC的概念、为何需要IoC、IoC与DI的区别、Spring IoC容器的职责以及Bean的生命周期。通过解析Spring IoC的各个方面,阐述了其在Java应用中的重要性和优势,同时分析了IoC容器的扩展点和生命周期管理。此外,文章还介绍了Spring中的依赖注入实现、Bean的作用域、BeanDefinition、以及Spring应用上下文的生命周期等关键概念,旨在帮助读者深入理解和掌握Spring IoC。
摘要由CSDN通过智能技术生成

目录

  1. 什么是 Spring Framework ?
  2. Spring Framework 的优势和不足?
  3. 你对 IoC 的理解?
  4. 为什么需要 IoC ?
  5. IoC 和 DI 的区别?
  6. IoC 容器的职责?
  7. 什么是 Spring IoC 容器?
  8. 构造器注入和 Setter 注入
  9. BeanFactory 和 ApplicationContext 谁才是 Spring IoC 容器?
  10. Spring Bean 的生命周期?
  11. BeanDefinition 是什么?
  12. Spring 内建的 Bean 作用域有哪些?
  13. BeanPostProcessor 与 BeanFactoryPostProcessor 的区别?
  14. 依赖注入和依赖查找的来源是否相同?
  15. 如何基于 Extensible XML authoring 扩展 Spring XML 元素?
  16. Java 泛型擦写发生在编译时还是运行时?
  17. 简述 Spring 事件机制原理?
  18. @EventListener 的工作原理?
  19. Spring 提供的注解有哪些?
  20. 简述 Spring Environment ?
  21. Environment 完整的生命周期是怎样的?
  22. Spring 应用上下文的生命周期?
  23. Spring 应用上下文生命周期有哪些阶段?
  24. 简述 ObjectFactory?
  25. 简述 FactoryBean?
  26. ObjectFactory、FactoryBean 和 BeanFactory 的区别?
  27. @Bean 的处理流程是怎样的?
  28. BeanFactory 是如何处理循环依赖?
  29. Spring 中几种初始化方法的执行顺序?

1 什么是 Spring Framework ?

官方文档:
在这里插入图片描述
这个问题很难回答,在 Spring 官方文档中的描述也很抽象,答案在于你对 Spring 是如何理解的,想必每个人都有自己的回答方式,以下是我个人对于 Spring 的理解:

整个 Spring 生态在涉及到 Java 的项目中被广泛应用,它提供了非常多的组件,能够让你在开发 Java 应用的过程变得更加容易,弹性地支持其他软件框架,可以比作一个“排插座”,其他软件框架简单地“插上”即可结合 Spring 一起使用,给开发人员带来了非常多的便利。Spring 底层 IoC 容器的设计实现也是非常完美的,在整个 Spring 应用上下文的生命周期和 Spring Bean 的生命周期的许多阶段提供了相应的扩展点,供开发者自行扩展,使得框架非常的灵活。

2. Spring Framework 的优势和不足?
优势:Spring 面向模块进行开发,根据不同的功能进行划分,根据需求引入对应的模块即可,对于开发人员非常友好。例如 Spring IoC 容器,将我们的 Java 对象作为 Spring Bean 进行管理,管理着 Bean 的整个生命周期;Spring MVC 提供“模型-视图-控制器”(Model-View-Controller)架构和随时可用的组件,用于开发灵活且松散耦合的 Web 应用程序;Spring AOP 提供面向切面编程的接口,可以很方便的使用;还有许多其他的功能模块,就不一一讲述了。

不足:整个 Spring 体系比较复杂,对于开发人员需要一定的学习成本,遇到相关问题时需要对底层实现有充分的了解,这也就需要开发人员投入更多的时间和精力去学习。当然,如今 Spring 体系整合了 Java 生态非常多的东西,为开发人员带来的便利远大于这些不足,我觉得是有必要对 Spring 进行充分的学习,去了解 Spring 的贡献者们的设计思路,对自身也会有很大的提升,从中可以学习到许多的东西。
3. 你对 IoC 的理解?
Inversion of Control(IoC)是面向对象中的一种编程思想或原则。可以先回到传统方式,当我依赖一个对象,我需要主动去创建它并进行属性赋值,然后我才能去使用这个对象。对于 IoC 这种方式来说,它使得对象或者组件的创建更为透明,你不需要过多地关注细节,如创建对象、属性赋值,这些工作交都由 IoC 容器来完成,已达到解耦的目的。

IoC 控制反转,简单来理解其实就是把获取依赖对象的方式,交由 IoC 容器来实现,由“主动拉取”变为“被动获取”。
4. 为什么需要 IoC ?
实际上,IoC 是为了屏蔽构造细节。例如 new 出来的对象的生命周期中的所有细节对于使用端都是知道的,如果在没有 IoC 容器的前提下,IoC 是没有存在的必要,不过在复杂的系统中,我们的应用更应该关注的是对象的运用,而非它的构造和初始化等细节。
5. IoC 和 DI 的区别?
DI 依赖注入不完全等同于 IoC,更应该说 DI 依赖注入是 IoC 的一种实现方式或策略。

依赖查找和依赖注入都是 IoC 的实现策略。依赖查找就是在应用程序里面主动调用 IoC 容器提供的接口去获取对应的 Bean 对象,而依赖注入是在 IoC 容器启动或者初始化的时候,通过构造器、字段、setter 方法或者接口等方式注入依赖。依赖查找相比于依赖注入对于开发者而言更加繁琐,具有一定的代码入侵性,需要借助 IoC 容器提供的接口,所以我们总是强调后者。依赖注入在 IoC 容器中的实现也是调用相关的接口获取 Bean 对象,只不过这些工作都是在 IoC 容器启动时由容器帮你实现了,在应用程序中我们通常很少主动去调用接口获取 Bean 对象。
6. IoC 容器的职责?
主要有以下职责:

依赖处理,通过依赖查找或者依赖注入

管理托管的资源(Java Bean 或其他资源)的生命周期

管理配置(容器配置、外部化配置、托管的资源的配置)

IoC 容器有非常多,例如 JDK 的 Java Beans,Java EE 的 EJB,Apache Avalon,Google guice,Spring,其中 Spring 是最成功的的一个,目前被广泛应用。

其中 Spring 借鉴了 JDK 的 Java Beans 设计思想,也使用到其中相关类(例如 java.beans.PropertyEditor 属性编辑器),开发过 IDE 的 GUI 界面的伙伴应该对 Java Beans 比较熟悉。
7. 什么是 Spring IoC 容器?
Spring 框架是一个 IoC 容器的实现,DI 依赖注入是它的实现的一个原则,提供依赖查找和依赖注入两种依赖处理,管理着 Bean 的生命周期。Spring 还提供了 AOP 抽象、事件抽象、事件监听机制、SPI 机制、强大的第三方整合、易测试性等其他特性。
8. 构造器注入和 Setter 注入
构造器注入:通过构造器的参数注入相关依赖对象

Setter 注入:通过 Setter 方法注入依赖对象,也可以理解为字段注入

对于两种注入方式的看法:

构造器注

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值