当前位置: 首页 > news >正文

面试官:准备了一些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 有什么区别&#xff1f;Spring Boot 中如何处理异常&#xff1f;使用 ExceptionHandler 注解处理特定类型的异常&#xff1a;使用 ExceptionHandler 注解可以将特定类型的异常映射到一个处理方法上&#xff0c;…...

原子的波尔模型、能量量子化、光电效应、光谱实验、量子态、角动量

一. 卢瑟福模型 1908年&#xff0c;卢瑟福用α粒子继续轰击金箔&#xff0c;发现有极少数粒子&#xff0c;发生了非常大的偏移。而这对于当时主流的葡萄干面包模型理论分析是相悖的。 原子可看成由带正电的原子核和围绕核运动的一些电子组成&#xff0c;原子中心的原子核带正…...

【如何使用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&#xff1a;硬盘和磁盘有什么区别&#xff1f;A&#xff1a;硬盘和磁盘都是存储数据的设备。磁盘指的是存储数据的圆形或者是方形的光盘&#xff0c;但是硬盘则是指机械式硬盘和固态硬盘。磁盘一般用于存储少量数据&#xff0c;例如软件安装文件、音乐和电…...

学习大数据需要什么语言基础

Python易学&#xff0c;人人都可以掌握&#xff0c;如果零基础入门数据开发行业的小伙伴&#xff0c;可以从Python语言入手。 Python语言简单易懂&#xff0c;适合零基础入门&#xff0c;在编程语言排名上升最快&#xff0c;能完成数据挖掘、机器学习、实时计算在内的各种大数…...

ElasticSearch——详细看看ES集群的启动流程

参考&#xff1a;一起看看ES集群的启动流程 本文主要从流程上介绍整个集群是如何启动的&#xff0c;集群状态如何从Red变成Green&#xff0c;然后分析其他模块的流程。 这里的集群启动过程指集群完全重启时的启动过程&#xff0c;期间要经历选举主节点、主分片、数据恢复等重…...

【教学类-30-01】5以内加法题不重复(一页两份)(包含1以内、2以内、3以内、4以内、5以内加法,抽取最大不重复数量)

作品样式&#xff1a; 背景需求&#xff1a; 虽然学前阶段就对幼儿训练加减法列式题遭到诟病&#xff0c;但是从不少幼儿&#xff08;特别是二胎&#xff09;在家中已经开始适应加减法题型了。 结合中班年龄特点&#xff0c;我从5以内的不重复加法题开始实验&#xff08;雪花…...

写博客8年与人生第一个502万

题记&#xff1a;我们并非生来强大&#xff0c;但依然可以不负青春。 原本想好好写一下如何制定一个目标并通过一点一滴的努力去实现&#xff0c;这三年反思发现其实写自己的经历并不重要。 很多人都听过一句话&#xff1a;榜样的力量是无穷的。 更现实和实际的情况是&#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.前言 好久好久没有更新博客了&#xff0c;最近一直在实习&a…...

Linux驱动开发——高级I/O操作(一)

一个设备除了能通过读写操作来收发数据或返回、保存数据&#xff0c;还应该有很多其他的操作。比如一个串口设备还应该具备波特率获取和设置、帧格式获取和设置的操作;一个LED设备甚至不应该有读写操作&#xff0c;而应该具备点灯和灭灯的操作。硬件设备是如此众多&#xff0c;…...

适配器模式:C++设计模式中的瑞士军刀

适配器模式揭秘&#xff1a;C设计模式中的瑞士军刀引言设计模式的重要性适配器模式简介与应用场景适配器模式在现代软件设计中的地位与价值适配器模式基本概念适配器模式的定义与核心思想类适配器与对象适配器的比较设计原则与适配器模式的关系类适配器实现类适配器模式的UML图…...

【三十天精通Vue 3】 第三天 Vue 3的组件详解

✅创作者&#xff1a;陈书予 &#x1f389;个人主页&#xff1a;陈书予的个人主页 &#x1f341;陈书予的个人社区&#xff0c;欢迎你的加入: 陈书予的社区 &#x1f31f;专栏地址: 三十天精通 Vue 3 文章目录引言一、Vue 3 组件的概述1. Vue 3 的组件系统2. Vue 3 组件的特点…...

SqlServer实用系统视图,你了解多少?

SqlServer实用系统视图&#xff0c;你了解多少&#xff1f;前言master..spt_valuessysdatabasessysprocesses一套组合拳sysobjectssys.all_objectssyscolumnssystypessyscommentssysindexes结束语前言 在使用任何数据库软件的时候&#xff0c;该软件都会提供一些可能不是那么公…...

NodeJS Cluster模块基础教程

Cluster简介 默认情况下&#xff0c;Node.js不会利用所有的CPU&#xff0c;即使机器有多个CPU。一旦这个进程崩掉&#xff0c;那么整个 web 服务就崩掉了。 应用部署到多核服务器时&#xff0c;为了充分利用多核 CPU 资源一般启动多个 NodeJS 进程提供服务&#xff0c;这时就…...

[C++笔记]vector

vector vector的说明文档 vector是表示可变大小数组的序列容器(动态顺序表)。就像数组一样&#xff0c;vector也采用连续的存储空间来储存元素。这就意味着可以用下标对vector的元素进行访问&#xff0c;和数组一样高效。与数组不同的是&#xff0c;它的大小可以动态改变——…...

Python 迁移学习实用指南:1~5

原文&#xff1a;Hands-On Transfer Learning with Python 协议&#xff1a;CC BY-NC-SA 4.0 译者&#xff1a;飞龙 本文来自【ApacheCN 深度学习 译文集】&#xff0c;采用译后编辑&#xff08;MTPE&#xff09;流程来尽可能提升效率。 不要担心自己的形象&#xff0c;只关心如…...

