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

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:定义全局异常处理器类,处理异常后的返回值是纯数据(JSONXML 格式的数据),因此所以处理器方法可以直接返回对象字符串等数据类型;
  • @ExceptionHandler:指定异常处理方法;

上述注解的具体细节可参考 Spring Boot 面试题——全局异常处理这篇文章。

相关文章:

Spring Boot 面试题——常用注解

目录 Spring Bean将一个类声明为 Bean自动装配 Bean声明 Bean 的作用域 前端后传值处理常见的 HTTP 请求类型读取配置文件定时任务全局 Controller 层异常处理 Spring Bean 将一个类声明为 Bean Component&#xff1a;通用的注解&#xff0c;可标注任意类为 Spring 组件。如果…...

RabbitMQ(高级特性) 设置队列所有消息存活时间

RabbitMQ可以设置消息的存活时间&#xff08;Time To Live&#xff0c;简称TTL&#xff09;&#xff0c;当消息到达存活时间后还没有被消费&#xff0c;会被移出队列。RabbitMQ可以对队列的所有消息设置存活时间&#xff0c;也可以对某条消息设置存活时间。 Configuration pub…...

刷题学习记录

[MRCTF2020]PYWebsite1 进入环境&#xff0c;页面就提示要购买flag&#xff0c;不要想着购买&#xff0c;因为扫码后提示的是一个文本 “拜托&#xff01;你不会真的想PYflag吧&#xff0c;这样可是违规的&#xff01;再好好分析一下界面代码吧” 查看网页源码&#xff0c;发现…...

WPF中依赖属性及附加属性的概念及用法

完全来源于十月的寒流&#xff0c;感谢大佬讲解 依赖属性 由依赖属性提供的属性功能 与字段支持的属性不同&#xff0c;依赖属性扩展了属性的功能。 通常&#xff0c;添加的功能表示或支持以下功能之一&#xff1a; 资源数据绑定样式动画元数据重写属性值继承WPF 设计器集成 …...

Golang爬虫封装

引言 爬虫是一种自动化地从网页中提取信息的程序&#xff0c;它在现代互联网的数据获取和分析中扮演着重要的角色。Golang作为一门强大的编程语言&#xff0c;也提供了丰富的工具和库来实现爬虫功能。在本文中&#xff0c;我们将探讨如何使用Golang来封装一个灵活、高效的爬虫…...

技术分享 | 抓包分析 TCP 协议

TCP 协议是在传输层中&#xff0c;一种面向连接的、可靠的、基于字节流的传输层通信协议。 环境准备 对接口测试工具进行分类&#xff0c;可以如下几类&#xff1a; 网络嗅探工具&#xff1a;tcpdump&#xff0c;wireshark代理工具&#xff1a;fiddler&#xff0c;charles&a…...

基于前馈神经网络完成鸢尾花分类

目录 1 小批量梯度下降法 1.0 展开聊一聊~ 1.1 数据分组 1.2 用DataLoader进行封装 1.3 模型构建 1.4 完善Runner类 1.5 模型训练 1.6 模型评价 1.7 模型预测 思考 总结 参考文献 首先基础知识铺垫~ 继续使用第三章中的鸢尾花分类任务&#xff0c;将Softm…...

软考高级系统架构设计师系列之:UML建模、设计模式和软件架构设计章节选择题详解

软考高级系统架构设计师系列之:UML建模、设计模式和软件架构设计章节选择题详解 一、设计模式二、4+1模型三、面向对象的分析模型四、构件五、基于架构的软件设计六、4+1视图七、软件架构风格八、特定领域软件架构九、虚拟机十、架构评估十一、敏感点和权衡点十二、分层结构十…...

成集云 | 电商平台、ERP、WMS集成 | 解决方案

电商平台ERPWMS 方案介绍 电商平台即是一个为企业或个人提供网上交易洽谈的平台。企业电子商务平台是建立在Internet网上进行商务活动的虚拟网络空间和保障商务顺利运营的管理环境&#xff1b;是协调、整合信息流、货物流、资金流有序、关联、高效流动的重要场所。企业、商家…...

吴恩达《机器学习》4-6->4-7:正规方程

一、正规方程基本思想 正规方程是一种通过数学推导来求解线性回归参数的方法&#xff0c;它通过最小化代价函数来找到最优参数。 代价函数 J(θ) 用于度量模型预测值与实际值之间的误差&#xff0c;通常采用均方误差。 二、步骤 准备数据集&#xff0c;包括特征矩阵 X 和目标…...

VO、DTO

DTO DTO&#xff08;Data Transfer Object&#xff09; 数据传输对象【前后端交互】 也就是后端开发过程中&#xff0c;用来接收前端传过来的参数&#xff0c;一般会创建一个Java对应的DTO类&#xff08;UserDTO等等&#xff09; 因为前端一般传来的是Json格式的数据&#xf…...

RK3566上运行yolov5模型进行图像识别

一、简介 本文记录了依靠RK官网的文档&#xff0c;一步步搭建环境到最终在rk3566上把yolov5 模型跑起来。最终实现的效果如下&#xff1a; 在rk3566 板端运行如下app&#xff1a; ./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 标定上位…...

短视频的运营方法

尊敬的用户们&#xff0c;你们好&#xff01;今天我将为大家带来一篇关于短视频运营的专业文章。在当今互联网时代&#xff0c;短视频已经成为了一个重要的流量入口&#xff0c;掌握正确的运营方法对于企业的发展至关重要。接下来&#xff0c;我将通过以下几个方面为大家详细介…...

GitLab CI/CD 持续集成/部署 SpringBoot 项目

