SpringBoot中的注解详解(一)

一、@RestController、@RequestMapping

1、@RestController注解

@RestController注解是SpringMVC中的一个组合注解,用于标记一个类为控制器类。它实际上是@Controller和@ResponseBody注解的组合,表示该类中的所有方法都会返回JSON、XML等格式的数据,而不是视图页面。

使用方式:
  1. 在需要处理HTTP请求的类上添加@RestController注解。

  2. 在类中定义处理HTTP请求的方法,并使用@RequestMapping或者其派生注解(如@GetMapping,@PostMapping等)来映射请求路径。

示例:

@RestController
@RequestMapping("/book")
public class BookController {@Autowiredprivate BookService bookService;@GetMappingpublic Result list(String keyword,Integer categoryId){List<Book> books = bookService.list(keyword, categoryId);return Result.success(books);}@GetMapping("/{id}")public Result get(@PathVariable("id") Integer id){Book book = bookService.get(id);return Result.success(book);}@PostMappingpublic Result add(@RequestBody Book book){bookService.add(book);return Result.success();}@PutMappingpublic Result update(@RequestBody Book book){bookService.update(book);return Result.success();}@DeleteMapping("/{ids}")public Result delete(@PathVariable("ids") List<Integer> ids){bookService.delete(ids);return Result.success();}
}
使用场景:
  • 当需要创建RESTful API时,使用@RestController注解来标记控制器类。

  • 适用于返回JSON、XML等数据格式的API开发。

  • 通常放在项目的controller包下,与处理HTTP请求相关的类放在一起。

底层原理:
@Target(ElementType.TYPE)
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Controller
@ResponseBody
public @interface RestController {@AliasFor(annotation = Controller.class)String value() default "";
}
  1. @RestController注解实际上是@Controller和@ResponseBody注解的组合。

    • @Controller:标记该类为一个控制类,Spring容器会扫描并注册该类。

    • @ResponseBody:表示该类中的所有方法返回的数据都会直接写入HTTP响应体中,而不是解析为视图页面。

  2. SpringMVC会使用RequestMappingHandlerMapping来扫描带有@Controller注解的类,并将这些类中的方法与URL映射起来。

  3. 当请求到达时,RequestMappingHandlerAdapter会调用相应的处理器方法,并将返回值转换为响应体中的数据。

@RestController 注解的底层原理
  • Spring 容器启动:Spring 容器启动时,会扫描带有 @Configuration 注解的类。

  • 解析 @Configuration 类中的 @Bean 方法:解析这些类中的 @Bean 方法,创建并注册 Bean 到容器。

  • 扫描带有 @ComponentScan 的包:扫描配置中指定的包,发现带有 @RestController 注解的类。

  • 创建并注册 Controller 到容器:创建并注册这些 Controller 到容器。

  • 创建代理对象:如果需要,创建代理对象以确保线程安全和依赖注入。

  • 请求到达 DispatcherServlet:当请求到达时,DispatcherServlet 会调用 RequestMappingHandlerMapping

  • 查找匹配的 HandlerMethodRequestMappingHandlerMapping 会查找匹配的 HandlerMethod

  • 调用 RequestMappingHandlerAdapterDispatcherServlet 调用 RequestMappingHandlerAdapter 来执行 Controller 方法。

  • 返回值处理:通过 @ResponseBody 注解,将返回值写入 HTTP 响应体。

2、@RequestMapping注解

@RequestMapping注解用于映射HTTP请求到控制器类或方法上。它可以放在类级别或方法级别,用于指定请求的URL路径、HTTP方法、请求参数等

使用方法:
  • 在类级别使用@RequestMapping注解,指定该类的所有方法的公共路径前缀。

  • 在方法级别使用@RequestMapping注解,指定具体的请求路径和HTTP方法。

@RestController
@RequestMapping("/book")
public class BookController {@RequestMapping(value = "/{id}", method = RequestMethod.GET)public Book getBook(@PathVariable Long id) {// 处理获取书籍的逻辑return new Book(id, "Spring Boot in Action");}@RequestMapping(method = RequestMethod.POST)public Book createBook(@RequestBody Book book) {// 处理创建书籍的逻辑return book;}
}
使用场景:
  1. 当需要将HTTP请求映射到控制器类或方法上时,使用@RequestMapping注解。