【CSS重点知识】属性计算的过程

✍️ 作者简介: 前端新手学习中。 &#x1f482; 作者主页: 作者主页查看更多前端教学 &#x1f393; 专栏分享&#xff1a;css重难点教学 Node.js教学 从头开始学习 ajax学习 标题什么是计算机属性确定声明值层叠冲突继承使用默认值总结什么是计算机属性 CSS属性值的计算…...

Java避免死锁的几个常见方法(有测试代码和分析过程)

目录 Java避免死锁的几个常见方法 死锁产生的条件 上死锁代码 然后 &#xff1a;jstack 14320 >> jstack.text Java避免死锁的几个常见方法 Java避免死锁的几个常见方法 避免一个线程同时获取多个锁。避免一个线程在锁内同时占用多个资源&#xff0c;尽量保证每个锁…...

go binary包

binary包使用与详解 最近在看一个第三方包的库源码&#xff0c;bigcache&#xff0c;发现其中用到了binary 里面的函数&#xff0c;所以准备研究一下。 可以看到binary 包位于encoding/binary&#xff0c;也就是表示这个包的作用是编辑码作用的&#xff0c;看到文档给出的解释…...

在HarmonyOS ArkTS ArkUI-X 5.0及以上版本中,手势开发全攻略:

在 HarmonyOS 应用开发中&#xff0c;手势交互是连接用户与设备的核心纽带。ArkTS 框架提供了丰富的手势处理能力&#xff0c;既支持点击、长按、拖拽等基础单一手势的精细控制&#xff0c;也能通过多种绑定策略解决父子组件的手势竞争问题。本文将结合官方开发文档&#xff0c…...

uni-app学习笔记二十二---使用vite.config.js全局导入常用依赖

在前面的练习中&#xff0c;每个页面需要使用ref&#xff0c;onShow等生命周期钩子函数时都需要像下面这样导入 import {onMounted, ref} from "vue" 如果不想每个页面都导入&#xff0c;需要使用node.js命令npm安装unplugin-auto-import npm install unplugin-au…...

无法与IP建立连接,未能下载VSCode服务器

如题&#xff0c;在远程连接服务器的时候突然遇到了这个提示。 查阅了一圈&#xff0c;发现是VSCode版本自动更新惹的祸&#xff01;&#xff01;&#xff01; 在VSCode的帮助->关于这里发现前几天VSCode自动更新了&#xff0c;我的版本号变成了1.100.3 才导致了远程连接出…...

令牌桶 滑动窗口->限流 分布式信号量->限并发的原理 lua脚本分析介绍

文章目录 前言限流限制并发的实际理解限流令牌桶代码实现结果分析令牌桶lua的模拟实现原理总结&#xff1a; 滑动窗口代码实现结果分析lua脚本原理解析 限并发分布式信号量代码实现结果分析lua脚本实现原理 双注解去实现限流 并发结果分析&#xff1a; 实际业务去理解体会统一注…...

ElasticSearch搜索引擎之倒排索引及其底层算法

文章目录 一、搜索引擎1、什么是搜索引擎?2、搜索引擎的分类3、常用的搜索引擎4、搜索引擎的特点二、倒排索引1、简介2、为什么倒排索引不用B+树1.创建时间长,文件大。2.其次,树深,IO次数可怕。3.索引可能会失效。4.精准度差。三. 倒排索引四、算法1、Term Index的算法2、 …...

Map相关知识

数据结构 二叉树 二叉树&#xff0c;顾名思义&#xff0c;每个节点最多有两个“叉”&#xff0c;也就是两个子节点&#xff0c;分别是左子 节点和右子节点。不过&#xff0c;二叉树并不要求每个节点都有两个子节点&#xff0c;有的节点只 有左子节点&#xff0c;有的节点只有…...

【Go语言基础【13】】函数、闭包、方法

文章目录 零、概述一、函数基础1、函数基础概念2、参数传递机制3、返回值特性3.1. 多返回值3.2. 命名返回值3.3. 错误处理 二、函数类型与高阶函数1. 函数类型定义2. 高阶函数&#xff08;函数作为参数、返回值&#xff09; 三、匿名函数与闭包1. 匿名函数&#xff08;Lambda函…...

[免费]微信小程序问卷调查系统(SpringBoot后端+Vue管理端)【论文+源码+SQL脚本】

大家好&#xff0c;我是java1234_小锋老师&#xff0c;看到一个不错的微信小程序问卷调查系统(SpringBoot后端Vue管理端)【论文源码SQL脚本】&#xff0c;分享下哈。 项目视频演示 【免费】微信小程序问卷调查系统(SpringBoot后端Vue管理端) Java毕业设计_哔哩哔哩_bilibili 项…...

永磁同步电机无速度算法--基于卡尔曼滤波器的滑模观测器

一、原理介绍 传统滑模观测器采用如下结构&#xff1a; 传统SMO中LPF会带来相位延迟和幅值衰减&#xff0c;并且需要额外的相位补偿。 采用扩展卡尔曼滤波器代替常用低通滤波器(LPF)&#xff0c;可以去除高次谐波&#xff0c;并且不用相位补偿就可以获得一个误差较小的转子位…...

pycharm 设置环境出错

pycharm 设置环境出错 pycharm 新建项目&#xff0c;设置虚拟环境&#xff0c;出错 pycharm 出错 Cannot open Local Failed to start [powershell.exe, -NoExit, -ExecutionPolicy, Bypass, -File, C:\Program Files\JetBrains\PyCharm 2024.1.3\plugins\terminal\shell-int…...