本文是结合 Spring Boot 开发与面试高频考点整理的优质笔记 ,针对@RequestParam、@RequestBody、@PathVariable三个核心注解的区别做详细拆解,同时补充 Spring Boot 开发中最常用的开发注解,附代码示例、使用场景和面试考点,适合开发积累、毕业设计答辩和面试复习。
一、核心接收参数注解三大金刚
这三个注解是 Spring Boot 中处理前端请求参数 的基石,也是面试和开发中必须掌握 的内容,核心区别在于参数获取位置、数据格式、适用场景。
1.1 @PathVariable:获取 URL 路径中的参数
核心作用
从URL 路径模板 中提取参数,适用于获取单个资源 ID 、路径层级参数,是 RESTful 风格接口的核心注解。
语法格式
java
复制代码
// 路径模板:/user/{id} 中的 {id} 就是路径参数
@GetMapping("/user/{id}")
public User getUserById(@PathVariable Integer id) {
// 直接获取路径中的id值
return userService.getById(id);
}
关键特性
参数绑定 :注解中 value 属性可指定路径参数名(如@PathVariable("userId") Integer id),路径模板与注解名称需一致;
数据格式 :仅支持简单类型(Integer、String、Long 等),不能接收复杂对象;
请求方法:支持 GET、POST 等所有请求方法,主流用于 GET 请求;
使用场景 :获取单个资源详情(如/order/1001获取 1001 号订单)、路径层级查询(如/category/phone/list)。
1.2 @RequestParam:获取 URL 查询参数 / 表单参数
核心作用
从URL? 后面的查询参数 (如/user?name=张三&age=20)或表单提交的参数 中获取数据,是处理简单查询条件 、分页参数的核心注解。
语法格式
java
复制代码
// 场景1:获取URL查询参数
@GetMapping("/user")
public List
@RequestParam String name,
@RequestParam(defaultValue = "1") Integer pageNum
) {
// 自动获取name和pageNum参数,defaultValue指定默认值
return userService.getByCondition(name, pageNum);
}
// 场景2:获取表单参数(POST请求)
@PostMapping("/user/add")
public String addUser(@RequestParam String username, @RequestParam String password) {
userService.add(username, password);
return "success";
}
关键特性
参数绑定 :支持 value 属性指定参数名(如@RequestParam("userName") String name),required 属性指定是否必传(默认 true,必传时参数缺失会报错);
数据格式 :支持简单类型、简单类型数组(如@RequestParam String[] hobbies);
请求方法:GET 请求(主流)、POST 请求均支持;
使用场景:条件查询(如多条件筛选用户)、分页查询(pageNum、pageSize)、表单提交(简单注册、登录)。
1.3 @RequestBody:获取请求体中的 JSON 参数
核心作用
将HTTP 请求体(Body)中的 JSON 格式数据 绑定到 Java 对象中,适用于传递复杂数据 、新增 / 修改操作,是前后端分离开发的核心注解。
语法格式
java
复制代码
// 前端传JSON:{"username":"张三","age":20,"hobbies":["篮球","编程"]}
@PostMapping("/user/add")
public String addUser(@RequestBody User user) {
// 自动将JSON数据映射到User对象的属性中
userService.add(user);
return "success";
}
// 补充:接收JSON数组
@PostMapping("/user/batchAdd")
public String batchAddUser(@RequestBody List
userService.batchAdd(userList);
return "success";
}
关键特性
参数绑定 :无 value 属性,直接绑定请求体,支持复杂对象 、集合 、嵌套对象;
数据格式 :仅支持JSON 格式 ,请求头需携带Content-Type: application/json;
请求方法:主流用于 POST、PUT 请求,GET 请求不支持请求体;
使用场景:新增用户 / 订单(传复杂对象)、修改数据(全量 / 部分更新)、批量操作(传集合)、前后端分离架构的核心数据交互。
1.4 三大注解核心区别(面试必背版)
表格
注解
参数获取位置
数据格式
请求方法主流
是否支持复杂对象
核心使用场景
@PathVariable
URL 路径模板({参数})
简单类型
GET
❌ 不支持
获取单个资源 ID、RESTful 风格
@RequestParam
URL? 查询参数 / 表单参数
简单类型、简单数组
GET/POST
❌ 不支持
条件查询、分页、简单表单提交
@RequestBody
HTTP 请求体(Body)
JSON 格式(对象 / 集合)
POST/PUT
✅ 支持
复杂数据传递、新增 / 修改操作
二、Spring Boot 常用开发注解补充
除了上述三大核心接收参数注解,Spring Boot 开发中还有多个高频注解 ,按使用场景分类整理,附核心作用和代码示例,覆盖开发、面试、答辩全场景。
2.1 控制器与请求映射核心注解
表格
注解
核心作用
代码示例
@RestController
组合注解(@Controller + @ResponseBody),标记控制器类,返回 JSON / 字符串而非视图
@RestControllerpublic class UserController { ... }
@GetMapping
标记 GET 请求方法,简化 @RequestMapping (method = RequestMethod.GET)
@GetMapping("/user/{id}")public User getUser(@PathVariable Integer id)
@PostMapping
标记 POST 请求方法,简化 @RequestMapping (method = RequestMethod.POST)
@PostMapping("/user/add")public String addUser(@RequestBody User user)
@PutMapping
标记 PUT 请求方法,用于更新操作(全量更新)
@PutMapping("/user/update")public String updateUser(@RequestBody User user)
@DeleteMapping
标记 DELETE 请求方法,用于删除操作
@DeleteMapping("/user/{id}")public String deleteUser(@PathVariable Integer id)
@RequestMapping
通用请求映射注解,支持指定请求方法、路径、请求头,灵活度最高
@RequestMapping(value = "/user", method = RequestMethod.GET, headers = "token=123")
2.2 参数接收与数据绑定补充注解
表格
注解
核心作用
代码示例
@RequestHeader
获取请求头中的参数(如 token、Authorization、Content-Type)
public String getToken(@RequestHeader("token") String token) { ... }
@CookieValue
获取Cookie中的值(如 JSESSIONID、sessionId)
public String getCookie(@CookieValue("JSESSIONID") String sid) { ... }
@ModelAttribute
将表单 / URL 参数封装到Java 对象中,适用于简单表单提交,替代多个 @RequestParam
@PostMapping("/user/add")public String addUser(@ModelAttribute User user)
@RequestPart
处理文件上传请求,支持 MultipartFile 类型,替代传统 @RequestParam
@PostMapping("/upload")public String upload(@RequestPart("file") MultipartFile file)
@PathVariableMap
将所有路径参数封装为Map 集合,适用于路径参数较多的场景
@GetMapping("/user/{id}/{name}")public Map getPathParam(@PathVariableMap Map
2.3 服务层与业务逻辑注解
表格
注解
核心作用
代码示例
@Service
标记服务层接口实现类,Spring 会自动扫描并创建 Bean 实例
@Servicepublic class UserServiceImpl implements UserService { ... }
@Transactional
标记事务管理,可加在类或方法上,实现事务的提交 / 回滚(需开启事务管理)
@Transactionalpublic void addUserAndOrder(User user, Order order) { ... }
@Autowired
按类型自动注入依赖,Spring 核心注入注解
@Autowiredprivate UserService userService;
@Resource
按名称自动注入依赖(JDK 注解),默认按名称匹配,无名称则按类型
@Resource(name = "userServiceImpl")private UserService userService;
@Qualifier
配合 @Autowired 使用,指定注入的 Bean名称,解决同接口多个实现类的冲突
@Autowired@Qualifier("userServiceImpl")private UserService userService;
2.4 数据持久层与数据库注解
表格
注解
核心作用
代码示例
@Mapper
标记MyBatis 接口,MyBatis 会自动生成接口实现类(需配置扫描路径)
@Mapperpublic interface UserMapper { ... }
@MapperScan
在 Spring Boot 启动类上扫描Mapper 接口,替代单个 @Mapper 注解,批量扫描
@SpringBootApplication@MapperScan ("com.example.demo.mapper")public class DemoApplication { ... }
@Repository
标记数据访问层(DAO)类,Spring 会自动扫描并创建 Bean 实例,捕获数据访问异常
@Repositorypublic interface UserDAO { ... }
@Insert / @Update / @Delete / @Select
MyBatis 注解式开发,直接在接口方法上编写 SQL,无需 XML 文件
@Select("select * from user where id = #{id}") User getUserById(Integer id);
2.5 配置与组件扫描注解
表格
注解
核心作用
代码示例
@SpringBootApplication
Spring Boot 启动类核心注解,组合 @Configuration、@ComponentScan、@EnableAutoConfiguration
@SpringBootApplicationpublic class DemoApplication { main() { ... } }
@Configuration
标记配置类,替代传统 XML 配置文件,可通过 @Bean 定义 Bean
@Configurationpublic class AppConfig {@Beanpublic UserService userService() { return new UserServiceImpl(); } }
@Bean
标注在配置类的方法上,将方法返回值注册为Spring Bean,自定义 Bean 的创建逻辑
@Beanpublic DataSource dataSource() {return new DruidDataSource(); }
@ComponentScan
指定 Spring 扫描组件类的路径(@Controller、@Service、@Component 等)
@ComponentScan(basePackages = "com.example.demo")
@Value
读取 ** 配置文件(application.yml/properties)** 中的属性值
@Value("${server.port}")private String port;
@ConfigurationProperties
批量读取配置文件属性,绑定到实体类,支持类型转换、校验
@ConfigurationProperties(prefix = "user")@Componentpublic class UserConfig { private String name; private Integer age; }
三、面试 / 答辩高频考点总结
核心区别题 :面试常问 "@RequestParam、@RequestBody、@PathVariable 的区别",需从参数位置、数据格式、使用场景三个维度回答,结合代码示例更有说服力;
RESTful 风格题 :重点说明 @PathVariable 在 RESTful 接口中的应用(如/user/{id}),以及 GET/POST/PUT/DELETE 注解的对应场景;
前后端分离题:强调 @RequestBody 是前后端分离开发的核心,解释 JSON 数据与 Java 对象的映射原理;
事务管理题:@Transactional 注解的使用场景(如多操作原子性)、失效场景(如非 public 方法、异常类型未指定);
注入冲突题:@Autowired 与 @Resource 的区别,@Qualifier 解决同接口多实现类注入的问题。
四、实战示例:综合使用所有核心注解
以下是一个完整的 Spring Boot 用户管理接口示例,整合本文所有核心注解,可直接作为毕业设计或项目开发的参考代码:
java
复制代码
import com.example.demo.entity.User;
import com.example.demo.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.util.List;
import java.util.Map;
/**
* 控制器类:整合所有核心接收参数注解
*/
@RestController
@RequestMapping("/user") // 类级别的请求映射,所有方法前缀为/user
public class UserController {
@Autowired
private UserService userService;
/**
* 1. 使用@PathVariable获取路径参数
* 接口:GET /user/1001
*/
@GetMapping("/{id}")
public User getUserById(@PathVariable Integer id) {
return userService.getById(id);
}
/**
* 2. 使用@RequestParam获取查询参数
* 接口:GET /user/list?name=张三&pageNum=1&pageSize=10
*/
@GetMapping("/list")
public List
@RequestParam(required = false) String name,
@RequestParam(defaultValue = "1") Integer pageNum,
@RequestParam(defaultValue = "10") Integer pageSize
) {
return userService.getPageList(name, pageNum, pageSize);
}
/**
* 3. 使用@RequestBody接收JSON参数
* 接口:POST /user/add
* 请求体:{"username":"张三","age":20,"hobbies":["篮球","编程"]}
*/
@PostMapping("/add")
public String addUser(@RequestBody User user) {
userService.add(user);
return "新增用户成功";
}
/**
* 4. 使用@RequestHeader获取请求头参数
* 接口:GET /user/token
* 请求头:token: admin123456
*/
@GetMapping("/token")
public String getToken(@RequestHeader("token") String token) {
return "获取到的token:" + token;
}
/**
* 5. 使用@RequestPart实现文件上传
* 接口:POST /user/upload
* 表单参数:file(文件)
*/
@PostMapping("/upload")
public String uploadFile(@RequestPart("file") MultipartFile file) {
userService.uploadFile(file);
return "文件上传成功";
}
/**
* 6. 使用@PathVariableMap获取所有路径参数
* 接口:GET /user/map/1001/张三
*/
@GetMapping("/map/{id}/{name}")
public Map
return paramMap; // 返回:{id=1001, name=张三}
}
}
Spring Web 里最常用、面试必问、实际开发必写的还有这几个,按重要程度给你排好:
1. @RequestHeader(非常常用)
取请求头里的值,比如 token、User-Agent、Content-Type
java
复制代码
public String test(@RequestHeader("token") String token)
2. @CookieValue
取 Cookie 里的值
java
复制代码
public String test(@CookieValue("JSESSIONID") String sid)
3. @ModelAttribute
接收表单对象,不用一个个写 @RequestPara
和 @RequestBody 区别:
@ModelAttribute:表单 / URL 参数封装
@RequestBody:JSON 封装
4. @RequestPart
专门接收文件上传,配合 MultipartFile
java
复制代码
public String upload(@RequestPart("file") MultipartFile file)
5. @MatrixVariable
URL 路径里的分号参数(少用但算同类)/user;id=1;name=zs
总结
本文从核心接收参数注解 到Spring Boot 全场景常用注解,做了系统性梳理,覆盖开发、答辩、面试的核心需求。重点掌握三大核心接收参数注解的区别,以及控制器、服务层、持久层的核心注解,就能快速搭建规范的 Spring Boot 项目架构。