Skip to content

@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)自动填充到你的方法参数里

java
@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作用域的值。

java
@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与表一一对应的 物理 SQLSELECT * 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

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 的余额,这两步必须同时成功或同时失败。

角色授权:删除旧权限关联 + 插入新权限关联,不能出现 “旧的删了但新的没加上” 的中间状态。

java
    @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

  • 一个包含所有字段的构造函数(全参构造)
  • 一个无参构造函数(空构造)

编译后以后等价于

java
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 字段的构造方法,简化依赖注入的代码

传统写法

java
@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

java
@Service
@RequiredArgsConstructor
public class UserService {
    
    private final UserMapper userMapper;
    private final PasswordEncoder passwordEncoder;
    private final CacheManager cacheManager;
    
    // 构造方法自动生成!
}

@Validated注解用于验证请求参数。

它可以应用在Controller类或方法上

示例

java
@PostMapping("/send-code")
    public SendCodeResponse sendCode(@Valid @RequestBody SendCodeRequest request) {
        return authService.sendCode(request);
    }
//	@Valid 触发 JSR-303 校验(校验 SendCodeRequest 中的 @NotNull 等注解

假设 SendCodeRequest 定义如下:

java
public record SendCodeRequest(
    @NotNull 
    IdentifierType identifierType,    // 不能为空
    
    @NotBlank 
    @Pattern(regexp = "^1[3-9]\\d{9}$")  // 手机号格式
    String identifier,
    
    @NotNull 
    Scene scene
) {}

校验失败时:Spring 自动抛出 MethodArgumentNotValidException,返回 400 Bad Request