一、GitLab CI/CD 介绍 GitLab CI/CD&#xff08;Continuous Integration/Continuous Deployment&#xff09;是 GitLab 提供的一种持续集成和持续部署的解决方案。它可以自动化软件的构建、测试和部署过程&#xff0c;以便开发者更快地、更频繁地发布可靠的产品。 整体过程如…...

第二证券:政策效应逐步显现 A股修复行情有望持续演绎

上星期&#xff0c;A股商场延续企稳反弹的态势&#xff0c;上证指数震荡上涨0.43%&#xff1b;沪深两市日均成交额回升至8700亿元左右&#xff1b;北向资金近一个月初次转为周净买入5.57亿元。 安排观点一起认为&#xff0c;在稳增加、稳预期相关政策持续发力&#xff0c;上市…...

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. 父亲&#xff08;parent&#xff09;、儿子&#xff08;child&#xff09;、兄弟&#xff08;sibling&#xff09;、后裔&#xff08;descendant&#xff09;、祖先&#xff08;anc…...

2024 Android Framework学习大纲之基础理论篇

2024 Android Framework学习大纲之基础理论篇 受到当前经济影响&#xff0c;互联网越来越不景气了,因此Android App开发也是越来越不景气&#xff0c;中小型公司越来越偏向跨平台开发&#xff0c;比如Flutter&#xff0c;这样能节省成本&#xff0c;笔者也曾经是一名6年多工作经…...

【深度学习】Yolov8 区域计数

git&#xff1a;https://github.com/ultralytics/ultralytics/blob/main/examples/YOLOv8-Region-Counter/readme.md 很长时间没有做yolov的项目了&#xff0c;最近一看yolov8有一个区域计数的功能&#xff0c;不得不说很实用啊。 b站&#xff1a;https://www.bilibili.com/vid…...

Windows 系统服务器部署jar包时,推荐使用winsw,将jar包注册成服务,并设置开机启动。

一、其他方式不推荐的原因 1、Spring Boot生成的jar包&#xff0c;可以直接用java -jar运行&#xff0c;但是前提是需要登录用户&#xff0c;而且注销用户后会退出程序&#xff0c;所以不可用。 2、使用计划任务&#xff0c;写一个bat处理文件&#xff0c;里面写java -jar运行…...

npm 包管理

1. 命令 // 查看是否登录 npm who am i // 登录&#xff1a;输入用户名、密码、邮箱、一次性登录密码&#xff08;邮箱接收&#xff09; npm login // 创建 npm init // 快速创建 npm init -y // 发包 npm publish // 发包&#xff08;开源&#xff09; npm publish --access …...

力扣370周赛 -- 第三题(树形DP)

该题的方法&#xff0c;也有点背包的意思&#xff0c;如果一些不懂的朋友&#xff0c;可以从背包的角度去理解该树形DP 问题 题解主要在注释里 //该题是背包问题树形dp问题的结合版&#xff0c;在树上解决背包问题 //背包问题就是选或不选当前物品 //本题求的是最大分数 //先转…...

GPT学习笔记

百度的文心一言 阿里的通义千问 通过GPT能力&#xff0c;提升用户体验和产品力 GPT的出现是AI的iPhone时刻。2007年1月9日&#xff0c;第一代iPhone发布&#xff0c;开启移动互联网时代。新一轮的产业革命。 GPT模型发展时间线&#xff1a; Copilot - 副驾驶 应用&#xf…...

Apex的addError()显示的消息中实现换行

直接用‘<br/>’是无效的&#xff0c;因为addError默认不转义HTML符号&#xff0c;如果需要转义&#xff0c;应该将第二个参数escape设置为false。不过即使设置了也只对classic页面生效&#xff0c;lightning页面还是无法转义。 官方文档&#xff1a; 参考资料&#xf…...

STM32中微秒延时的实现方式

STM32中微秒延时的实现方式 0.前言一、裸机实现方式二、FreeRTOS实现方式三、定时器实现&#xff08;通用&#xff09;4、总结 0.前言 最近在STM32驱动移植过程中需要用到微秒延时来实现一些外设的时序&#xff0c;由于网上找到的驱动方法良莠不齐&#xff0c;笔者在实现时序过…...

2005-2021年全国各省家庭承包耕地面积和家庭承包耕地流转总面积数据(无缺失)

2005-2021年全国各省家庭承包耕地面积和家庭承包耕地流转总面积数据 1、时间&#xff1a;2005-2021年 2、来源&#xff1a;农村经营管理统计NB 3、指标&#xff1a;家庭承包经营耕地面积、家庭承包耕地流转总面积&#xff08;单位&#xff1a;亩&#xff09; 4、范围&#…...

【六、http】go的http的客户端重定向

一、http的重定向 重定向过程&#xff1a;客户浏览器发送http请求----》web服务器接受后发送302状态码响应及对应新的location给客户浏览器–》客户浏览器发现是302响应&#xff0c;则自动再发送一个新的http请求&#xff0c;请求url是新的location地址----》服务器根据此请求寻…...

AI:61-基于深度学习的草莓病害识别

🚀 本文选自专栏:AI领域专栏 从基础到实践,深入了解算法、案例和最新趋势。无论你是初学者还是经验丰富的数据科学家,通过案例和项目实践,掌握核心概念和实用技能。每篇案例都包含代码实例,详细讲解供大家学习。 📌📌📌在这个漫长的过程,中途遇到了不少问题,但是…...

idea文件比对

idea文件比对 1.项目内的文件比对2.项目间的文件比对3. 剪切板对比4. 版本历史(不同分支和不同commit)对比 1.项目内的文件比对 在项目中选择好需要比对的文件(类)&#xff0c;然后选择Compare Files Mac下的快捷键是Commandd&#xff0c; 这样的比对像是git冲突解决一样 …...