苍穹外卖Day03笔记
一、基础核心注解与反射1. 自定义注解以 AutoFill 为例自定义注解是 Java 元编程的核心常用于 AOP 切面拦截、参数校验、自动填充等场景如 MyBatis 字段自动填充创建时间/修改人。// 自定义自动填充注解Target(ElementType.METHOD)// 注解作用在方法上Retention(RetentionPolicy.RUNTIME)// 运行时保留可通过反射获取publicinterfaceAutoFill{// 注解属性填充类型如INSERT/UPDATEOperationTypevalue();}// 枚举填充操作类型publicenumOperationType{INSERT,UPDATE;}2. 反射Reflect反射是框架的灵魂Spring/MyBatis 底层核心核心能力是「运行时获取类/方法/字段信息并动态调用」。核心方法Method.invoke(Object obj, Object… args)参数含义Object obj执行方法的「对象实例」静态方法传 nullObject… args方法执行所需的「实际参数」与方法形参一一对应反射结合 AutoFill 实战自动填充字段/** * 反射实现字段自动填充如给实体类设置createTime/updateTime * param entity 要填充的实体对象如User/Order * param operationType 操作类型INSERT/UPDATE */publicvoidautoFill(Objectentity,OperationTypeoperationType)throwsException{// 1. 获取实体类的Class对象Class?clazzentity.getClass();// 2. 获取要填充的方法如setCreateTime/setUpdateTimeMethodsetCreateTimeclazz.getDeclaredMethod(setCreateTime,LocalDateTime.class);MethodsetUpdateTimeclazz.getDeclaredMethod(setUpdateTime,LocalDateTime.class);// 3. 执行方法谁来执行entity 执行参数当前时间if(operationTypeOperationType.INSERT){setCreateTime.invoke(entity,LocalDateTime.now());// 插入时填充创建时间}setUpdateTime.invoke(entity,LocalDateTime.now());// 插入/更新都填充修改时间}二、AOP 切面拦截注解 增强方法AOP面向切面编程核心是「无侵入式增强方法」常结合注解实现日志记录、权限校验、自动填充、事务控制等。1. 核心概念JoinPoint连接点被拦截的方法/字段如标注AutoFill的方法。Before前置通知方法执行前执行如自动填充字段。切面类封装通用逻辑如日志、自动填充通过注解绑定目标方法。2. AOP 获取注解模板通用Aspect// 标记为切面类Component// 交给Spring管理publicclassAutoFillAspect{// 切入点拦截所有标注AutoFill的方法Pointcut(annotation(com.example.annotation.AutoFill))publicvoidautoFillPointCut(){}// 前置通知方法执行前执行自动填充Before(autoFillPointCut())publicvoidautoFill(JoinPointjoinPoint){// 1. 获取JoinPoint中的注解信息MethodSignaturesignature(MethodSignature)joinPoint.getSignature();AutoFillautoFillsignature.getMethod().getAnnotation(AutoFill.class);OperationTypeoperationTypeautoFill.value();// 获取注解属性// 2. 获取方法参数要填充的实体对象Object[]argsjoinPoint.getArgs();if(argsnull||args.length0){return;}Objectentityargs[0];// 假设第一个参数是实体对象// 3. 调用反射方法完成自动填充try{autoFill(entity,operationType);// 调用上文的反射方法}catch(Exceptione){thrownewRuntimeException(自动填充字段失败,e);}}}三、Spring 核心注解1. 请求参数注解RequestParam/RequestBody/ResponseBody注解作用场景核心区别RequestParam获取URL参数如?namezhangsan用于GET请求参数需与前端传参名一致RequestBody获取JSON请求体如POST/PUT的请求体用于POST/PUT绑定复杂对象需前端传JSONResponseBody响应JSON数据替代视图跳转将返回值转为JSONRESTful接口必用实战示例RestController// 等价于Controller ResponseBodyRequestMapping(/user)publicclassUserController{// GET请求获取URL参数GetMapping(/get)publicResultUsergetUser(RequestParam(id)Longid){returnResult.success(userService.getById(id));}// POST请求获取JSON请求体PostMapping(/add)publicResultVoidaddUser(RequestBodyUseruser){userService.save(user);returnResult.success();}}2. 事务注解Transactional用于声明式事务底层通过AOP实现标记在方法/类上满足「非检查异常回滚检查异常需手动指定」。ServicepublicclassUserService{AutowiredprivateUserMapperuserMapper;// 声明事务异常时回滚Transactional(rollbackForException.class)// 指定所有异常都回滚publicvoidsaveUser(Useruser){userMapper.insert(user);// 若此处抛出异常事务会回滚数据不会插入}}3. 条件注解ConditionalOnMissingBeanSpringBoot 自动配置核心注解「当容器中不存在指定Bean时才创建当前Bean」用于自定义覆盖默认配置。// 当容器中没有UserService类型的Bean时才创建这个BeanBeanConditionalOnMissingBean(UserService.class)publicUserServiceuserService(){returnnewUserServiceImpl();}4. MultipartFile 类Spring 提供的文件上传核心类用于接收前端上传的文件如图片/文档。PostMapping(/upload)publicResultStringuploadFile(RequestParam(file)MultipartFilefile){// 1. 校验文件if(file.isEmpty()){returnResult.fail(文件不能为空);}// 2. 获取文件名/大小/类型StringoriginalFilenamefile.getOriginalFilename();longsizefile.getSize();StringcontentTypefile.getContentType();// 3. 保存文件file.transferTo(newFile(/upload/originalFilename));returnResult.success(上传成功);}四、MyBatis 核心知识点1. 插入主键自增useGeneratedKeys/keyProperty!-- 插入时自动获取自增主键并赋值给实体类的id字段 --insertidinsertuseGeneratedKeystruekeyPropertyidINSERT INTO user (name, age, create_time) VALUES (#{name}, #{age}, #{createTime})/insertuseGeneratedKeystrue开启自增主键获取。keyPropertyid将自增主键赋值给实体类的id属性。2. 动态 SQLMyBatis 核心特性通过标签实现「条件拼接SQL」避免硬编码。!-- 动态条件查询 --selectidlistresultTypeUserSELECT * FROM userwhereiftestname ! null and name ! AND name LIKE CONCAT(%, #{name}, %)/ififtestage ! nullAND age #{age}/if/where/select3. 左外连接left outer join查询「主表所有数据 关联表匹配的数据」关联表无数据时显示null。!-- 查询用户及其订单左外连接即使用户无订单也会显示 --selectidgetUserWithOrderresultTypeUserVOSELECT u.id, u.name, o.order_no FROM user u LEFT OUTER JOIN order o ON u.id o.user_id WHERE u.id #{id}/select五、数据库核心索引1. 索引的作用提升查询效率避免全表扫描常见类型主键索引、唯一索引、普通索引、联合索引。2. 设计原则高频查询字段加索引如where/join/order by字段。避免过度索引增删改会变慢。联合索引遵循「最左前缀原则」如索引(a,b,c)查询条件需包含a。六、泛型方法泛型方法用于「复用方法逻辑适配不同类型参数」常见于通用工具类如MyBatis的BaseMapper。/** * 通用泛型方法根据ID查询任意实体 * param clazz 实体类Class对象 * param id 主键ID * return 实体对象 */publicTTgetById(ClassTclazz,Longid)throwsException{// 反射获取Mapper接口Class?mapperClassClass.forName(com.example.mapper.clazz.getSimpleName()Mapper);ObjectmapperSpringContextUtil.getBean(mapperClass);// 获取Spring中的Mapper实例// 反射调用getById方法MethodgetByIdmapperClass.getDeclaredMethod(getById,Long.class);return(T)getById.invoke(mapper,id);// 泛型返回}// 调用示例UserusergetById(User.class,1L);OrderordergetById(Order.class,2L);总结注解 反射 AOP是Spring生态的核心组合注解标记目标方法反射动态操作类/方法AOP无侵入增强逻辑如AutoFill自动填充。请求参数注解需区分场景GET用RequestParamPOST/PUT用RequestBody响应JSON用ResponseBody。MyBatis 核心动态SQL简化条件查询useGeneratedKeys获取自增主键left outer join实现关联查询。泛型方法、Transactional、ConditionalOnMissingBean 等知识点均围绕「复用性、灵活性、可配置性」设计是日常开发的高频考点。

