Spring Boot 面试题——常用注解
目录
- Spring Bean
- 将一个类声明为 Bean
- 自动装配 Bean
- 声明 Bean 的作用域
- 前端后传值
- 处理常见的 HTTP 请求类型
- 读取配置文件
- 定时任务
- 全局 Controller 层异常处理
Spring Bean
将一个类声明为 Bean
@Component:通用的注解,可标注任意类为 Spring 组件。如果一个 Bean 不知道属于哪个层,可以使用@Component注解标注。@Repository:用于标识数据访问层(DAO 层)组件类作为Bean,主要用于数据库相关操作。@Service:用于标识服务层组件类作为 Bean,,主要涉及一些复杂的逻辑,需要用到 Dao 层。@Controller/@RestCpntroller:对应 Spring MVC 控制层,主要用于接受用户请求并调用 Service 层返回数据给前端页面。@Configuration:一般用来声明配置类,可以使用@Component注解替代,但是使用@Configuration注解声明配置类时更易理解。
自动装配 Bean
(1)在 Spring 中,自动装配 Bean 的注解有以下几种:
@Autowired:自动按照类型进行装配,如果一个接口有多个实现类,可以在需要的属性上加上@Qualifier注解指定名称。@Qualifier:在与 @Autowired 连用时,指定按照名称装配。@Resource:默认按照名称进行装配,名称可以通过 name 属性进行指定;如果基于名称注入失败则转为基于类型注入。@Inject:与 @Autowired 功能一样,但是需要额外导入javax.inject包,因为它是 Java EE 标准中的注解。
(2)这些注解可以在某个类中的属性、构造方法或者 set 方法上进行使用,从而使得该属性、构造方法或 set 方法自动装配相应的 Bean。可以根据具体需要选择适合的自动装配注解进行使用。
声明 Bean 的作用域
(1)@Scope 注解用于指定 Spring 容器中 Bean 的作用域。它的主要作用是控制 Spring 容器中 Bean 的生命周期,包括创建、初始化、销毁等过程。@Scope 注解有以下几个属性值:
singleton (默认值):表示 Spring 容器中只有一个实例,每次请求都返回同一个实例,底层是采用单例模式来实现的。prototype:表示 Spring 容器中每次请求返回一个新的实例。request:表示在一次 HTTP 请求中,每次请求返回一个新的实例。session:表示在一个 HTTP Session 中,每次请求返回一个新的实例。global session:表示在一个全局的 HTTP Session 中,每次请求返回一个新的实例。
(2)举例说明:
// @Bean 注解在配置类中通过方法返回值来手动注册为 Bean
@Bean
@Scope("prototype")
public Person personSingleton() {return new Person();
}
上述示例中,使用 @Scope 注解指定 Person 类的作用域为 prototype,表示每次从 Spring 容器中获取该 Bean 时都会返回一个新的实例。如果不指定,默认的作用域为 singleton,表示从 Spring 容器中获取到的都是同一个实例。
(3)除了上面列举的作用域,Spring 还提供了一些作用域注解和自定义作用域的方式供用户使用,如:@SessionScope、@RequestScope、@ApplicationScope 等。根据实际需要,选择适当的作用域可以有效地控制 Spring 容器中 Bean 的生命周期和内存资源的使用。
有关注解 @Component 和 @Bean 的区别可参考Spring 常见面试题这篇文章中的 2.4 节。
前端后传值
Spring Boot 中前后端传值的注解主要有以下几个:
@RequestBody:该注解用于读取前端传来的 Request 请求(例如 POST、PUT、DELETE、GET 等请求)的 body 部分,并且 Content-Type 为application/json格式的数据,接收到数据之后会自动将数据绑定到 Java 实体类对象上。
@PostMapping("/user")
public void addUser(@RequestBody User user) {// TODO: 添加用户到数据库
}
@RequestParam:这个注解用于接收前端传来的请求参数。例如:
@GetMapping("/user")
public User getUser(@RequestParam("id") Integer id) {// TODO: 根据 id 从数据库中获取用户信息
}
@PathVariable:这个注解用于接收 URL 中的动态参数。例如:
@GetMapping("/user/{id}")
public User getUserById(@PathVariable("id") Integer id) {// TODO: 根据 id 从数据库中获取用户信息
}
@ModelAttribute:这个注解用于在表单提交时接收表单中的数据,并将其转换成对应的 Java 实体类对象。例如:
@PostMapping("/user")
public void addUser(@ModelAttribute User user) {// TODO: 添加用户到数据库
}
注意:一个请求方法只可以有一个
@RequestBody,但是可以有多个@RequestParam和@PathVariable。
处理常见的 HTTP 请求类型
(1)在介绍与处理常见的 HTTP 请求相关的注解之前,先看看下面 5 种常见的 HTTP 请求类型:
GET:用于向指定的 URL 获取数据。例如:
GET /user?id=1 HTTP/1.1
Host: example.com
POST:用于向指定的 URL 提交数据,数据被包含在请求体中。例如:
POST /user HTTP/1.1
Host: example.com{"id":1, "name":"john", "age":18}
PUT:用于向指定的 URL 提交更新数据,数据被包含在请求体中。例如:
PUT /user HTTP/1.1
Host: example.com{"id":1, "name":"john", "age":19}
DELETE:用于请求服务器删除指定的 URL 资源。例如:
DELETE /user?id=1 HTTP/1.1
Host: example.com
PATCH:用于向指定的 URL 提交局部修改的数据,数据被包含在请求体中。例如:
PATCH /user HTTP/1.1
Host: example.com{"id":1, "age":20}
以上是常见的 5 种 HTTP 请求类型,它们在 RESTful API 中都有广泛应用。它们的不同之处在于请求语义和数据的传递方式,开发者需要根据实际场景选择合适的请求类型。
(2)Spring Boot 中与处理常见的 HTTP 请求类型有关的注解主要有以下几个:
@GetMapping:处理 HTTP 的 GET 请求。例如:
// @GetMapping("user/{userId}") 等价于 @RequestMapping(value="/user/{userId}", method=RequestMethod.GET)
@GetMapping("/user/{userId}")
public RespBean getUserById(@PathVariable("userId") Long userId) {// TODO: 根据 userId 从数据库中获取用户信息User user = new User();user.setId(userId);user.setName("Alice");user.setAge(20);return RespBean.success("获取用户信息成功", user);
}
@PostMapping:处理 HTTP 的 POST 请求。例如:
// @PostMapping("user") 等价于 @RequestMapping(value="/user", method=RequestMethod.POST)
@PostMapping("/user")
public RespBean addUser(@RequestBody User user) {// TODO: 添加用户到数据库,并返回新用户的 idLong newUserId = 2L;user.setId(newUserId);return RespBean.success("添加用户成功", user);
}
@PutMapping:处理 HTTP 的 PUT 请求。例如:
// @PutMapping("/user/{userId}") 等价于 @RequestMapping(value="/user/{userId}", method=RequestMethod.PUT)
@PutMapping("/user/{userId}")
public RespBean updateUser(@PathVariable("userId") Long userId, @RequestBody User user) {// TODO: 根据 userId 更新用户信息,并返回更新后的用户信息user.setId(userId);user.setAge(30);return RespBean.success("更新用户信息成功", user);
}
@DeleteMapping:处理 HTTP 的 DELETE 请求。例如:
// @DeleteMapping("/user/{userId}")等价于 @RequestMapping(value="/user/{userId}", method=RequestMethod.DELETE)
@DeleteMapping("/user/{userId}")
public RespBean deleteUserById(@PathVariable("userId") Long userId) {// TODO: 根据 userId 从数据库中删除用户信息return RespBean.success("删除用户信息成功");
}
@PatchMapping:处理 HTTP 的 PATCH 请求,在 RESTful API 中常用于更新部分资源的信息。例如,对于一个 User 对象,我们可以使用 PATCH 请求更新该对象的部分属性,如只更新用户名或者年龄等。具体实现可以根据传入的 JSON 数据中的属性进行判断,只更新其中修改过的属性而不是全部属性。一个示例代码如下:
@PatchMapping("/users/{userId}")
public RespBean partialUpdateUser(@PathVariable("userId") Long userId, @RequestBody Map<String, Object> updates) {// TODO: 根据 userId 更新用户的部分属性User user = getUserFromDatabase(userId);if (updates.containsKey("name")) {user.setName((String) updates.get("name"));}if (updates.containsKey("age")) {user.setAge((Integer) updates.get("age"));}// ...updateUserToDatabase(user);return RespBean.success("更新用户信息成功", user);
}
在上面的示例中,通过接收一个 Map 类型的 updates 参数,可以根据不同的属性进行不同的处理,并将更新后的用户对象返回。使用 RespBean 作为统一的结果返回类,可以很方便地将更新结果的状态码、提示语及数据打包成一个 RespBean 返回给调用方。
(3)以上是 Spring Boot 中常见的 HTTP 请求类型的一些注解,它们可以很方便地处理不同类型的请求并且能够以 RESTful 风格返回数据,在返回结果时使用统一的自定义的 RespBean 类型,使得开发者可以更加方便地统一处理返回结果的格式。
读取配置文件
与读取配置文件相关的注解如下所示:
@Value:获取配置文件中的值;@ConfigurationProperties:将配置文件中的值注入到一个 JavaBean 中;@PropertySource:读取指定位置的 properties 文件;
上述注解的具体细节可参考Spring Boot 面试题——配置文件这篇文章。
定时任务
与实现定时任务相关的注解如下所示:
@Scheduled:用于创建定时任务,通过使用该注解,可以在指定的时间间隔内反复执行带有注解的方法。@Scheduled 注解支持 cron 表达式、固定速率和固定延迟等方式来指定任务的执行时间。@Enablescheduling:发现注解@Scheduled的任务并在后台执行该任务,一般在启动类上添加该注解;
上述注解的具体细节可参考 Spring Boot 面试题——定时任务这篇文章。
全局 Controller 层异常处理
与全局 Controller 层异常处理相关的注解如下所示:
@ControllerAdvice:定义全局异常处理器类,处理异常后返回视图或 HTML 页面,所以处理器方法必须返回ModelAndView对象或者String类型的视图名称;@RestControllerAdvice:定义全局异常处理器类,处理异常后的返回值是纯数据(JSON或XML格式的数据),因此所以处理器方法可以直接返回对象、字符串等数据类型;@ExceptionHandler:指定异常处理方法;
上述注解的具体细节可参考 Spring Boot 面试题——全局异常处理这篇文章。
相关文章:
Spring Boot 面试题——常用注解
目录 Spring Bean将一个类声明为 Bean自动装配 Bean声明 Bean 的作用域 前端后传值处理常见的 HTTP 请求类型读取配置文件定时任务全局 Controller 层异常处理 Spring Bean 将一个类声明为 Bean Component:通用的注解,可标注任意类为 Spring 组件。如果…...
RabbitMQ(高级特性) 设置队列所有消息存活时间
RabbitMQ可以设置消息的存活时间(Time To Live,简称TTL),当消息到达存活时间后还没有被消费,会被移出队列。RabbitMQ可以对队列的所有消息设置存活时间,也可以对某条消息设置存活时间。 Configuration pub…...
刷题学习记录
[MRCTF2020]PYWebsite1 进入环境,页面就提示要购买flag,不要想着购买,因为扫码后提示的是一个文本 “拜托!你不会真的想PYflag吧,这样可是违规的!再好好分析一下界面代码吧” 查看网页源码,发现…...
WPF中依赖属性及附加属性的概念及用法
完全来源于十月的寒流,感谢大佬讲解 依赖属性 由依赖属性提供的属性功能 与字段支持的属性不同,依赖属性扩展了属性的功能。 通常,添加的功能表示或支持以下功能之一: 资源数据绑定样式动画元数据重写属性值继承WPF 设计器集成 …...
Golang爬虫封装
引言 爬虫是一种自动化地从网页中提取信息的程序,它在现代互联网的数据获取和分析中扮演着重要的角色。Golang作为一门强大的编程语言,也提供了丰富的工具和库来实现爬虫功能。在本文中,我们将探讨如何使用Golang来封装一个灵活、高效的爬虫…...
技术分享 | 抓包分析 TCP 协议
TCP 协议是在传输层中,一种面向连接的、可靠的、基于字节流的传输层通信协议。 环境准备 对接口测试工具进行分类,可以如下几类: 网络嗅探工具:tcpdump,wireshark代理工具:fiddler,charles&a…...
基于前馈神经网络完成鸢尾花分类
目录 1 小批量梯度下降法 1.0 展开聊一聊~ 1.1 数据分组 1.2 用DataLoader进行封装 1.3 模型构建 1.4 完善Runner类 1.5 模型训练 1.6 模型评价 1.7 模型预测 思考 总结 参考文献 首先基础知识铺垫~ 继续使用第三章中的鸢尾花分类任务,将Softm…...
软考高级系统架构设计师系列之:UML建模、设计模式和软件架构设计章节选择题详解
软考高级系统架构设计师系列之:UML建模、设计模式和软件架构设计章节选择题详解 一、设计模式二、4+1模型三、面向对象的分析模型四、构件五、基于架构的软件设计六、4+1视图七、软件架构风格八、特定领域软件架构九、虚拟机十、架构评估十一、敏感点和权衡点十二、分层结构十…...
成集云 | 电商平台、ERP、WMS集成 | 解决方案
电商平台ERPWMS 方案介绍 电商平台即是一个为企业或个人提供网上交易洽谈的平台。企业电子商务平台是建立在Internet网上进行商务活动的虚拟网络空间和保障商务顺利运营的管理环境;是协调、整合信息流、货物流、资金流有序、关联、高效流动的重要场所。企业、商家…...
吴恩达《机器学习》4-6->4-7:正规方程
一、正规方程基本思想 正规方程是一种通过数学推导来求解线性回归参数的方法,它通过最小化代价函数来找到最优参数。 代价函数 J(θ) 用于度量模型预测值与实际值之间的误差,通常采用均方误差。 二、步骤 准备数据集,包括特征矩阵 X 和目标…...
VO、DTO
DTO DTO(Data Transfer Object) 数据传输对象【前后端交互】 也就是后端开发过程中,用来接收前端传过来的参数,一般会创建一个Java对应的DTO类(UserDTO等等) 因为前端一般传来的是Json格式的数据…...
RK3566上运行yolov5模型进行图像识别
一、简介 本文记录了依靠RK官网的文档,一步步搭建环境到最终在rk3566上把yolov5 模型跑起来。最终实现的效果如下: 在rk3566 板端运行如下app: ./rknn_yolov5_demo model/RK356X/yolov5s-640-640.rknn model/bus.jpg其中yolov5s-640-640.r…...
汽车标定技术(一):XCP概述
目录 1.汽车标定概述 2.XCP协议由来及版本介绍 3.XCP技术通览 3.1 XCP上下机通信模型 3.2 XCP指令集 3.2.1 XCP帧结构定义 3.2.2 标准指令集 3.2.3 标定指令集 3.2.4 页切换指令集 3.2.5 数据采集指令集 3.2.6 刷写指令集 3.3 ECU描述文件(A2L)概述 3.3.1 标定上位…...
短视频的运营方法
尊敬的用户们,你们好!今天我将为大家带来一篇关于短视频运营的专业文章。在当今互联网时代,短视频已经成为了一个重要的流量入口,掌握正确的运营方法对于企业的发展至关重要。接下来,我将通过以下几个方面为大家详细介…...
GitLab CI/CD 持续集成/部署 SpringBoot 项目
一、GitLab CI/CD 介绍 GitLab CI/CD(Continuous Integration/Continuous Deployment)是 GitLab 提供的一种持续集成和持续部署的解决方案。它可以自动化软件的构建、测试和部署过程,以便开发者更快地、更频繁地发布可靠的产品。 整体过程如…...
第二证券:政策效应逐步显现 A股修复行情有望持续演绎
上星期,A股商场延续企稳反弹的态势,上证指数震荡上涨0.43%;沪深两市日均成交额回升至8700亿元左右;北向资金近一个月初次转为周净买入5.57亿元。 安排观点一起认为,在稳增加、稳预期相关政策持续发力,上市…...
sql逻辑优化
1.分页 通常使用每页条数及第一页作为参数 开发接口 GetMapping("/querySystemList") public List<SystemAduit> querySystemList(RequestParam("keyword") String keyword,RequestParam(name "offset", defaultValue "0") i…...
【数据结构】树与二叉树(一):树(森林)的基本概念:父亲、儿子、兄弟、后裔、祖先、度、叶子结点、分支结点、结点的层数、路径、路径长度、结点的深度、树的深度
文章目录 5.1 树的基本概念5.1.1 树的定义树有序树、无序树 5.1.2 森林的定义5.1.3 树的术语1. 父亲(parent)、儿子(child)、兄弟(sibling)、后裔(descendant)、祖先(anc…...
2024 Android Framework学习大纲之基础理论篇
2024 Android Framework学习大纲之基础理论篇 受到当前经济影响,互联网越来越不景气了,因此Android App开发也是越来越不景气,中小型公司越来越偏向跨平台开发,比如Flutter,这样能节省成本,笔者也曾经是一名6年多工作经…...
【深度学习】Yolov8 区域计数
git:https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-Region-Counter/readme.md 很长时间没有做yolov的项目了,最近一看yolov8有一个区域计数的功能,不得不说很实用啊。 b站:https://www.bilibili.com/vid…...
手游刚开服就被攻击怎么办?如何防御DDoS?
开服初期是手游最脆弱的阶段,极易成为DDoS攻击的目标。一旦遭遇攻击,可能导致服务器瘫痪、玩家流失,甚至造成巨大经济损失。本文为开发者提供一套简洁有效的应急与防御方案,帮助快速应对并构建长期防护体系。 一、遭遇攻击的紧急应…...
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility
Cilium动手实验室: 精通之旅---20.Isovalent Enterprise for Cilium: Zero Trust Visibility 1. 实验室环境1.1 实验室环境1.2 小测试 2. The Endor System2.1 部署应用2.2 检查现有策略 3. Cilium 策略实体3.1 创建 allow-all 网络策略3.2 在 Hubble CLI 中验证网络策略源3.3 …...
ETLCloud可能遇到的问题有哪些?常见坑位解析
数据集成平台ETLCloud,主要用于支持数据的抽取(Extract)、转换(Transform)和加载(Load)过程。提供了一个简洁直观的界面,以便用户可以在不同的数据源之间轻松地进行数据迁移和转换。…...
现代密码学 | 椭圆曲线密码学—附py代码
Elliptic Curve Cryptography 椭圆曲线密码学(ECC)是一种基于有限域上椭圆曲线数学特性的公钥加密技术。其核心原理涉及椭圆曲线的代数性质、离散对数问题以及有限域上的运算。 椭圆曲线密码学是多种数字签名算法的基础,例如椭圆曲线数字签…...
QT: `long long` 类型转换为 `QString` 2025.6.5
在 Qt 中,将 long long 类型转换为 QString 可以通过以下两种常用方法实现: 方法 1:使用 QString::number() 直接调用 QString 的静态方法 number(),将数值转换为字符串: long long value 1234567890123456789LL; …...
是否存在路径(FIFOBB算法)
题目描述 一个具有 n 个顶点e条边的无向图,该图顶点的编号依次为0到n-1且不存在顶点与自身相连的边。请使用FIFOBB算法编写程序,确定是否存在从顶点 source到顶点 destination的路径。 输入 第一行两个整数,分别表示n 和 e 的值(1…...
Linux 中如何提取压缩文件 ?
Linux 是一种流行的开源操作系统,它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间,使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的,要在 …...
探索Selenium:自动化测试的神奇钥匙
目录 一、Selenium 是什么1.1 定义与概念1.2 发展历程1.3 功能概述 二、Selenium 工作原理剖析2.1 架构组成2.2 工作流程2.3 通信机制 三、Selenium 的优势3.1 跨浏览器与平台支持3.2 丰富的语言支持3.3 强大的社区支持 四、Selenium 的应用场景4.1 Web 应用自动化测试4.2 数据…...
Ubuntu Cursor升级成v1.0
0. 当前版本低 使用当前 Cursor v0.50时 GitHub Copilot Chat 打不开,快捷键也不好用,当看到 Cursor 升级后,还是蛮高兴的 1. 下载 Cursor 下载地址:https://www.cursor.com/cn/downloads 点击下载 Linux (x64) ,…...
wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