  2. 适用于处理各种HTTP方法(GET、POST、PUT、DELETE 等)的请求。

  3. 通常放在控制器类或方法上,与处理HTTP请求相关的类和方法放在一起。

底层原理:
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Mapping
public @interface RequestMapping {String name() default "";@AliasFor("path")String[] value() default {};@AliasFor("value")String[] path() default {};RequestMethod[] method() default {};String[] params() default {};String[] headers() default {};String[] consumes() default {};String[] produces() default {};
}
  1. @RequestMapping注解被RequestMappingHandlerMapping处理,该类负责将请求URL映射到相应的控制器方法。

  2. @RequestMappingHandlerMapping会扫描带有@Controller注解的类,并将这些类中的方法与URL映射起来。

  3. 当请求到达时,DispatcherServlet会根据请求URL和HTTP方法找到对应的处理器方法,并调用RequestMappingHandlerAdapter来执行该方法。

  4. RequestMappingHandlerAdapter会处理方法参数的绑定、方法的调用以及返回值的处理。

@RequestMapping 注解的底层原理
  • 请求到达 DispatcherServlet:当请求到达时,DispatcherServlet 会调用 RequestMappingHandlerMapping

  • 查找匹配的 HandlerMethodRequestMappingHandlerMapping 会查找匹配的 HandlerMethod,首先匹配类级别的 @RequestMapping,然后匹配方法级别的 @RequestMapping

  • 找到匹配的 HandlerMethod:找到匹配的 HandlerMethod 后,DispatcherServlet 调用 RequestMappingHandlerAdapter

  • 调用 Controller 方法RequestMappingHandlerAdapter 调用 Controller 方法,处理方法参数(如 @PathVariable, @RequestBody 等)。

  • 执行 Controller 方法:执行 Controller 方法。

  • 返回值处理:通过 @ResponseBody 注解,将返回值写入 HTTP 响应体。

总结:

  • @RestController 注解
    • 功能:标记一个类为控制器类,所有方法返回 JSON、XML 等数据。

    • 使用方式:在类上添加 @RestController 注解,类中定义处理 HTTP 请求的方法。

    • 使用场景:创建 RESTful API,返回数据格式的 API 开发。

    • 放置位置:通常放在 controller 包下。

    • 底层原理:组合了 @Controller@ResponseBody 注解,Spring MVC 会扫描并注册该类,处理请求并返回数据。

  • @RequestMapping 注解
    • 功能:映射 HTTP 请求到控制器类或方法上。

    • 使用方式:在类或方法上添加 @RequestMapping 注解,指定请求路径和 HTTP 方法。

    • 使用场景:处理各种 HTTP 方法的请求。

    • 放置位置:通常放在控制器类或方法上。

    • 底层原理:被 RequestMappingHandlerMapping 处理,将请求 URL 映射到相应的控制器方法,DispatcherServlet 调用 RequestMappingHandlerAdapter 执行方法。


二、@GetMapping、@PostMapping、@PutMapping、@DeleteMapping("/{ids}")

1、@GetMapping、@PostMapping、@PutMapping、@DeleteMapping("/{ids}") (Controller层)

注解概述:
  • 注解类型:这些注解属于Spring框架中的控制器注解,用于定义HTTP请求映射。

  • 功能:

    1. @GetMapping:映射HTTP GET请求到特定的处理方法上。

    2. @PostMapping:映射HTTP POST请求到特定的处理方法上。

    3. @PutMapping:映射HTTP PUT请求到特定的处理方法上。

    4. @DeleteMapping映射HTTP DELETE请求到特定的处理方法上。

  • 使用方法:这些注解通常用于SpringMVC或SpringBoot的控制器类中的方法上,以指定该方法处理HTTP请求类型和路径。

使用场景:
  1. @GetMapping:适用于获取资源信息的场景,如查询数据。