相关新闻

商用果茶包哪个公司值得信赖

商用果茶包哪个公司值得信赖

在忙碌的生活中,一杯好喝的果茶不仅能带来愉悦的味觉体验,还能为身体补充维生素和水分。然而,现制果茶麻烦、奶茶高糖、自制费时间、水果易浪费等问题常常让人望而却步。商用果茶包作为便捷健康的解决方案,逐渐受到越来越多消费者…

2026/5/17 10:23:33 阅读更多 →
SQL-DBA命令

SQL-DBA命令

新建用户创建一个用户名为java1,密码设置为123的本地用户create user java1localhost identified by 123;创建一个用户名为java2,密码设置为123的外网用户create user java2% identified by 123;使用root用户查看系统中当前用户有哪些select user,host f…

2026/7/4 3:23:06 阅读更多 →
AI图像标注软件:WPF-LabelImg使用教程

AI图像标注软件:WPF-LabelImg使用教程

AI图像标注软件:WPF-LabelImg使用教程 一 切换主题二 创建项目显示图像三 创建标签编辑标签

2026/5/17 0:56:25 阅读更多 →

最新新闻

Ceph数据一致性开发解析:openeuler/ceph_dev中CRUSH算法深度剖析

Ceph数据一致性开发解析:openeuler/ceph_dev中CRUSH算法深度剖析

