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

【git】把本地更改提交远程新分支feature_g

创建并切换新分支 git checkout -b feature_g 添加并提交更改 git add . git commit -m “实现图片上传功能” 推送到远程 git push -u origin feature_g...

pikachu靶场通关笔记22-1 SQL注入05-1-insert注入(报错法)

目录 一、SQL注入 二、insert注入 三、报错型注入 四、updatexml函数 五、源码审计 六、insert渗透实战 1、渗透准备 2、获取数据库名database 3、获取表名table 4、获取列名column 5、获取字段 本系列为通过《pikachu靶场通关笔记》的SQL注入关卡(共10关&#xff0…...

大数据学习(132)-HIve数据分析

​​​​&#x1f34b;&#x1f34b;大数据学习&#x1f34b;&#x1f34b; &#x1f525;系列专栏&#xff1a; &#x1f451;哲学语录: 用力所能及&#xff0c;改变世界。 &#x1f496;如果觉得博主的文章还不错的话&#xff0c;请点赞&#x1f44d;收藏⭐️留言&#x1f4…...

docker 部署发现spring.profiles.active 问题

报错&#xff1a; org.springframework.boot.context.config.InvalidConfigDataPropertyException: Property spring.profiles.active imported from location class path resource [application-test.yml] is invalid in a profile specific resource [origin: class path re…...

【从零开始学习JVM | 第四篇】类加载器和双亲委派机制(高频面试题)

前言&#xff1a; 双亲委派机制对于面试这块来说非常重要&#xff0c;在实际开发中也是经常遇见需要打破双亲委派的需求&#xff0c;今天我们一起来探索一下什么是双亲委派机制&#xff0c;在此之前我们先介绍一下类的加载器。 目录 ​编辑 前言&#xff1a; 类加载器 1. …...

【Linux】自动化构建-Make/Makefile

前言 上文我们讲到了Linux中的编译器gcc/g 【Linux】编译器gcc/g及其库的详细介绍-CSDN博客 本来我们将一个对于编译来说很重要的工具&#xff1a;make/makfile 1.背景 在一个工程中源文件不计其数&#xff0c;其按类型、功能、模块分别放在若干个目录中&#xff0c;mak…...

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement

Cilium动手实验室: 精通之旅---13.Cilium LoadBalancer IPAM and L2 Service Announcement 1. LAB环境2. L2公告策略2.1 部署Death Star2.2 访问服务2.3 部署L2公告策略2.4 服务宣告 3. 可视化 ARP 流量3.1 部署新服务3.2 准备可视化3.3 再次请求 4. 自动IPAM4.1 IPAM Pool4.2 …...

【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解

一、前言 在HarmonyOS 5的应用开发模型中&#xff0c;featureAbility是旧版FA模型&#xff08;Feature Ability&#xff09;的用法&#xff0c;Stage模型已采用全新的应用架构&#xff0c;推荐使用组件化的上下文获取方式&#xff0c;而非依赖featureAbility。 FA大概是API7之…...

stm32进入Infinite_Loop原因(因为有系统中断函数未自定义实现)

这是系统中断服务程序的默认处理汇编函数&#xff0c;如果我们没有定义实现某个中断函数&#xff0c;那么当stm32产生了该中断时&#xff0c;就会默认跑这里来了&#xff0c;所以我们打开了什么中断&#xff0c;一定要记得实现对应的系统中断函数&#xff0c;否则会进来一直循环…...

Electron简介(附电子书学习资料)

一、什么是Electron&#xff1f; Electron 是一个由 GitHub 开发的 开源框架&#xff0c;允许开发者使用 Web技术&#xff08;HTML、CSS、JavaScript&#xff09; 构建跨平台的桌面应用程序&#xff08;Windows、macOS、Linux&#xff09;。它将 Chromium浏览器内核 和 Node.j…...