目录
- 什么是 Spring Framework ?
- Spring Framework 的优势和不足?
- 你对 IoC 的理解?
- 为什么需要 IoC ?
- IoC 和 DI 的区别?
- IoC 容器的职责?
- 什么是 Spring IoC 容器?
- 构造器注入和 Setter 注入
- BeanFactory 和 ApplicationContext 谁才是 Spring IoC 容器?
- Spring Bean 的生命周期?
- BeanDefinition 是什么?
- Spring 内建的 Bean 作用域有哪些?
- BeanPostProcessor 与 BeanFactoryPostProcessor 的区别?
- 依赖注入和依赖查找的来源是否相同?
- 如何基于 Extensible XML authoring 扩展 Spring XML 元素?
- Java 泛型擦写发生在编译时还是运行时?
- 简述 Spring 事件机制原理?
- @EventListener 的工作原理?
- Spring 提供的注解有哪些?
- 简述 Spring Environment ?
- Environment 完整的生命周期是怎样的?
- Spring 应用上下文的生命周期?
- Spring 应用上下文生命周期有哪些阶段?
- 简述 ObjectFactory?
- 简述 FactoryBean?
- ObjectFactory、FactoryBean 和 BeanFactory 的区别?
- @Bean 的处理流程是怎样的?
- BeanFactory 是如何处理循环依赖?
- 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 方法注入依赖对象,也可以理解为字段注入
对于两种注入方式的看法:
构造器注