  2. @PostMapping:适用于创建新资源的场景,如提交表单数据。

  3. @PutMapping:适用于更新现有资源的场景,如修改用户信息。

  4. @DeleteMapping:适用于删除资源的场景,如删除用户记录。

  5. 这些注解应放置在控制器类的方法上,通常用于@Controller或@RestController注解的类中。

底层原理:
  • 注解解析:Spring框架在启动时会扫描带有@Controller@RestController注解的类,并解析其中的方法上的这些注解。

  • 请求映射:Spring MVC通过RequestMappingHandlerMapping将这些注解映射到具体的处理器方法上。

  • 请求处理:当接收到HTTP请求时,Spring MVC会根据请求的URL和HTTP方法找到对应的处理器方法,并调用该方法处理请求。

小结:

  • 类型:方法注解

  • 位置:基于SpringMVC的RESTful开发控制器方法定义上方

  • 作用:设置当前控制器方法请求访问路径与请求动作,每种对应一个请求

  • 动作,例如@GetMapping对应GET请求

  • 属性:value(默认):请求访问路径

2、@PathVariable、@RequestBody 、@RequestParam、

@PathVariable:
  • 功能:用于从URL模板中提取变量值,并将其绑定到方法参数上。

  • 使用场景:适用于需要从URL路径中获取动态部分的场景,如获取某个用户的详细信息。

  • 作用:绑定路径参数与处理器方法形参间的关系,要求路径参数名与形参名一一对应

  • 用于从URL路径中获取数据,通常用于处理RESTful风格的请求。

    可以将URL中的占位符部分提取为方法参数,用于标识资源的唯一标识符。

    可以指定参数名称、正则表达式等属性。

    适用于获取URL中的动态参数,如用户ID、商品ID等。

    示例: @GetMapping("/users/{id}") public String getUser(@PathVariable("id") int userId) { ... }

@RequestBody:
  • 功能:用于将HTTP请求体中的数据绑定到方法的参数上。

  • 使用场景:适用于需要接收客户端发送的JSON、XML等格式的数据的场景,如创建或更新资源

  • 作用:将JSON数据映射到形参的实体类对象中

    设置控制器方法返回值作为响应体返回给客户端,无需解析,Spring MVC会将返回的对象转换为JSON格式的响应体,并设置正确的响应头

  • 适用于处理复杂的数据结构,可以将请求体中的数据映射到对象或集合类型的参数上。

    示例: @PostMapping("/users") public String createUser(@RequestBody User user) { ... }

@RequestParam:
  • 功能:用于从HTTP请求的查询参数中提取值,并将其绑定到方法参数上。

  • 使用场景:适用于需要从URL查询参数中获取值的场景,如分页查询

  • 用于从请求参数中获取数据,通常用于处理GET请求或POST请求的表单数据。

    可以获取请求URL中的查询参数或POST请求中的表单参数。

    可以指定参数名称、是否必需、默认值等属性。

    适用于获取简单的请求参数,如字符串、数字等。

    示例: @GetMapping("/users") public String getUser(@RequestParam("id") int userId) { ... }

	/*** 根据书籍 ID 获取书籍详情。* @param id 从 URL 中提取书籍 ID* @return 返回包含书籍详情的 Result 对象*/@GetMapping("/{id}") // 映射 GET 请求到该方法,路径参数为 idpublic Result get(@PathVariable("id") Integer id){Book book = bookService.get(id);return Result.success(book);}// 更新书籍信息// @RequestBody:从请求体中读取 Book 对象@PutMappingpublic Result update(@RequestBody Book book){bookService.update(book);return Result.success();}/***  用于处理分页查询请求*  指定了该方法处理HTTP GET请求,并且要求请求中必须包含pageNum 和 pageSize两个查询参数* @param pageNum 请求的页码,从请求的查询参数中提取名为pageNum的参数,并将其绑定到方法参数pageNum上* @param pageSize 页的大小,从请求的查询参数中提取名为pageSize的参数,并将其绑定到方法参数pageSize上* @param publisher 出版社信息,从请求的查询参数中提取名为publisher的参数,并将其绑定到方法参数publisher上* @return : 将查询结果封装到Result对象中,并返回给客户端。*/@GetMapping(params = {"pageNum", "pageSize"})public Result pageQuery(@RequestParam("pageNum") int pageNum,@RequestParam("pageSize") int pageSize,@RequestParam("publisher") String publisher){// 调用bookService的pageQuery方法,传入分页参数和版本社名称,获取分页查询结果Page<Book> page = bookService.pageQuery(pageNum, pageSize, publisher);return Result.success(page);}

请简述@RequestBody @RequestParam @PathVariable的区别

