面试官:准备了一些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,也就是表示这个包的作用是编辑码作用的,看到文档给出的解释…...
CRMEB 框架中 PHP 上传扩展开发:涵盖本地上传及阿里云 OSS、腾讯云 COS、七牛云
目前已有本地上传、阿里云OSS上传、腾讯云COS上传、七牛云上传扩展 扩展入口文件 文件目录 crmeb\services\upload\Upload.php namespace crmeb\services\upload;use crmeb\basic\BaseManager; use think\facade\Config;/*** Class Upload* package crmeb\services\upload* …...
在WSL2的Ubuntu镜像中安装Docker
Docker官网链接: https://docs.docker.com/engine/install/ubuntu/ 1、运行以下命令卸载所有冲突的软件包: for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done2、设置Docker…...
【开发技术】.Net使用FFmpeg视频特定帧上绘制内容
目录 一、目的 二、解决方案 2.1 什么是FFmpeg 2.2 FFmpeg主要功能 2.3 使用Xabe.FFmpeg调用FFmpeg功能 2.4 使用 FFmpeg 的 drawbox 滤镜来绘制 ROI 三、总结 一、目的 当前市场上有很多目标检测智能识别的相关算法,当前调用一个医疗行业的AI识别算法后返回…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
掌握 HTTP 请求:理解 cURL GET 语法
cURL 是一个强大的命令行工具,用于发送 HTTP 请求和与 Web 服务器交互。在 Web 开发和测试中,cURL 经常用于发送 GET 请求来获取服务器资源。本文将详细介绍 cURL GET 请求的语法和使用方法。 一、cURL 基本概念 cURL 是 "Client URL" 的缩写…...
GraphQL 实战篇:Apollo Client 配置与缓存
GraphQL 实战篇:Apollo Client 配置与缓存 上一篇:GraphQL 入门篇:基础查询语法 依旧和上一篇的笔记一样,主实操,没啥过多的细节讲解,代码具体在: https://github.com/GoldenaArcher/graphql…...
海云安高敏捷信创白盒SCAP入选《中国网络安全细分领域产品名录》
近日,嘶吼安全产业研究院发布《中国网络安全细分领域产品名录》,海云安高敏捷信创白盒(SCAP)成功入选软件供应链安全领域产品名录。 在数字化转型加速的今天,网络安全已成为企业生存与发展的核心基石,为了解…...
【版本控制】GitHub Desktop 入门教程与开源协作全流程解析
目录 0 引言1 GitHub Desktop 入门教程1.1 安装与基础配置1.2 核心功能使用指南仓库管理日常开发流程分支管理 2 GitHub 开源协作流程详解2.1 Fork & Pull Request 模型2.2 完整协作流程步骤步骤 1: Fork(创建个人副本)步骤 2: Clone(克隆…...
第22节 Node.js JXcore 打包
Node.js是一个开放源代码、跨平台的、用于服务器端和网络应用的运行环境。 JXcore是一个支持多线程的 Node.js 发行版本,基本不需要对你现有的代码做任何改动就可以直接线程安全地以多线程运行。 本文主要介绍JXcore的打包功能。 JXcore 安装 下载JXcore安装包&a…...
Git 命令全流程总结
以下是从初始化到版本控制、查看记录、撤回操作的 Git 命令全流程总结,按操作场景分类整理: 一、初始化与基础操作 操作命令初始化仓库git init添加所有文件到暂存区git add .提交到本地仓库git commit -m "提交描述"首次提交需配置身份git c…...
