Spring Boot 常用注解面试题深度解析
🤟致敬读者
- 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉
📘博主相关
- 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息
文章目录
- Spring Boot 常用注解面试题深度解析
- 一、核心启动注解(必考)
- 二、Bean 管理与依赖注入
- 三、Spring MVC 注解
- 四、配置与属性绑定
- 五、高级特性注解
- 六、事务与测试
- 七、生产实践与高频问题
- 高频面试题汇总
- 总结:Spring Boot 注解学习路径
📃文章前言
- 🔷文章均为学习工作中整理的笔记。
- 🔶如有错误请指正,共同学习进步。
Spring Boot 常用注解面试题深度解析
以下精选 25+ 高频注解面试题,涵盖核心原理、实战技巧及源码级分析,助你轻松应对面试挑战。
一、核心启动注解(必考)
-
@SpringBootApplication
的作用是什么?包含哪些关键注解?
答:- 核心作用:开启自动配置 + 组件扫描 + 配置类声明
- 元注解组成:
@SpringBootConfiguration // 声明为配置类 @EnableAutoConfiguration // 启用自动配置 @ComponentScan // 包扫描(默认当前包及其子包)
-
@EnableAutoConfiguration
如何实现自动装配?
答:- 加载
META-INF/spring.factories
中的配置类 - 通过
@Conditional
系列注解按条件装配 Bean - 核心流程:
graph LR A[启动类] --> B[@SpringBootApplication] B --> C[@EnableAutoConfiguration] C --> D[AutoConfigurationImportSelector] D --> E[加载spring.factories] E --> F[过滤@Conditional条件] F --> G[注册Bean定义]
- 加载
二、Bean 管理与依赖注入
-
@Component
与@Bean
的区别?
对比表:特性 @Component
@Bean
作用目标 类声明 方法声明 控制权 Spring 自动实例化 开发者手动创建对象 适用场景 自定义类 第三方库组件 依赖注入 支持 @Autowired
需在配置类中使用 -
@Autowired
和@Resource
的区别?
答:@Autowired
:- 按类型注入 →
byType
- 支持
@Qualifier
指定名称 - 是 Spring 原生注解
- 按类型注入 →
@Resource
:- 默认按名称注入 →
byName
(失败时回退到 byType) - JDK 原生注解(
javax.annotation
)
- 默认按名称注入 →
// 示例 @Autowired @Qualifier("mysqlService") private DataService service1;@Resource(name = "oracleService") private DataService service2;
三、Spring MVC 注解
-
@RestController
和@Controller
的区别?
答:@Controller
:- 需要配合
@ResponseBody
返回 JSON - 通常返回视图名称
- 需要配合
@RestController
=@Controller
+@ResponseBody
- 所有方法自动 JSON 序列化
// 传统写法 @Controller public class OldController {@ResponseBodypublic User getUser() { /* ... */ } }// 现代写法 @RestController public class NewController {@GetMapping("/user")public User getUser() { /* ... */ } // 自动转JSON }
-
@PathVariable
与@RequestParam
的应用场景?
对比:注解 位置 示例 URL 获取方式 @PathVariable
URL 路径 /users/{id}
id = 123
@RequestParam
查询字符串 /search?keyword=Spring
keyword = "Spring"
四、配置与属性绑定
-
@Value
与@ConfigurationProperties
如何选择?
答:@Value
:- 适合单个属性注入
- 支持 SpEL 表达式
@Value("${server.port}") private int port;
@ConfigurationProperties
:- 批量绑定属性到对象
- 支持类型安全校验
@ConfigurationProperties(prefix = "datasource") public class DataSourceConfig {private String url;private String username;// getters/setters }
-
@PropertySource
加载自定义配置的注意事项?
答:- 默认不支持 YAML 文件(需配合
YamlPropertySourceFactory
) - 多文件加载顺序决定属性覆盖关系
@Configuration @PropertySource(value = "classpath:custom.properties", encoding = "UTF-8") public class AppConfig { /* ... */ }
- 默认不支持 YAML 文件(需配合
五、高级特性注解
-
@Conditional
系列注解的工作原理?(重点)
核心条件注解:注解 激活条件 @ConditionalOnClass
类路径存在指定类 @ConditionalOnBean
Spring 容器存在指定 Bean @ConditionalOnProperty
配置属性匹配条件 @ConditionalOnWebApplication
当前是 Web 应用 源码解析:
// 自定义条件 public class EnvCondition implements Condition {@Overridepublic boolean matches(ConditionContext context, AnnotatedTypeMetadata metadata) {String env = context.getEnvironment().getProperty("app.env");return "prod".equals(env);} }// 使用示例 @Bean @Conditional(EnvCondition.class) public Service prodService() { /* ... */ }
-
@Async
实现异步调用的线程池配置?
最佳实践:@Configuration @EnableAsync public class AsyncConfig {@Bean(name = "taskExecutor")public Executor taskExecutor() {ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();executor.setCorePoolSize(5);executor.setMaxPoolSize(10);executor.setQueueCapacity(100);executor.setThreadNamePrefix("Async-");return executor;} }// 使用 @Service public class EmailService {@Async("taskExecutor") // 指定线程池public void sendEmail() { /* ... */ } }
六、事务与测试
-
@Transactional
在类和方法上的优先级?
规则:- 方法注解 > 类注解
- 接口注解无效(需基于类代理)
@Service @Transactional // 类级别默认事务 public class UserService {public void updateProfile() { /* 使用类事务 */ }@Transactional(propagation = Propagation.REQUIRES_NEW)public void auditLog() { /* 独立事务 */ } }
-
@SpringBootTest
和@WebMvcTest
的区别?
对比:测试注解 测试范围 启动容器 适用场景 @SpringBootTest
完整集成测试 是 服务层/DAO层测试 @WebMvcTest
仅Web MVC层 否 控制器单元测试 @DataJpaTest
仅JPA组件 否 仓库层测试 // 控制器测试示例 @WebMvcTest(UserController.class) public class UserControllerTest {@Autowired MockMvc mvc;@MockBean UserService userService;@Testvoid getUserTest() throws Exception {mvc.perform(get("/users/1")).andExpect(status().isOk());} }
七、生产实践与高频问题
-
如何自定义 Starter?
关键步骤:- 创建
xxx-spring-boot-autoconfigure
模块 - 编写自动配置类:
@Configuration @ConditionalOnClass(MyService.class) @EnableConfigurationProperties(MyProperties.class) public class MyAutoConfiguration {@Bean@ConditionalOnMissingBeanpublic MyService myService(MyProperties props) {return new MyService(props);} }
- 在
META-INF/spring.factories
注册:org.springframework.boot.autoconfigure.EnableAutoConfiguration=\com.example.MyAutoConfiguration
- 创建
-
@ControllerAdvice
的三种用法?
答:@ControllerAdvice public class GlobalHandler {// 1. 异常处理@ExceptionHandler(NotFoundException.class)public ResponseEntity<Error> handleNotFound(NotFoundException ex) {return ResponseEntity.status(404).body(new Error(ex.getMessage()));}// 2. 数据绑定预处理@InitBinderpublic void initBinder(WebDataBinder binder) {binder.registerCustomEditor(Date.class, new CustomDateEditor(...));}// 3. 模型数据增强@ModelAttributepublic void addCommonModel(Model model) {model.addAttribute("appName", "MyApp");} }
高频面试题汇总
@SpringBootApplication
的三个核心注解分别起什么作用?@Autowired
注入失败有哪些可能原因?答:未扫描包、多个实现类未限定、Bean未创建、静态字段注入等
- 如何让
@Scheduled
定时任务在集群中只执行一次?答:配合
@ConditionalOnProperty
或分布式锁(如 Redis Lock) @Transactional
失效的常见场景?答:自调用、非 public 方法、异常类型错误、数据库引擎不支持
@RequestParam
vs@RequestBody
的区别?答:前者处理 URL 参数,后者处理 JSON/XML 请求体
总结:Spring Boot 注解学习路径
- 基础层:
- 启动注解:
@SpringBootApplication
- Bean 管理:
@Component
,@Bean
,@Autowired
- 启动注解:
- Web 层:
- REST 控制:
@RestController
,@GetMapping
- 参数处理:
@PathVariable
,@RequestBody
- REST 控制:
- 数据层:
- 数据访问:
@Repository
,@Transactional
- 配置绑定:
@ConfigurationProperties
- 数据访问:
- 高级特性:
- 条件装配:
@Conditional
系列 - 异步处理:
@Async
,@EnableAsync
- 条件装配:
- 测试与生产:
- 测试切片:
@WebMvcTest
,@DataJpaTest
- 全局处理:
@ControllerAdvice
,@RestControllerAdvice
- 测试切片:
掌握这些注解的原理和应用场景,不仅能轻松应对面试,更能构建健壮高效的 Spring Boot 应用。
📜文末寄语
- 🟠关注我,获取更多内容。
- 🟡技术动态、实战教程、问题解决方案等内容持续更新中。
- 🟢《全栈知识库》技术交流和分享社区,集结全栈各领域开发者,期待你的加入。
- 🔵加入开发者的《专属社群》,分享交流,技术之路不再孤独,一起变强。
- 🟣点击下方名片获取更多内容🍭🍭🍭👇
相关文章:

Spring Boot 常用注解面试题深度解析
🤟致敬读者 🟩感谢阅读🟦笑口常开🟪生日快乐⬛早点睡觉 📘博主相关 🟧博主信息🟨博客首页🟫专栏推荐🟥活动信息 文章目录 Spring Boot 常用注解面试题深度解析一、核心…...

Linux系统的CentOS7发行版安装MySQL80
文章目录 前言Linux命令行内的”应用商店”安装CentOS的安装软件的yum命令安装MySQL1. 配置yum仓库2. 使用yum安装MySQL3. 安装完成后,启动MySQL并配置开机自启动4. 检查MySQL的运行状态 MySQL的配置1. 获取MySQL的初始密码2. 登录MySQL数据库系统3. 修改root密码4.…...

408第一季 - 数据结构 - 栈与队列
栈 闲聊 栈是一个线性表 栈的特点是后进先出 然后是一个公式 比如123要入栈,一共有5种排列组合的出栈 栈的数组实现 这里有两种情况,,一个是有下标为-1的,一个没有 代码不用看,真题不会考 栈的链式存储结构 L ->…...

【RTP】Intra-Refresh模式下的 H.264 输出,RTP打包的方式和普通 H.264 流并没有本质区别
对于 Intra-Refresh 模式下的 H.264 输出,RTP 打包 的方式和普通 H.264 流并没有本质区别:你依然是在对一帧一帧的 NAL 单元进行 RTP 分包,只不过这些 NAL 单元内部有部分宏块是 “帧内编码” 而已。下面分步骤说明: 1. 原理回顾:RFC 6184 H.264 over RTP 按照 RFC 6184 …...
nano编辑器的详细使用教程
以下是 Linux 下 nano 编辑器 的详细使用指南,涵盖安装、基础操作、高级功能、快捷键以及常见问题处理。 一、安装 nano 大多数 Linux 发行版已预装 nano。如果没有安装,可以通过以下命令安装: Debian/Ubuntu 系:sudo apt update…...

Redis实战-消息队列篇
前言: 讲讲做消息队列遇到的问题。 今日所学: 异步优化消息队列基于stream实现异步下单 1. 异步优化 1.1 需求分析 1.1.1 现有下单流程: 1.查询优惠劵 2.判断是否是秒杀时间,库存是否充足 3.实现一人一单 在这个功能中&…...

(三)Linux性能优化-CPU-CPU 使用率
CPU使用率 user(通常缩写为 us),代表用户态 CPU 时间。注意,它不包括下面的 nice 时间,但包括了 guest 时间。nice(通常缩写为 ni),代表低优先级用户态 CPU 时间,也就是进…...

佰力博科技与您探讨材料介电性能测试的影响因素
1、频率依赖性 材料的介电性能通常具有显著的频率依赖性。在低频下,偶极子的取向极化占主导,介电常数较高;而在高频下,偶极子的取向极化滞后,导致介电常数下降,同时介电损耗增加。例如,VHB4910…...

K8S认证|CKS题库+答案| 4. RBAC - RoleBinding
目录 4. RBAC - RoleBinding 免费获取并激活 CKA_v1.31_模拟系统 题目 开始操作: 1)、切换集群 2)、查看SA和role 3)、编辑 role-1 权限 4)、检查role 5)、创建 role和 rolebinding 6࿰…...