  1. 3个注解它们都是Spring MVC框架中常用的注解,用于从HTTP请求中获取数据。

  2. @RequestParam 用于获取请求参数中的数据, @RequestBody 用于获取请求体中的数据, @PathVariable 用于获取URL路径中的数据

  3. 它们分别适用于不同的场景和数据来源,可以根据具体的业务需求选择适合的注解来获取HTTP请求中的数据。

 三、@RestControllerAdvice、@ExceptionHandler(Exception.class) (exception包)

@RestControllerAdvice:

  • 功能:用于定义全局异常类,可以处理所有带有@Controller@RestController注解的控制器类中抛出的异常。

  • 使用场景:统一处理应用中所有控制器的异常,提供一致的错误响应格式。

  • 类型: 类注解

  • 位置:Rest风格开发的控制器增强类定义上方

  • 作用:为Rest风格开发的控制器类做增强

  • 说明:此注解自带@ResponseBody注解与@Component注解,具备对应的功能

@ExceptionHandler(Exception.class) :

  • 功能:用于定义处理特定异常的方法,方法参数为需要处理的异常类型。

  • 使用方法:放置在方法声明上,方法参数为需要处理的异常类型。

  • 使用场景:适用于需要针对异常类型进行处理的场景。

  • 通常放置在@RestControllerAdvice注解的类中的方法上。

  • 类型: 方法注解

  • 位置:专用于异常处理的控制器方法上方

  • 作用:设置指定异常的处理方案,功能等同于控制器方法,出现异常后终止原始控制器执行,并转入当前方法执行