Ceph数据一致性开发解析:openeuler/ceph_dev中CRUSH算法深度剖析 【免费下载链接】ceph_dev ceph_dev is a project focus on some feature developing based on ceph 项目地址: https://gitcode.com/openeuler/ceph_dev 前往项目官网免费下载:ht…

2026/7/5 8:54:32 阅读更多 →
Fail2Ban:自动封禁暴力破解 IP 的防护工具

Fail2Ban:自动封禁暴力破解 IP 的防护工具

文章目录Fail2Ban:自动封禁暴力破解 IP 的防护工具Fail2Ban:自动封禁暴力破解 IP 的防护工具 服务器被暴力破解是运维中常见的安全问题。Fail2Ban 是一款开源的入侵防护工具,GitHub 上有 18,000 Star,专门用来自动封禁多次认证失…

2026/7/5 8:54:32 阅读更多 →
BSCCompiler代码贡献指南:如何参与开源编译器项目开发

BSCCompiler代码贡献指南:如何参与开源编译器项目开发

BSCCompiler代码贡献指南:如何参与开源编译器项目开发 【免费下载链接】BSCCompiler BSC Compiler is an unified programming platform supporting multiple devices and languages. 项目地址: https://gitcode.com/openeuler/BSCCompiler 前往项目官网免费…

2026/7/5 8:52:31 阅读更多 →
让AI少说75%的话能力却不掉

让AI少说75%的话能力却不掉

一个叫 caveman 的开源项目,让 Claude Code、Codex、Cursor 这些 AI 编程助手开口像原始人,砍掉七成输出字数,技术准确性缺一分不少。 1 一个仓库塞进五种身份 caveman 在 GitHub 上就一个仓库,却能同时是 Claude Code 的插件、Codex 的插件、Gemini 的扩展、Cursor 的规则…

2026/7/5 8:52:31 阅读更多 →
系统设计学习资源大全:3.9万Star的面试准备指南

系统设计学习资源大全:3.9万Star的面试准备指南

文章目录系统设计学习资源大全:3.9万Star的面试准备指南1、资源覆盖了哪些内容2、面试题库按难度分三档3、配套的学习材料4、适合谁用系统设计学习资源大全:3.9万Star的面试准备指南 awesome-system-design-resources 在 GitHub 上已经拿到 39,070 Star…

2026/7/5 8:52:31 阅读更多 →
Redisson 4.5 深度全景解析 — 从架构设计到分布式数据结构

Redisson 4.5 深度全景解析 — 从架构设计到分布式数据结构

文章目录 概述 Redisson 4.5 项目概览 核心特性总览 项目模块结构 技术架构深度解析 整体架构分层 客户端多范式 API 设计 四种部署模式 命令执行流程 核心概念与基础原理 Redis 数据结构映射 序列化机制 网络编程概念 分布式数据结构全景 基础分布式数据结构 RBucket — 分布式…

2026/7/5 8:52:31 阅读更多 →

日新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

周新闻

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容

B站视频下载神器BiliTools:5分钟学会轻松保存任何B站内容 【免费下载链接】BiliTools A cross-platform bilibili toolbox. 跨平台哔哩哔哩工具箱,支持下载视频、番剧等等各类资源 项目地址: https://gitcode.com/GitHub_Trending/bilit/BiliTools …

2026/7/5 0:03:34 阅读更多 →
威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型全解析:从新手入门到实战应用,助你构建安全产品!

威胁模型的陌生现状在忙碌疲惫的一天里,参与了关于混合后量子密码学的讨论,应付端点攻击找茬的人,还参与留言板讨论后,发现“威胁模型”对多数人仍是陌生概念,且多被当作时髦用语。有趣的相关画作有一幅由 Embyr 创作的…

2026/7/5 0:03:34 阅读更多 →
渗透测试入门指南:从零基础到实战环境搭建

渗透测试入门指南:从零基础到实战环境搭建

1. 从“看热闹”到“入门”:我理解的渗透测试到底是什么?每次看到新闻里说某个大公司的数据被“黑”了,或者某个网站被攻击导致服务瘫痪,你是不是和我一样,心里会冒出两个念头:一是“这黑客真厉害”&#x…

2026/7/5 0:07:38 阅读更多 →

月新闻