苍穹外卖注解解析
一、 核心业务与架构层注解
1. AOP 与自动填充相关注解
为了避免每次新增或修改数据时,都手动去写setCreateTime、setUpdateUser等重复代码,项目使用了自定义注解结合 AOP 实现自动填充。
- @AutoFill:自定义注解,标注在 Mapper 方法上。
- 例子:
@AutoFill(value = OperationType.INSERT)标在void insert(Employee employee);上,告诉切面这是一个新增操作,切面会自动把创建时间、创建人塞进employee对象里。
- 例子:
- @Target 和 @Retention:元注解,定义 @AutoFill 的行为。
- 例子:
@Target(ElementType.METHOD)限制它只能用在方法上;@Retention(RetentionPolicy.RUNTIME)保证运行时能被 AOP 反射读取到。
- 例子:
- @Aspect 和 @Pointcut:定义切面和切入点。
- 例子:
@Pointcut("@annotation(com.sky.annotation.AutoFill)")精准拦截所有带有 @AutoFill 注解的方法,触发自动填充逻辑。
- 例子:
2. 缓存相关注解 (Spring Cache)
结合 Redis 实现声明式缓存,减少数据库查询压力。
- @EnableCaching:开启缓存功能。
- 例子:写在启动类
SkyApplication上,相当于打开了整个项目的缓存开关。
- 例子:写在启动类
- @Cacheable:查缓存,没有才查库。
- 例子:
@Cacheable(cacheNames = "userCache", key = "#userId")标在查询用户的方法上,先从 Redis 找userCache::1,找不到再去查数据库。
- 例子:
- @CacheEvict:删缓存,保证数据一致。
- 例子:
@CacheEvict(cacheNames = "userCache", key = "#userId")标在修改用户的方法上,数据一改,立马把 Redis 里的旧缓存删掉。
- 例子:
3. 定时任务注解 (Spring Task)
处理超时未支付等后台自动任务。
- @EnableScheduling:开启定时任务。
- 例子:写在启动类上。
- @Scheduled:定义执行频率。
- 例子:
@Scheduled(cron = "0 * * * * ?")标在checkOrderStatus方法上,表示每分钟执行一次,检查有没有超时的订单。
- 例子:
二、 Web 接口与交互层注解
1. 接口文档生成注解 (Swagger / Knife4j)
自动生成接口文档,方便前后端对接。
- @Api 和 @ApiOperation:描述接口。
- 例子:
@Api(tags = "员工管理")标在EmployeeController上;@ApiOperation(value = "新增员工")标在save方法上。
- 例子:
- @ApiModel 和 @ApiModelProperty:描述实体字段。
- 例子:在
EmployeeDTO类上写@ApiModel("员工DTO"),在name字段上写@ApiModelProperty("员工姓名"),这样文档里就会显示中文说明。
- 例子:在
2. 请求处理与参数绑定注解
接收前端传来的各种数据。
- @RestController 和 @RequestMapping:声明控制器和基础路径。
- 例子:
@RestController+@RequestMapping("/admin/employee")标在类上,表示所有接口都以/admin/employee开头。
- 例子:
- @PostMapping / @GetMapping 等:映射具体请求。
- 例子:
@PostMapping标在save方法上,处理 POST 请求。
- 例子:
- @RequestBody:解析 JSON 数据。
- 例子:
save(@RequestBody EmployeeDTO employeeDTO),Spring MVC 会自动把前端传来的 JSON 字符串变成EmployeeDTO对象。
- 例子:
- @PathVariable:提取 URL 路径参数。
- 例子:
getById(@PathVariable Long id),自动提取/admin/employee/1中的1。
- 例子:
- @RequestParam:提取查询字符串参数。
- 例子:
page(@RequestParam int page, @RequestParam int pageSize),接收?page=1&pageSize=10这种参数。
- 例子:
三、 数据持久层注解 (MyBatis)
- @Mapper:声明数据访问接口。
- 例子:
@Mapper标在EmployeeMapper接口上,Spring 启动时会自动为它生成代理类并注入到容器中。
- 例子:
- @Select / @Insert 等:直接写 SQL。
- 例子:
@Select("SELECT * FROM employee WHERE id = #{id}")标在方法上,省去写 XML 文件的麻烦。
- 例子:
四、 基础与通用注解
- @Service / @Autowired:依赖注入。
- 例子:
@Service标在EmployeeServiceImpl上;@Autowired private EmployeeMapper employeeMapper;自动把 Mapper 注入进来。
- 例子:
- @Slf4j:日志打印。
- 例子:标在类上后,可以直接用
log.info("新增员工成功");,不用手动new一个 Logger。
- 例子:标在类上后,可以直接用
- @Data:简化实体类。
- 例子:标在
Employee类上,Lombok 自动生成所有的 Getter、Setter、toString 方法
- 例子:标在