  • 说明:此类方法可以根据处理的异常不同,制作多个方法分别处理对应的异常

package com.briup.demo.exception;import com.briup.demo.response.Result;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;/*** @author 35329** 全局处理异常处理器** 两大作用:* 1)统一对Controller中抛出的业务异常进行* 降低代码的冗余。* 2)程序中可能出现的异常到返回给前端之前的最后一道屏障。* 能够正常提供服务的最后一道屏障。* 控制程序不会直接向前端返回内部的逻辑错误。** 具体的实施方法* 1、在类上添加注解:@RestControllerAdvice* 添加了该注解之后,在这个类中方法的返回值就和Controller中的方法一样* 直接作为返回前端的响应报文体部的数据** 2、定义一个统一处理异常的方法* 在该方法上添加该注解:@ExceptionHandler* 在改注解中配置value属性值,指定要拦截的异常类型。* 实际开发中,通常都会设置为异常体系的最高级别类型:Exception** 如果需要对异常对象进行直接处理* 可以在方法中定义一个Exception类型的参数,* 只要我们定义了这个参数,Spring框架在调用该方法的时候,* 就会把底层上抛的异常作为参数传递**/
@RestControllerAdvice
public class GlobalExceptionHandler {@ExceptionHandler(Exception.class)public Result handle(Exception e){// 需要对异常的具体类型进行判断:// 1、对自己主动抛出的业务类型异常// 2、其他所有未知的运行时异常if (e instanceof BookException){return Result.failure(e.getMessage());}return Result.failure("服务器繁忙,请稍后重试");}}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.xdnf.cn/news/10472.html

如若内容造成侵权/违法违规/事实不符,请联系一条长河网进行投诉反馈,一经查实,立即删除!

相关文章

spring组件介绍

1. Spring Core&#xff08;Spring核心&#xff09;&#xff1a; • BeanFactory&#xff1a;Spring IoC容器的基础接口&#xff0c;提供了配置框架和基本的功能&#xff0c;用于管理任何类型的对象。 • ApplicationContext&#xff1a;BeanFactory的子接口&#xff0c;提供了…

软件测试基础:单元测试与集成测试

单元测试的重要性 单元测试是软件开发过程中的必要步骤。它通过针对软件的最小可测试单元进行测试&#xff0c;可以及早发现代码中的逻辑错误和缺陷。根据统计数据显示&#xff0c;单元测试可以在软件开发初期就发现约70%的错误&#xff0c;从而减少了后期修改的成本和时间消耗…

sql专题 之 常用命令

文章目录 查询基础语法查询全表查询选择查询&#xff1a;常量和运算&#xff1a; 条件查询where运算符&#xff1a;、 !、<、>空值&#xff1a;null模糊查询&#xff1a;like逻辑运算&#xff1a;and or not 去重&#xff1a;distinct排序&#xff1a;order by截断和偏移…

LocalSend:开源跨平台文件传输工具,让设备互通无阻

在现代社会中&#xff0c;文件共享和设备之间的互联互通已经成为日常生活中不可或缺的一部分。无论是在工作中分享文档&#xff0c;还是在朋友间传输照片和视频&#xff0c;快速而便捷的文件传输工具都显得尤为重要。通常情况下&#xff0c;我们依赖互联网或蓝牙进行文件传输&a…

解决 Vue3、Vite 和 TypeScript 开发环境下跨域的问题,实现前后端数据传递

引言 本文介绍如何在开发环境下解决 Vite 前端&#xff08;端口 3000&#xff09;和后端&#xff08;端口 80&#xff09;之间的跨域问题&#xff1a; 在开发环境中&#xff0c;前端使用的 Vite 端口与后端端口不一致&#xff0c;会产生跨域错误提示&#xff1a; Access to X…

C/C++/PYTHON 改变 console terminal cmd 字体输出颜色

C代码 #include <stdio.h>// 定义一些常用颜色的转义序列 #define RED "\x1b[31m" #define GREEN "\x1b[32m" #define YELLOW "\x1b[33m" #define BLUE "\x1b[34m" #define RESET "\x1b[0m"int main() {// 在控制台输…

android studio 更改gradle版本方法(备忘)

如果出现类似以下&#xff1a; Your build is currently configured to use Java 17.0.11 and Gradle 6.1.1. 或者类似&#xff1a; Failed to calculate the value of task ‘:app:compileDebugJavaWithJavac‘ property ‘options.generatedSo 消息时需要修改gradle版本&…

游戏引擎学习第一天

视频参考: https://www.bilibili.com/video/BV1zGDCYHErA/ 创建一个保存项目的路径 VS的安装略过&#xff0c;个人自行百度 1. vs 创建第一个CMAKE的窗口项目 game.cpp 修改如下的代码 到https://learn.microsoft.com/en-us/windows/win32/api/winbase/nf-winbase-winmain 去…

基于Spring Boot的养老保险管理系统的设计与实现,LW+源码+讲解

摘 要 如今社会上各行各业&#xff0c;都喜欢用自己行业的专属软件工作&#xff0c;互联网发展到这个时候&#xff0c;人们已经发现离不开了互联网。新技术的产生&#xff0c;往往能解决一些老技术的弊端问题。因为传统养老保险管理系统信息管理难度大&#xff0c;容错率低&a…

【Linux-进程间通信】了解信号量 + 共享内存 + 消息队列的应用

信号量&#xff08;了解&#xff09; 1.概念理论渗透 1.多个执行流&#xff08;进程&#xff09;&#xff0c;能看到的同一份资源&#xff1a;共享资源 2.被保护起来的资源-----临界资源---同步和互斥----用互斥的方式保护共享资源----临界资源 3.互斥&#xff1a;任何时刻…

Normal-GS: 3D Gaussian Splatting with Normal-Involved Rendering 论文解读

看这篇论文之前可以看一下Ref-NeRF&#xff1a;https://arxiv.org/pdf/2112.03907 目录 ​编辑 一、概述 二、相关工作 1、辐射场 2、3DGS在几何和外观上的应用 三、Normal-GS 1、3DGS 2、引入法线的策略 3、训练过程 4、损失函数 四、实验 1、渲染质量的量化对比实…

【Linux探索学习】第十弹——Linux工具篇(五):详解Linux 中 Git 工具的使用与相关知识点

Linux学习笔记&#xff1a;https://blog.csdn.net/2301_80220607/category_12805278.html?spm1001.2014.3001.5482 前言&#xff1a; Git 是一个分布式版本控制系统&#xff0c;广泛应用于软件开发中。它能够有效地管理项目的源代码&#xff0c;支持多种工作流&#xff0c;帮…

【系统文档】系统安全保障措施,安全运营保障,系统应急预案,系统验收相关资料(word原件)

一、身份鉴别 二、访问控制 三、通信完整性、保密性 四、抗抵赖 五、数据完整性 六、数据保密性 七、应用安全支撑系统设计 软件资料获取及全资料学习获取&#xff1a;本文末个人名片或进主页。

Windows Server修改 SID 操作说明

操作场景 Windows操作系统对计算机和用户的识别是通过安全标识符&#xff08;SID&#xff09;进行区分。由于基于同一镜像生产的云服务器实例 SID 相同&#xff0c;会引起无法入域的问题。如果您需要搭建 Windows 域环境&#xff0c;则需要通过修改 SID 以达到入域的目的。 本…

Java项目实战II基于Spring Boot的疗养院管理系统设计与实现(开发文档+数据库+源码)

目录 一、前言 二、技术介绍 三、系统实现 四、文档参考 五、核心代码 六、源码获取 全栈码农以及毕业设计实战开发&#xff0c;CSDN平台Java领域新星创作者&#xff0c;专注于大学生项目实战开发、讲解和毕业答疑辅导。获取源码联系方式请查看文末 一、前言 随着人口老…

Canny边缘检测中Hysteresis Thresholding(滞后阈值)名字的由来

Hysteresis Thresholding直译是滞后阈值。注意区分hysteresis、heuristic、hypothesis。 Hysteresis&#xff1a;在物理学中指滞后现象。 Canny边缘检测中滞后阈值这个名字来源于物理学中的滞后现象。通过设置两个不同的阈值来决定哪些像素属于边缘。这两个阈值分别是高阈值&…

[ Linux 命令基础 6 ] Linux 命令详解-权限和用户管理命令

&#x1f36c; 博主介绍 &#x1f468;‍&#x1f393; 博主介绍&#xff1a;大家好&#xff0c;我是 _PowerShell &#xff0c;很高兴认识大家~ ✨主攻领域&#xff1a;【渗透领域】【数据通信】 【通讯安全】 【web安全】【面试分析】 &#x1f389;点赞➕评论➕收藏 养成习…

# ubuntu创建新用户和它的家目录

ubuntu创建新用户和它的家目录 一、使用 useradd命令创建新用户和它的家目录&#xff1a; 1、命令如下&#xff1a; #sudo useradd -r -m -s /bin/bash userName #如&#xff1a;sudo useradd -r -m -s /bin/bash zhangsan2、命令参数解释 -r : 建立系统账号。 -m : 自动建…

网线类别线芯含义和传输距离以及水晶头制作标准

网线八芯每根的含义&#xff1a; 网线的八根线芯&#xff0c;也被称为RJ45网线中的8芯&#xff0c;网线采用8根线芯&#xff0c;这八根线芯各自承担着特定的功能。这8根线芯被分为4对&#xff0c;每对以特定的方式绞合在一起&#xff0c;8芯网线主要是为了减少电磁信号的相互干…

HTB:Sightless[WriteUP]

目录 连接至HTB服务器并启动靶机 使用nmap对靶机TCP端口进行开放扫描 继续使用nmap对靶机开放的TCP端口进行脚本、服务扫描 首先尝试对靶机FTP服务进行匿名登录 使用curl访问靶机80端口 使用浏览器可以直接访问该域名 使用浏览器直接访问该子域 Getshell 横向移动 查…