一、基础核心注解与反射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 等知识点均围绕「复用性、灵活性、可配置性」设计是日常开发的高频考点。