Spring&SpringBoot 常见面试题自测
本来是不准备更新 Spring 和 Spring Boot 的自测了,但星球里的很多小伙伴明确表示需要,所以还是认真整理了一下。每一道问题不光有提示和重要程度说明,有一些还会给出加分的回答小技巧。
Spring 和 Spring Boot 这俩框架类的知识点非常多,但实际面试中常问的也就那几道,一般不会问特别偏的。
📌说明:
- 下面这些 Spring&SpringBoot 自测问题的详细参考答案你都可以在 JavaGuide 和 《Java面试指北》中找到。
- ⭐代表重要程度,⭐越多表现面试越爱问,越要认真准备。
如果觉得 Spring 和 SpringBoot 知识点太多的话,完全可以按照这个自测来准备,把握重点,这样可以节省不少时间!
列举一些重要的 Spring 模块?⭐⭐⭐
💡 提示:
Spring4.x 版本:
Spring5.x 版本:
谈谈你对 Spring IoC 的理解 ⭐⭐⭐⭐⭐
💡 提示:
- IoC(Inversion of Control,控制反转)是一种设计思想,而非具体的技术实现。
- IoC 的核心在于“控制反转”,即将对象的创建和管理权从应用程序代码中转移到外部容器(如 Spring IoC 容器)中,这样应用程序只需关注业务逻辑,而无需关心对象的创建和管理。
- IoC 使得对象之间的耦合度(或依赖程度)降低。
IoC 和 DI 有区别吗?⭐⭐⭐⭐
💡 提示:
IoC 最常见以及最合理的实现方式叫做依赖注入(Dependency Injection,简称 DI)。DI 通过将对象的依赖关系注入到对象内部来实现控制反转。换句话说,DI 是一种实现 IoC 的技术,它通过构造函数注入、setter 方法注入或字段注入等方式,将所需的依赖对象传递给需要它们的组件。
什么是 Spring Bean?作用域有哪些?⭐⭐⭐
💡 提示:
Bean 代指的就是那些被 IoC 容器所管理的对象。
Bean 的作用域通常有下面几种:
作用域 | 描述 |
---|---|
singleton | 容器中唯一的 Bean 实例(默认)。 |
prototype | 每次获取都会创建新实例。 |
request | 每次 HTTP 请求创建新实例(仅 Web 应用)。 |
session | 每次 HTTP Session 创建新实例(仅 Web 应用 )。 |
application/global-session | 每个 Web 应用启动时创建一个实例(仅 Web 应用)。 |
websocket | 每次 WebSocket 会话创建新实例(仅 Web 应用)。 |
singleton
(最常用,默认的作用域)和prototype
这两个作用域是相对用的多点的,其他的基本不会用到。
Bean 是线程安全的吗?⭐⭐⭐⭐
💡 提示:
在 Spring 中,默认的 Singleton Bean 不是线程安全的。这是因为单例模式下,所有线程共享同一个 Bean 实例。如果 Bean 有可变状态,就需要自行管理线程安全。
- 无状态 Bean(如大部分 Service、Dao)通常是线程安全的。
- 有状态 Bean 需要通过同步机制、ThreadLocal 等方式来确保线程安全。
Spring Bean 的生命周期说一下
💡 提示:
整体还是比较复杂和难记的!
如何记忆更快呢?
- 整体上可以简单分为四步:实例化 —> 属性赋值 —> 初始化 —> 销毁。
- 初始化这一步涉及到的步骤比较多,包含
Aware
接口的依赖注入、BeanPostProcessor
在初始化前后的处理以及InitializingBean
和init-method
的初始化操作。 - 销毁这一步会注册相关销毁回调接口,最后通过
DisposableBean
和destory-method
进行销毁。
下面是一张清晰的图解:
📌 再说一个小技巧:实际面试中,如果你的项目利用 Spring Bean 生命周期搞事的话,你可以结合项目聊聊,这会加分不少!
📌 例如,可以使用 InitializingBean
接口与 ApplicationContextAware
接口来优化策略模式的实现,实现策略 beans 的自动装配。详细介绍可以参考这篇文章:设计模式最佳实践探索—策略模式,
BeanDefinition
的作用?其中的懒加载是什么?⭐⭐⭐
💡 提示:
BeanDefinition
是 Spring 框架中用于描述和封装一个 Bean 的元信息的重要概念。它包含了 Spring 容器在创建 Bean 实例时所需要的全部信息。- 一个 Bean 所创建过程中所需要的一些信息都可以从 BeanDefinition 中获取,比如这个 Bean 的 Class 类型、作用域、懒加载(Lazy Initialization)等等。其中,懒加载决定该 Bean 是否应当延迟加载。如果设置为懒加载,则该 Bean 只有在第一次被请求时才会实例化,而不是在容器启动时立即创建。