当前位置: 首页 > 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;看到文档给出的解释…...

Flutter 表单处理完全指南

Flutter 表单处理完全指南 引言 表单是移动应用中不可或缺的一部分&#xff0c;Flutter 提供了强大的表单处理能力。本文将深入探讨 Flutter 表单的各种用法和高级技巧。 基础概念回顾 核心组件 Form: 表单容器TextFormField: 文本输入字段FormState: 表单状态管理GlobalKey: 全…...

搜索广告算法工程师大模型学习--1.计划

大模型时代搜索广告算法专家&#xff1a;理论与数学重构进阶计划 前置约束与学习定调&#xff1a; 核心目标&#xff1a;从传统 NLP 分类思维彻底向大模型生成式思维&#xff08;Generative&#xff09;与搜索广告业务思维&#xff08;Ranking/Retrieval&#xff09;转型。学…...

基于CPX与LSM303的电子罗盘制作:从I2C通信到传感器校准全解析

1. 项目概述与核心价值如果你玩过嵌入式开发&#xff0c;尤其是涉及姿态感知或导航的项目&#xff0c;大概率会碰到一个经典问题&#xff1a;如何让设备“知道”自己面朝哪个方向&#xff1f;加速度计能告诉你设备是平放还是倾斜&#xff0c;陀螺仪能告诉你转得多快&#xff0c…...

vue基于springboot框架的全国非物质文化遗产展示平台

目录同行可拿货,招校园代理 ,本人源头供货商项目概述技术架构核心功能特色设计部署与扩展项目技术支持源码获取详细视频演示 &#xff1a;同行可合作点击我获取源码->->进我个人主页-->获取博主联系方式同行可拿货,招校园代理 ,本人源头供货商 项目概述 全国非物质文…...

Android Recovery 模式工作原理与定制实战

Recovery 是 Android 的"救命系统",负责 OTA 升级、恢复出厂、用户数据加密管理。本文剖析 Recovery 的架构、启动流程、与主系统的通信机制,并演示如何修改并构建一个自定义 Recovery。一、Recovery 到底是什么? 很多人以为 Recovery 是 Android 系统的一个"模…...

基于CircuitPython与BLE构建多探头无线温度监测系统

1. 项目概述&#xff1a;一个无线温度监控的“瑞士军刀” 如果你和我一样&#xff0c;喜欢在周末慢烤一块牛排&#xff0c;或者沉迷于培养天然酵母做面包&#xff0c;那你一定理解同时盯着好几个温度计的烦恼。厨房里烟雾缭绕&#xff0c;烤箱里正烤着东西&#xff0c;发酵箱里…...

合肥工业大学LaTeX论文模板:5分钟解决格式难题的专业方案

合肥工业大学LaTeX论文模板&#xff1a;5分钟解决格式难题的专业方案 【免费下载链接】HFUT_Thesis LaTeX Thesis Template for Hefei University of Technology 项目地址: https://gitcode.com/gh_mirrors/hf/HFUT_Thesis 还在为论文格式调整而烦恼吗&#xff1f;合肥工…...

别只重启软件!解决ThingWorx连接KepServer报错的正确姿势:瞄准后台驱动

别只重启软件&#xff01;解决ThingWorx连接KepServer报错的正确姿势&#xff1a;瞄准后台驱动 在工业物联网&#xff08;IIoT&#xff09;系统的运维中&#xff0c;ThingWorx与KepServer的通信问题堪称经典难题。许多工程师遇到连接报错时&#xff0c;第一反应往往是重启配置界…...

Next.js企业级项目脚手架:架构设计、工程化实践与生产部署指南

1. 项目概述&#xff1a;一个为Next.js量身打造的企业级起点如果你正在寻找一个能让你快速启动Next.js项目&#xff0c;同时又不想在项目初期就陷入繁琐的脚手架搭建、代码规范配置和基础架构设计的泥潭&#xff0c;那么once-ui-system/nextjs-starter这个项目很可能就是你一直…...

ArduPilot开源飞控之飞行模式切换逻辑与安全机制

1. ArduPilot飞行模式的核心价值与设计哲学 第一次接触ArduPilot的飞行模式时&#xff0c;我完全被它的设计哲学震撼到了。这个开源飞控系统将复杂的飞行控制抽象成几十种可切换的行为模式&#xff0c;就像给无人机装上了不同性格的大脑。Stabilize模式下飞机会自动保持平衡&am…...