@RestController
是 @Controller 和 @ResponseBody 的组合注解
通过 @RestController 标记的类会被 Spring 容器识别为控制器,专门处理 HTTP 请求并返回数据(而非视图页面)
@PathVariable注解
动态路径参数绑定 将 URL 中的占位符(如 {id})与控制器方法参数绑定,实现资源标识的动态提取。 示例:
@GetMapping("/users/{id}")
public User getUser(@PathVariable Long id) { ... }请求 /users/123 时,id 参数自动绑定到 123
@RequestParam注解
通过注解 @RequestParam可以轻松的将URL中的参数绑定到处理函数方法的变量 中。
想象你在填写一个网购订单表单,填写完“收货人姓名”和“联系电话”后,系统自动把这些信息填到后台的对应位置。@RequestParam 的作用就是让 Spring Boot 框架扮演这个“自动填表工具”,把用户通过 URL 传递的参数(比如 ?name=张三&phone=123)自动填充到你的方法参数里
@GetMapping("/user")
public String getUserInfo(
@RequestParam("name") String userName // 自动把 URL 中的 name=张三 绑定到 userName
) {
return "用户姓名:" + userName; // 输出:用户姓名:张三
}@RequestBody注解
@RequestBody 是 Spring MVC 框架中的一个注解,用于将 HTTP 请求的 请求体(Body) 绑定到方法参数上。它通常用于处理 JSON、XML 或表单数据 等格式的请求,是实现 RESTful API 的关键注解之一。
前端传什么格式的数据,我就把它变成什么类型的对象
@RequestAttribute注解
用来标注在接口的参数上,参数的值来源于 request 作用域。 我们使用test1转发,并在request作用域里面存储值。在test2里面的形式 参数里面获取的就是test1方法存储在Request作用域的值。
@Controller public class ParamController {
@RequestMapping("/test1")
public String test1(HttpServletRequest request) {
request.setAttribute("username", "eric");
return "forward:/test2";
}
@RequestMapping("/test2")
public String test2(@RequestAttribute("username") String username) {
System.out.println(username);
return username; } }自定义注解常用元注解
*常见的元注解有姐下: *@Target:描述的是当前注解需要修饰个目标资源。 @Target(ElementType.TYPE)描述当前注解可以修饰类或者接口 @Target(ElementType,EIELD)当游注解可以修饰成员变最 @Target(ElementType.METHOD)当前注解可以修饰方法形参@Target(ElementType,PARAMETER)当前注解可以修饰方达 *Inherited被修饰的注解县有继水性 @Documented指的是被修施的主键可以被javadoc工具提取成文档 奇@Retention 定义注解的生命周期(保留策略) @Rentention(RetentionPolicy.SOURCE)当前主键只会存在源码中 不参与编译,更不会被运行
@Rentention(RetentionPolicy.ClASS)当前主键会参与编洋,但是不会参与运行
@Rentention(RetentionPolicy.RUNTIME)2当前注解既参与编译,也参与运行,在运行时我们可以基于反射的机制获取到该注解信息。
@Service
Spring 的构造型注解,告诉 Spring 容器:这是一个业务层(Service)组件,需要被扫描并注册为 Bean。
Mapper与Service层
| 层级 | 关注点 | 例子 |
|---|---|---|
| Mapper | 与表一一对应的 物理 SQL | SELECT * FROM sys_role WHERE … |
| Service | 业务规则、数据加工、权限判断等 | “若当前用户非超级管理员,则追加部门过滤条件” |
Mapper` 只负责“把数据按指定条件从数据库取出来”,不做业务逻辑;真正的逻辑查询(业务规则、数据权限、结果裁剪)放在 Service 层完成。
@TableField(exist = false)
MyBatis-Plus 专用注解。
`(exist = false)` → **注解参数**;给注解的 `exist` 属性赋值 `false`,告诉框架“这个字段在表里不存在”。if(StringUtils.isNotEmpty(param.getNickName())){
query.lambda().like(SysUser::getNickName, param.getNickName());
}| 步骤 | 代码 | 说明 |
|---|---|---|
| ① 换壳 | query.lambda() | 把 QueryWrapper 转成 LambdaQueryWrapper,开启“方法引用”模式。 |
| ② 指定列 | SysUser::getNickName | 用 方法引用 对应数据库列 nick_name。 |
| ③ 指定值 | param.getNickName() | 取前端传来的关键字,比如 "张三"。 |
| ④ 生成片段 | .like(...) | 在内部条件链表追加 LIKE #{nickName},占位符自动加 %。 |
@Autowired
是 Spring Framework 提供的核心注解,
让 Spring 容器自动把匹配的 Bean 注入到这个字段、构造器或方法参数里
@PathVariable:
把 URL 路径中的那段值 取出来,直接变成方法参数。 一句话:它让 RESTful 路径参数 变成 Java 变量。
public ResultVo deleteUser(@PathVariable("userId") Long userId)
@Resource 和 @Autowired 的区别详解
基本概念
@Autowired
来源:Spring 框架的注解
按类型注入:根据类型(Type)来查找和注入B ean
默认必填:如果找不到对应的Bean会抛出异常
java@Autowired private UserService userService; // 先找类型为 UserService 的 bean // 如果有多个同类型 bean,会报错 // 需要配合 @Qualifier 指定名称 @Autowired @Qualifier("userServiceImpl") private UserService userService;
@Resource
来源:Java EE 标准注解(JSR-250)
按名称注入:优先按名称(Name)查找,找不到再按类型
默认非必填:找不到Bean时不会抛出异常
java@Resource private UserService userService; // 先找名为 userService 的 bean // 找不到再按类型找 // 可以指定名称 @Resource(name = "userServiceImpl") private UserService userService;假设有多个 UserService 实现:
java@Service("userServiceImpl") public class UserServiceImpl implements IUserService {} @Service("userServiceV2") public class UserServiceV2 implements IUserService {}@Autowired 处理方式:
java// ❌ 直接注入会报错(找到多个实现) @Autowired private IUserService userService; // ✅ 正确方式1:配合 @Qualifier @Autowired @Qualifier("userServiceImpl") private IUserService userService; // ✅ 正确方式2:用集合接收所有实现 @Autowired private List<IUserService> userServices; // ✅ 正确方式3:用 Map 接收 @Autowired private Map<String, IUserService> userServiceMap;@Resource 处理方式:
java// ✅ 直接指定名称 @Resource(name = "userServiceImpl") private IUserService userService; // ✅ 默认按属性名匹配 @Resource private IUserService userServiceImpl; // 属性名就是实现类名@PostConstruct
就是告诉 Spring:“这个 Bean 依赖都注入好以后,先帮我调一次这个方法做收尾”
@Component
Spring Framework 作用:把当前类标记为“组件”,被 Spring 的组件扫描(@ComponentScan)识别后,会
- 实例化一个单例 Bean
- 注册到应用上下文中 效果:其他地方可以通过
@Autowired、@RequiredArgsConstructor等方式直接注入这个配置对象
@ConfigurationProperties(prefix = "minio")
作用:告诉 Spring Boot“把配置文件(application.yml / application.properties)里所有以 minio 开头的键值对映射到当前类的字段上”。 例如配置
yaml
minio:
endpoint: http://localhost:9000
access-key: minioadmin
secret-key: minioadmin会自动调用对应的 setter 把值灌进字段。 效果:实现“类型安全”的外部化配置,无需手动 @Value("${minio.xxx}") 一个个写。
@ConfigurationProperties 是 Spring Boot 核心的配置绑定注解,核心作用是将配置文件(application.yml/properties)中的配置项,自动映射到 Java 类的属性上,批量替代 @Value 注解,简化配置读取。
@Transactional
是 Spring 框架提供的事务管理注解,用于声明一个方法或类需要在事务中执行,确保一组数据库操作要么全部成功(提交),要么全部失败(回滚),从而保证数据的一致性。
核心作用
在数据库操作中,某些业务需要多个步骤组成一个 “原子操作”(不可分割)。例如:
转账业务:扣除 A 的余额 + 增加 B 的余额,这两步必须同时成功或同时失败。
角色授权:删除旧权限关联 + 插入新权限关联,不能出现 “旧的删了但新的没加上” 的中间状态。
@Override
@Transactional
public void joinCourse(MemberCourse memberCourse) {
//根据课程id查询课程信息
Course course = courseService.getById(memberCourse.getCourseId());
BeanUtils.copyProperties(course,memberCourse);
//插入报名表
//将课程报名信息插入到数据库的 member_course 表中
//int insert :接收插入操作的返回结果,大于0表示插入成功
int insert = this.baseMapper.insert(memberCourse);
if(insert>0){
RechargeParam parm = new RechargeParam();
parm.setMemberId(memberCourse.getMemberId());
parm.setMoney(course.getCoursePrice());
//调用会员Mapper的扣费方法,从会员余额中扣除课程费用
memberMapper.subMoney(parm);
}
}@Transactional(readOnly = true)
| 属性 | 含义 | 作用 |
|---|---|---|
readOnly = true | 只读事务 | 告诉数据库"我不会修改数据" |
@AllArgsConstructor
@NoArgsConstructor
- 一个包含所有字段的构造函数(全参构造)
- 一个无参构造函数(空构造)
编译后以后等价于
public class User {
private Long id;
private String name;
private Integer age;
public User() {} // @NoArgsConstructor
public User(Long id, String name, Integer age) { // @AllArgsConstructor
this.id = id;
this.name = name;
this.age = age;
}
// …getter/setter 等
}@RequiredArgsConstructor
自动生成一个包含所有 final 字段的构造方法,简化依赖注入的代码
传统写法
@Service
public class UserService {
private final UserMapper userMapper;
private final PasswordEncoder passwordEncoder;
private final CacheManager cacheManager;
// 必须手写构造方法
public UserService(UserMapper userMapper,
PasswordEncoder passwordEncoder,
CacheManager cacheManager) {
this.userMapper = userMapper;
this.passwordEncoder = passwordEncoder;
this.cacheManager = cacheManager;
}
}用 @RequiredArgsConstructor
@Service
@RequiredArgsConstructor
public class UserService {
private final UserMapper userMapper;
private final PasswordEncoder passwordEncoder;
private final CacheManager cacheManager;
// 构造方法自动生成!
}@Validated注解用于验证请求参数。
它可以应用在Controller类或方法上
示例
@PostMapping("/send-code")
public SendCodeResponse sendCode(@Valid @RequestBody SendCodeRequest request) {
return authService.sendCode(request);
}
// @Valid 触发 JSR-303 校验(校验 SendCodeRequest 中的 @NotNull 等注解假设 SendCodeRequest 定义如下:
public record SendCodeRequest(
@NotNull
IdentifierType identifierType, // 不能为空
@NotBlank
@Pattern(regexp = "^1[3-9]\\d{9}$") // 手机号格式
String identifier,
@NotNull
Scene scene
) {}校验失败时:Spring 自动抛出 MethodArgumentNotValidException,返回 400 Bad Request