面试官:准备了一些springboot相关的面试题,快来看看吧
文章目录
- 摘要
- Spring Boot 中的注解 @RestController 和 @Controller 有什么区别?
- Spring Boot 中如何处理异常?
- 使用 @ExceptionHandler 注解处理特定类型的异常:使用 @ExceptionHandler 注解可以将特定类型的异常映射到一个处理方法上,从而实现对异常的统一处理。
- 实现 ErrorController 接口处理未捕获的异常:实现 ErrorController 接口可以处理未被其他方式捕获的异常,例如 404 错误。
- 使用 @ControllerAdvice 注解处理全局异常:使用 @ControllerAdvice 注解可以定义一个全局异常处理器,可以处理所有未被其他方式捕获的异常。
- 如何使用 Spring Boot 集成 MyBatis?
- Spring Boot 中如何使用 AOP?
- 如何在 Spring Boot 中使用缓存?
- Spring Boot 中如何实现文件上传和下载?
- 文件上传
- 文件下载
- Spring Boot 如何处理跨域问题?
- Spring Boot 中如何实现定时任务?
- Spring Boot 中如何使用消息队列?
- Spring Boot 如何实现权限控制?
摘要
本文主要介绍了如何在 Spring Boot 中实现常用的 Web 开发功能,包括 RESTful 接口、缓存、文件上传下载、定时任务和跨域处理。通过本文的学习,读者可以了解到 Spring Boot 的基本用法以及如何使用 Spring Boot 开发 Web 应用。本文提供了清晰的代码示例和详细的操作步骤,希望能够帮助读者更好地使用 Spring Boot 进行 Web 开发。
Spring Boot 中的注解 @RestController 和 @Controller 有什么区别?
@RestController 和 @Controller 注解都用于处理 HTTP 请求,区别在于:
- @Controller 注解需要在每个方法上添加 @ResponseBody 注解,才能将返回值直接输出到 HTTP 响应体中,而
@RestController 注解则可以省略 @ResponseBody 注解。 - @RestController 注解相当于同时使用了 @Controller 和 @ResponseBody 注解,因此常用于
RESTful Web 服务开发中。
Spring Boot 中如何处理异常?
Spring Boot 提供了一个全局异常处理器,通过实现 ExceptionHandler 接口并使用 @ControllerAdvice 注解,可以捕获和处理全局异常。另外,Spring Boot 还提供了一些注解,如 @ExceptionHandler、@ResponseStatus 和 @ControllerAdvice 等,用于处理异常和返回自定义的 HTTP 状态码。
使用 @ExceptionHandler 注解处理特定类型的异常:使用 @ExceptionHandler 注解可以将特定类型的异常映射到一个处理方法上,从而实现对异常的统一处理。
例如,如果要处理自定义的 MyException 异常,可以定义一个处理方法如下:
@ExceptionHandler(MyException.class)
public ResponseEntity<String> handleMyException(MyException ex) {return new ResponseEntity<>("MyException occurred: " + ex.getMessage(), HttpStatus.BAD_REQUEST);
}
实现 ErrorController 接口处理未捕获的异常:实现 ErrorController 接口可以处理未被其他方式捕获的异常,例如 404 错误。
例如,可以实现如下的 ErrorController:
@RestController
public class CustomErrorController implements ErrorController {private static final String PATH = "/error";@RequestMapping(value = PATH)public ResponseEntity<String> error() {return new ResponseEntity<>("An error occurred", HttpStatus.INTERNAL_SERVER_ERROR);}@Overridepublic String getErrorPath() {return PATH;}
}
使用 @ControllerAdvice 注解处理全局异常:使用 @ControllerAdvice 注解可以定义一个全局异常处理器,可以处理所有未被其他方式捕获的异常。
例如,可以定义如下的全局异常处理器:
@ControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public ResponseEntity<String> handleException(Exception ex) {return new ResponseEntity<>("An exception occurred: " + ex.getMessage(), HttpStatus.INTERNAL_SERVER_ERROR);}
}
以上是处理异常的几种方式,具体使用哪种方式需要根据实际情况进行选择。
如何使用 Spring Boot 集成 MyBatis?
使用 Spring Boot 集成 MyBatis 需要添加 MyBatis 和 MyBatis-SpringBoot-Starter 两个依赖,并在配置文件中添加相关配置,如数据源配置和 MyBatis 配置等。
Spring Boot 中如何使用 AOP?
Spring Boot 中使用 AOP 需要引入 spring-boot-starter-aop 依赖,并定义切面和通知。可以使用 @Aspect 注解定义切面,使用 @Before、@After 和 @Around 等注解定义通知。
如何在 Spring Boot 中使用缓存?
在 Spring Boot 中使用缓存需要引入 spring-boot-starter-cache 依赖,并在配置文件中定义缓存配置,如缓存类型、缓存管理器等。可以使用 @Cacheable、@CachePut、@CacheEvict 等注解在方法上添加缓存相关的行为。
Spring Boot 中支持多种缓存解决方案,包括 EhCache、Redis、Caffeine 等。你可以选择任何一个作为你的缓存解决方案,下面以 EhCache 为例介绍如何在 Spring Boot 中使用缓存。
1.添加 EhCache 依赖
在 pom.xml 文件中添加 EhCache 的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-cache</artifactId>
</dependency>
<dependency><groupId>net.sf.ehcache</groupId><artifactId>ehcache</artifactId>
</dependency>
2.配置 EhCache
在 application.properties 文件中添加 EhCache 的配置:
spring.cache.type=ehcache
3.编写缓存逻辑
在需要缓存的方法上添加 @Cacheable 注解,例如:
@Service
public class UserServiceImpl implements UserService {@Override@Cacheable("users")public User getUserById(Long id) {// 从数据库中获取用户信息return userDao.getUserById(id);}}
上述代码中,@Cacheable(“users”) 表示对该方法进行缓存,并指定了缓存的名称为 “users”。
4.测试缓存
在测试代码中调用上述方法,多次调用可以发现第一次查询数据库,之后的调用直接从缓存中获取数据。
@SpringBootTest
public class UserServiceTest {@Autowiredprivate UserService userService;@Testpublic void testGetUserById() {Long id = 1L;userService.getUserById(id); // 第一次查询数据库userService.getUserById(id); // 从缓存中获取数据userService.getUserById(id); // 从缓存中获取数据}}
以上就是使用 EhCache 缓存的基本步骤,在使用其他缓存解决方案时,步骤类似,只需修改配置和依赖即可。
Spring Boot 中如何实现文件上传和下载?
在 Spring Boot 中实现文件上传和下载需要使用 Spring Web MVC 框架提供的 MultipartFile 类和 ResponseEntity 类。上传文件可以使用 @PostMapping 注解和 MultipartFile 类,下载文件可以使用 @GetMapping 注解和 ResponseEntity 类。
文件上传
文件上传需要借助 MultipartFile 对象来处理上传的文件。
1.添加依赖
在 pom.xml 文件中添加 Spring Web 的依赖:
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
2.配置上传文件大小限制
在 application.properties 文件中添加配置:
spring.servlet.multipart.max-file-size=10MB
spring.servlet.multipart.max-request-size=10MB
3.编写上传文件的接口
@RestController
public class FileUploadController {@PostMapping("/upload")public String handleFileUpload(@RequestParam("file") MultipartFile file) throws IOException {// 获取文件名String fileName = file.getOriginalFilename();// 保存文件到指定目录file.transferTo(new File("/path/to/save/" + fileName));return "File uploaded successfully";}
}
上述代码中,@RequestParam(“file”) 表示上传的文件参数名为 “file”,file.transferTo() 方法将文件保存到指定目录中。
文件下载
文件下载需要借助 HttpServletResponse 对象来处理下载的文件。
1.编写下载文件的接口
@RestController
public class FileDownloadController {@GetMapping("/download")public void downloadFile(HttpServletResponse response) throws IOException {// 获取要下载的文件File file = new File("/path/to/download/file");// 设置响应头response.setContentType("application/octet-stream");response.setHeader("Content-Disposition", "attachment; filename=" + file.getName());// 读取文件并写入响应输出流Files.copy(file.toPath(), response.getOutputStream());response.getOutputStream().flush();}
}
上述代码中,response.setContentType() 方法设置响应的 MIME 类型,response.setHeader() 方法设置响应头,Files.copy() 方法将文件读取并写入响应输出流中,完成文件下载。
以上就是文件上传和下载的基本实现方式,可以根据实际需要进行调整和优化。
Spring Boot 如何处理跨域问题?
Spring Boot 中处理跨域问题需要添加相关的跨域配置,如使用 @CrossOrigin 注解或配置 CorsFilter 过滤器。
@RestController
public class MyController {@CrossOrigin@GetMapping("/api/test")public String test() {return "Hello World!";}}
@CrossOrigin 注解还可以配置跨域规则,例如:
@CrossOrigin(origins = "http://localhost:8080", maxAge = 3600)
@GetMapping("/api/test")
public String test() {return "Hello World!";
}
上述代码中,origins 参数指定允许访问的来源,maxAge 参数指定预检请求的有效期,单位为秒。
除了使用 @CrossOrigin 注解外,还可以在 Spring Boot 的配置文件中配置全局跨域规则,例如:
spring:cors:allowed-origins:- http://localhost:8080max-age: 3600
Spring Boot 中如何实现定时任务?
Spring Boot 中实现定时任务可以使用 Spring 的 @Scheduled 注解,它可以将一个方法标记为定时任务,并定义任务的执行规则,如执行时间、执行频率等。
@Component
public class ScheduledTask {@Scheduled(fixedRate = 5000) // 每隔 5 秒执行一次任务public void task() {// 执行定时任务逻辑}}
上述代码中,@Scheduled(fixedRate = 5000) 表示每隔 5 秒执行一次任务,可以根据实际需要调整时间间隔。
@Scheduled 注解还有其他参数可以配置:
- cron:Cron 表达式,指定任务的执行时间。例如:@Scheduled(cron = “0 0 12 * * ?”) 表示每天中午12 点执行任务。
- fixedDelay:表示任务执行完毕后延迟多少毫秒再次执行。
- fixedRate:表示任务执行开始时间与上一次执行结束时间间隔多少毫秒。
- initialDelay:表示首次执行任务的延迟时间,单位为毫秒。
例如,以下代码表示每天中午 12 点执行任务,并且任务执行完毕后延迟 1 分钟再次执行:
@Scheduled(cron = "0 0 12 * * ?")
@Scheduled(fixedDelay = 60000)
public void task() {// 执行定时任务逻辑
}
异常处理
在定时任务中可能会抛出异常,需要对异常进行处理。可以使用 @Scheduled 注解的 exceptionalFor 参数来指定需要捕获的异常类型,例如:
@Scheduled(fixedRate = 5000, exceptionalFor = {IOException.class})
public void task() throws IOException {// 执行定时任务逻辑,可能会抛出 IOException 异常
}
上述代码中,指定了需要捕获的异常类型为 IOException,当出现 IOException 异常时,定时任务不会终止,而是继续执行下一次任务。
以上就是 Spring Boot 中实现定时任务的基本方式,可以根据实际需要进行调整和优化。
Spring Boot 中如何使用消息队列?
Spring Boot 中使用消息队列需要引入相应的消息队列依赖,并在配置文件中添加相关配置。常用的消息队列包括 RabbitMQ、ActiveMQ、Kafka 等。
Spring Boot 如何实现权限控制?
Spring Boot 实现权限控制可以使用 Spring Security 框架,它提供了一系列的安全认证和授权机制,可以通过配置角色、权限等实现细粒度的权限控制。
相关文章:
面试官:准备了一些springboot相关的面试题,快来看看吧
文章目录摘要Spring Boot 中的注解 RestController 和 Controller 有什么区别?Spring Boot 中如何处理异常?使用 ExceptionHandler 注解处理特定类型的异常:使用 ExceptionHandler 注解可以将特定类型的异常映射到一个处理方法上,…...
原子的波尔模型、能量量子化、光电效应、光谱实验、量子态、角动量
一. 卢瑟福模型 1908年,卢瑟福用α粒子继续轰击金箔,发现有极少数粒子,发生了非常大的偏移。而这对于当时主流的葡萄干面包模型理论分析是相悖的。 原子可看成由带正电的原子核和围绕核运动的一些电子组成,原子中心的原子核带正…...
【如何使用Arduino控制WS2812B可单独寻址的LED】
【如何使用Arduino控制WS2812B可单独寻址的LED】 1. 概述2. WS2812B 发光二极管的工作原理3. Arduino 和 WS2812B LED 示例3.1 例 13.2 例 24. 使用 WS2812B LED 的交互式 LED 咖啡桌4.1 原理图4.2 源代码在本教程中,我们将学习如何使用 Arduino 控制可单独寻址的 RGB LED 或 …...
计算机基本知识扫盲(持续更)
计算机基本知识扫盲Q:硬盘和磁盘有什么区别?A:硬盘和磁盘都是存储数据的设备。磁盘指的是存储数据的圆形或者是方形的光盘,但是硬盘则是指机械式硬盘和固态硬盘。磁盘一般用于存储少量数据,例如软件安装文件、音乐和电…...
学习大数据需要什么语言基础
Python易学,人人都可以掌握,如果零基础入门数据开发行业的小伙伴,可以从Python语言入手。 Python语言简单易懂,适合零基础入门,在编程语言排名上升最快,能完成数据挖掘、机器学习、实时计算在内的各种大数…...
ElasticSearch——详细看看ES集群的启动流程
参考:一起看看ES集群的启动流程 本文主要从流程上介绍整个集群是如何启动的,集群状态如何从Red变成Green,然后分析其他模块的流程。 这里的集群启动过程指集群完全重启时的启动过程,期间要经历选举主节点、主分片、数据恢复等重…...
【教学类-30-01】5以内加法题不重复(一页两份)(包含1以内、2以内、3以内、4以内、5以内加法,抽取最大不重复数量)
作品样式: 背景需求: 虽然学前阶段就对幼儿训练加减法列式题遭到诟病,但是从不少幼儿(特别是二胎)在家中已经开始适应加减法题型了。 结合中班年龄特点,我从5以内的不重复加法题开始实验(雪花…...
写博客8年与人生第一个502万
题记:我们并非生来强大,但依然可以不负青春。 原本想好好写一下如何制定一个目标并通过一点一滴的努力去实现,这三年反思发现其实写自己的经历并不重要。 很多人都听过一句话:榜样的力量是无穷的。 更现实和实际的情况是&#x…...
【华为OD机试真题】日志采集系统(javapython)
日志采集系统 时间限制:1s空间限制:256MB限定语言:不限 题目描述: 日志采集是运维系统的的核心组件。日志是按行生成,每行记做一条,由采集系统分 批上报。 如果上报太频繁,会对服务端造成压力;如果上报太晚,会降低用户的体验;如果一 次上报的条数太多,会导致超时…...
epoll源码剖析
文章目录1.前言2.应用层的体现3.两个重要结构(1)eventpoll(2)epitem4.四个函数(1)epoll_create源码(2)epoll_ctl源码(3)epoll_wait的源码(4)epoll_event_callback()5.水平触发和边缘触发1.状态变化2.LT模式3.ET模式1.前言 好久好久没有更新博客了,最近一直在实习&a…...
Linux驱动开发——高级I/O操作(一)
一个设备除了能通过读写操作来收发数据或返回、保存数据,还应该有很多其他的操作。比如一个串口设备还应该具备波特率获取和设置、帧格式获取和设置的操作;一个LED设备甚至不应该有读写操作,而应该具备点灯和灭灯的操作。硬件设备是如此众多,…...
适配器模式:C++设计模式中的瑞士军刀
适配器模式揭秘:C设计模式中的瑞士军刀引言设计模式的重要性适配器模式简介与应用场景适配器模式在现代软件设计中的地位与价值适配器模式基本概念适配器模式的定义与核心思想类适配器与对象适配器的比较设计原则与适配器模式的关系类适配器实现类适配器模式的UML图…...
【三十天精通Vue 3】 第三天 Vue 3的组件详解
✅创作者:陈书予 🎉个人主页:陈书予的个人主页 🍁陈书予的个人社区,欢迎你的加入: 陈书予的社区 🌟专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 组件的概述1. Vue 3 的组件系统2. Vue 3 组件的特点…...
SqlServer实用系统视图,你了解多少?
SqlServer实用系统视图,你了解多少?前言master..spt_valuessysdatabasessysprocesses一套组合拳sysobjectssys.all_objectssyscolumnssystypessyscommentssysindexes结束语前言 在使用任何数据库软件的时候,该软件都会提供一些可能不是那么公…...
NodeJS Cluster模块基础教程
Cluster简介 默认情况下,Node.js不会利用所有的CPU,即使机器有多个CPU。一旦这个进程崩掉,那么整个 web 服务就崩掉了。 应用部署到多核服务器时,为了充分利用多核 CPU 资源一般启动多个 NodeJS 进程提供服务,这时就…...
[C++笔记]vector
vector vector的说明文档 vector是表示可变大小数组的序列容器(动态顺序表)。就像数组一样,vector也采用连续的存储空间来储存元素。这就意味着可以用下标对vector的元素进行访问,和数组一样高效。与数组不同的是,它的大小可以动态改变——…...
Python 迁移学习实用指南:1~5
原文:Hands-On Transfer Learning with Python 协议:CC BY-NC-SA 4.0 译者:飞龙 本文来自【ApacheCN 深度学习 译文集】,采用译后编辑(MTPE)流程来尽可能提升效率。 不要担心自己的形象,只关心如…...
【CSS重点知识】属性计算的过程
✍️ 作者简介: 前端新手学习中。 💂 作者主页: 作者主页查看更多前端教学 🎓 专栏分享:css重难点教学 Node.js教学 从头开始学习 ajax学习 标题什么是计算机属性确定声明值层叠冲突继承使用默认值总结什么是计算机属性 CSS属性值的计算…...
Java避免死锁的几个常见方法(有测试代码和分析过程)
目录 Java避免死锁的几个常见方法 死锁产生的条件 上死锁代码 然后 :jstack 14320 >> jstack.text Java避免死锁的几个常见方法 Java避免死锁的几个常见方法 避免一个线程同时获取多个锁。避免一个线程在锁内同时占用多个资源,尽量保证每个锁…...
go binary包
binary包使用与详解 最近在看一个第三方包的库源码,bigcache,发现其中用到了binary 里面的函数,所以准备研究一下。 可以看到binary 包位于encoding/binary,也就是表示这个包的作用是编辑码作用的,看到文档给出的解释…...
[2025CVPR]DeepVideo-R1:基于难度感知回归GRPO的视频强化微调框架详解
突破视频大语言模型推理瓶颈,在多个视频基准上实现SOTA性能 一、核心问题与创新亮点 1.1 GRPO在视频任务中的两大挑战 安全措施依赖问题 GRPO使用min和clip函数限制策略更新幅度,导致: 梯度抑制:当新旧策略差异过大时梯度消失收敛困难:策略无法充分优化# 传统GRPO的梯…...
设计模式和设计原则回顾
设计模式和设计原则回顾 23种设计模式是设计原则的完美体现,设计原则设计原则是设计模式的理论基石, 设计模式 在经典的设计模式分类中(如《设计模式:可复用面向对象软件的基础》一书中),总共有23种设计模式,分为三大类: 一、创建型模式(5种) 1. 单例模式(Sing…...
Spark 之 入门讲解详细版(1)
1、简介 1.1 Spark简介 Spark是加州大学伯克利分校AMP实验室(Algorithms, Machines, and People Lab)开发通用内存并行计算框架。Spark在2013年6月进入Apache成为孵化项目,8个月后成为Apache顶级项目,速度之快足见过人之处&…...
【Linux】C语言执行shell指令
在C语言中执行Shell指令 在C语言中,有几种方法可以执行Shell指令: 1. 使用system()函数 这是最简单的方法,包含在stdlib.h头文件中: #include <stdlib.h>int main() {system("ls -l"); // 执行ls -l命令retu…...
大型活动交通拥堵治理的视觉算法应用
大型活动下智慧交通的视觉分析应用 一、背景与挑战 大型活动(如演唱会、马拉松赛事、高考中考等)期间,城市交通面临瞬时人流车流激增、传统摄像头模糊、交通拥堵识别滞后等问题。以演唱会为例,暖城商圈曾因观众集中离场导致周边…...
React Native在HarmonyOS 5.0阅读类应用开发中的实践
一、技术选型背景 随着HarmonyOS 5.0对Web兼容层的增强,React Native作为跨平台框架可通过重新编译ArkTS组件实现85%以上的代码复用率。阅读类应用具有UI复杂度低、数据流清晰的特点。 二、核心实现方案 1. 环境配置 (1)使用React Native…...
c++ 面试题(1)-----深度优先搜索(DFS)实现
操作系统:ubuntu22.04 IDE:Visual Studio Code 编程语言:C11 题目描述 地上有一个 m 行 n 列的方格,从坐标 [0,0] 起始。一个机器人可以从某一格移动到上下左右四个格子,但不能进入行坐标和列坐标的数位之和大于 k 的格子。 例…...
linux arm系统烧录
1、打开瑞芯微程序 2、按住linux arm 的 recover按键 插入电源 3、当瑞芯微检测到有设备 4、松开recover按键 5、选择升级固件 6、点击固件选择本地刷机的linux arm 镜像 7、点击升级 (忘了有没有这步了 估计有) 刷机程序 和 镜像 就不提供了。要刷的时…...
华为OD机试-食堂供餐-二分法
import java.util.Arrays; import java.util.Scanner;public class DemoTest3 {public static void main(String[] args) {Scanner in new Scanner(System.in);// 注意 hasNext 和 hasNextLine 的区别while (in.hasNextLine()) { // 注意 while 处理多个 caseint a in.nextIn…...
WEB3全栈开发——面试专业技能点P2智能合约开发(Solidity)
一、Solidity合约开发 下面是 Solidity 合约开发 的概念、代码示例及讲解,适合用作学习或写简历项目背景说明。 🧠 一、概念简介:Solidity 合约开发 Solidity 是一种专门为 以太坊(Ethereum)平台编写智能合约的高级编…...