React 新项目
使用git bash 创建一个新项目 建议一开始就创建TS项目 原因在Webpack中改配置麻烦 编译方法:ts compiler 另一种 bable 最好都配置 $ create-react-app cloundmusic --template typescript 早期react项目 yarn 居多 目前npm包管理居多 目前pnpm不通用 icon 在public文件夹中…...
解决MySQL8.4报错ERROR 1524 (HY000): Plugin ‘mysql_native_password‘ is not loaded
最近使用了MySQL8.4 , 服务启动成功,但是就是无法登陆,并且报错: ERROR 1524 (HY000): Plugin mysql_native_password is not loaded 使用如下的命令也报错 mysql -u root -p -P 3306 问题分析: 在MySQL 8.0版本中,默认的认证插件从mysql_native_password变更为cachi…...

AI编程在BOSS项目的实践经验分享
前言 在人工智能技术革新浪潮的推动下,智能编程助手正以前所未有的速度重塑开发领域。这些基于AI的代码辅助工具通过智能提示生成、实时错误检测和自动化重构等功能,显著提升了软件工程的全流程效率。无论是初入行业的开发者还是资深程序员,…...
力扣-131.分割回文串
题目描述 给你一个字符串 s,请你将 s 分割成一些 子串,使每个子串都是 回文串 。返回 s 所有可能的分割方案。 class Solution {List<List<String>> res new ArrayList<>();List<String> path new ArrayList<>();void…...

数学:”度量空间”了解一下?
度量空间是现代数学中一种基本且重要的抽象空间。以下是对它的详细介绍: 定义 相关概念 常见的度量空间举例 度量空间的类型 度量空间的作用 度量空间是拓扑空间的一种特殊情况,它为拓扑空间的研究提供了具体的模型和实例。同时,度量空间在…...

jenkins脚本查看及备份
位置与备份 要完整备份 Jenkins 的所有脚本和相关配置,包括 Jenkinsfile、构建脚本(如 .sh / .bat)、Job 配置、插件、凭据等,你可以从两个层面入手: ✅ 一、完整备份 Jenkins 主目录(最全面) …...

用电脑通过网口控制keysight示波器
KEYSIGHT示波器HD304MSO性能 亮点: 体验 200 MHz 至 1 GHz 的带宽和 4 个模拟通道。与 12 位 ADC 相比,使用 14 位模数转换器 (ADC) 将垂直分辨率提高四倍。使用 10.1 英寸电容式触摸屏轻松查看和分析您的信号。捕获 50 μVRMS 本底噪声的较小信号。使用独有区域触摸在几秒…...
嵌入式面试提纲
一、TCP/IP 协议 1.1 TCP/IP 五层模型概述 链路层(Link Layer) 包括网卡驱动、以太网、Wi‑Fi、PPP 等。负责把数据帧(Frame)在相邻节点间传输。 网络层(Internet Layer) 最典型的是 IP 协议 (IPv4/IPv6)。负责 路由选路、分片与重组。 其他:ICMP(Ping、目的不可达等)…...
算法工程师认知水平要求总结
要成为一名合格的算法工程师或算法科学家,需要达到的认知水平不仅包括扎实的技术功底,更涵盖系统性思维、问题抽象能力和工程实践智慧。以下是关键维度的认知能力要求: 一、理论基础认知深度 数学根基 概率统计:深刻理解贝叶斯推断…...

《如何使用MinGW-w64编译OpenCV和opencv_contrib》
《如何使用MinGW-w64编译OpenCV和opencv_contrib》 在Windows环境下使用MinGW编译OpenCV和opencv_contrib是一个常见需求,尤其是对于那些希望使用GCC工具链而非Visual Studio的开发者。下面我将详细介绍这个过程。 准备工作 首先需要安装和准备以下工具和库: MinGW(建议使…...
数据库、数据仓库、数据中台、数据湖相关概念
文章目录 序言1数据库,数据仓库,数据中台,数据湖-概念对比释义1.1概念产生的时间顺序1.2在使用功能方面对比1.3在使用工具方面对比 2数据仓库2.1数据仓库的发展阶段2.2 数据仓库的设计2.3数据仓库常用工具,方法2.3.1分析型数据库和…...

模拟搭建私网访问外网、外网访问服务器服务的实践操作
目录 实验环境 实践要求 一、准备工作 1、准备四台虚拟机,分别标号 2、 防火墙额外添加两块网卡,自定义网络连接模式 3、 关闭虚拟机的图形管理工具 4、关闭防火墙 5、分别配置四台虚拟机的IP地址,此处举一个例子(使用的临…...
【RAG召回】BM25算法示例
rank-bm25 功能示例 本篇将通过多个示例,快速展示 rank-bm25 库的核心功能。不使用jieba。 准备工作 首先,确保您已经安装了 rank-bm25。 pip install rank-bm25接下来,我们定义一个通用的中文语料库和分词函数。这里我们使用简单的单字切…...

vue中Echarts的使用
文章目录 Echarts概述什么是EchartsEcharts的好处 Vue中Echarts的使用Echarts的安装Echarts的引入 Echarts概述 什么是Echarts Apache ECharts:一个基于 JavaScript 的开源可视化图表库。 其官网如下:https://echarts.apache.org/zh/index.html Echar…...

【C++项目】负载均衡在线OJ系统-1
文章目录 前言项目结果演示技术栈:结构与总体思路compiler编译功能-common/util.hpp 拼接编译临时文件-common/log.hpp 开放式日志-common/util.hpp 获取时间戳方法-秒级-common/util.hpp 文件是否存在-compile_server/compiler.hpp 编译功能编写(重要&a…...
Linux环境-通过命令查看zookeeper注册的服务
假设前置条件如下: 1.root权限用户名:zookeeper 2.zookeeper所在服务器地址:168.7.3.254(非真实ip) 3.zookeeper的bin文件路径:/opt/zookeeper/bin 4.确保zookeeper注册中心已启动 查看注册中心服务如下&a…...

Spring Boot微服务架构(十一):独立部署是否抛弃了架构优势?
Spring Boot 的独立部署(即打包为可执行 JAR/WAR 文件)本身并不会直接丧失架构优势,但其是否体现架构价值取决于具体应用场景和设计选择。以下是关键分析: 一、独立部署与架构优势的关系 内嵌容器的优势保留 Spring Boot 独立部署…...

(四)Linux性能优化-CPU-软中断
软中断 中断其实是一种异步的事件处理机制,可以提高系统的并发处理能力 由于中断处理程序会打断其他进程的运行,所以,为了减少对正常进程运行调度的影响,中断处理程序就需要尽可能快地运行 Linux 将中断处理过程分成了两个阶段&a…...
SCADA|RESTful学习,Apipost通过GET获取KingSCADA实时数据
哈喽,你好啊,我是雷工! 以前记录过一篇《安装APIPost工具,了解RESTful》的笔记。 最近涉及到SCADA程序和MES对接,这种信息化的对接,常常要用到RESTful。 好像还有什么Webservices,我是听的一头雾水。 根本听不懂啊,于是加班补补课,先了解下RESTful。 01 RESTful传…...
【CSS-7】深入解析CSS伪类:从基础到高级应用
CSS伪类是前端开发中不可或缺的强大工具,它们允许我们根据文档树之外的信息或简单选择器无法表达的状态来样式化元素。本文将全面探讨CSS伪类的各种类型、使用场景和最佳实践。 1. 伪类基础概念 1.1 什么是伪类? 伪类(Pseudo-class&#x…...

QT的工程文件.pro文件
文章目录 QT的工程文件.pro文件QT5中的基本模块Qt CoreQt GUIQt WidgetsQt QMLQt QuickQt NetworkQt SQLQt MultimediaQt ConcurrentQt WebEngineQt TestLib TARGET 可选择的模版CONFIG的配置项 QT的工程文件.pro文件 每一个QT项目都至少有一个.pro文件,用来配置项目…...