- 博客(159)
- 收藏
- 关注
原创 AOP切面深度学习
传统编程(横切关注点分散):│ ├─ 记录日志 ←┐│ ├─ 检查权限 ←┤│ ├─ 开启事务 ←┤ 横切关注点│ ├─ 业务逻辑 │ (重复代码)│ ├─ 提交事务 ←┤│ └─ 记录日志 ←┘│├─ login()│ ├─ 记录日志 ←┐│ ├─ 检查权限 ←┤│ ├─ 开启事务 ←┤ 横切关注点│ ├─ 业务逻辑 │ (重复代码)│ ├─ 提交事务 ←┤│ └─ 记录日志 ←┘问题:❌ 代码重复❌ 业务逻辑与通用逻辑混在一起❌ 修改日志代码,要改所有方法---
2025-12-22 21:34:17
379
原创 SpringCloud-Sleuth链路追踪实战
简单说:给每个请求分配一个唯一ID(TraceId),这个ID会贯穿整个调用链,方便排查问题。场景:用户反馈"注册失败",你怎么查?没有链路追踪:一个个服务翻日志,累死有链路追踪:拿到 TraceId,一搜全出来。
2025-12-22 14:33:18
350
2
原创 SpringCloud-Nacos 配置中心实战
把配置文件放到 Nacos 服务器上,应用启动时自动拉取,修改后自动刷新,不用重启应用。配置集中管理,不用改代码;支持动态刷新,修改立即生效;多环境隔离(dev/test/prod);敏感信息不提交代码库。
2025-12-22 10:53:19
292
原创 SpringCloud-Feign&RestTemplate
Spring 提供的传统同步 HTTP 客户端,基于,通过编程方式封装 HTTP 请求(GET/POST/PUT…)。适合灵活、手动控制请求细节的场景。:声明式的 HTTP 客户端,通过接口 + 注解描述远程服务,底层会帮你生成实现并处理负载均衡、序列化、拦截器等。适合微服务间调用、代码更声明式、更简洁可读。额外提醒:Spring 团队更推荐在新项目中使用(响应式、非阻塞),而不是继续新建大量在很多场景已不再主动演进)。
2025-12-21 22:11:13
928
原创 Java并发编程-多线程
interrupt 是一种协作式取消机制,不是强制终止。阻塞方法会把中断请求转化成异常,非阻塞代码需要主动检查中断状态,这是 Java 线程安全停止的标准方式。
2025-12-21 15:47:59
933
原创 AOP操作日志切面实战
AOP(面向切面编程):在不修改原代码的情况下,给方法增加额外功能场景:- 你有100个Controller方法- 每个都要记录日志- 不可能每个方法都写一遍日志代码解决:- 定义一个切面,统一处理- 方法上加个注解就行/*** 操作日志注解* 【注解说明】* @Target: 注解可以用在哪里* - ElementType.METHOD: 只能用在方法上* - ElementType.TYPE: 可以用在类上* @Retention: 注解保留到什么时候。
2025-12-21 10:50:44
126
原创 Blocked与Wati的区别
触发方式BLOCKED:线程在尝试进入时,目标监视器已被其他线程持有 → 进入 BLOCKED。WAITING:线程主动调用obj.wait()(或被join()等) → 进入 WAITING。锁的持有情况没有持有锁,正在等待获取锁。WAITING:调用wait()时会释放锁(这是 wait 的关键行为),线程本身进入等待队列。唤醒方式BLOCKED:不是被 notify 唤醒;只是当某个线程释放锁后,调度器允许它获取锁。WAITING:需要notify()(或中断/超时)来唤醒,然后再去竞争锁。
2025-12-20 21:00:18
515
原创 Sleep与Wait的区别
wait 是 Object 类的方法,用于线程间通信,会释放锁,必须在 synchronized 中使用,通常配合 notify 或 notifyAll 使用。sleep 是 Thread 类的方法,用于让线程休眠一段时间,但不会释放锁;3️⃣ notify 之后线程一定马上执行吗?只有持有该对象的锁,才能调用它们。1️⃣ sleep 会不会释放锁?2️⃣ wait 能不能单独调用?当前线程进入等待队列。
2025-12-20 15:23:53
387
原创 interrupt的“语义、异常、标志位清除/恢复、IO 异常处理”
请用 1–2 句线描述 的语义标准答案(示范): 是向目标线程发送中断请求——它设置该线程的中断标志位;如果线程正在执行 等可中断阻塞调用,JVM 会让这些调用抛出 并清除中断标志。否则只是置位,线程需主动检查并退出。点评:要强调“请求/协作式”与“JVM 在可中断阻塞时会转成异常”这两点。 和 有什么区别?请给出何时用哪一个。标准答案: 是静态方法,检查“当前线程”的中断状态并清除它; 检查指定线程的中断状态且不清除。在库方法内部若要检查并消费当前线程的中断通常用 ;想查看别的线程是否被请求
2025-12-20 11:23:23
570
原创 Java四种线程创建方式
Java 创建线程有四种方式:继承 Thread、实现 Runnable、实现 Callable 结合 Future、以及使用线程池。实际开发中推荐使用线程池 + Runnable/Callable,避免直接创建线程。
2025-12-19 20:04:56
938
原创 JVM-垃圾回收
垃圾回收(Garbage Collection, GC)是自动管理内存的一种机制,它负责自动释放不再被程序引用的对象所占的内存,这种机制减少了内存泄漏和内存管理错误的可能性。垃圾回收有以下几种方式:内存不足时:当JVM检测到堆内存不足,无法为新的对象分配内存时,会自动触发垃圾回收。手动请求:虽然垃圾回收是自动的,开发者可以通过调用或建议 JVM 进行垃圾回收。不过这只是一个建议,并不能保证立即执行。JVM参数-Xmx(最大堆大小)、-Xms(初始堆大小)等。对象数量或内存使用达到阈值。
2025-12-19 14:23:39
1133
原创 SpringCloud-Feign客户端实战
Feign 注解对照表| 注解 | 作用 | 示例 | |------|------|------|@FeignClient | 声明Feign客户端 | @FeignClient(value="xxx", url="xxx")@GetMapping | GET请求 | @GetMapping("/path")@PostMapping | POST请求 | @PostMapping("/path")@RequestParam | URL查询参数 |?key=value。
2025-12-19 10:48:25
234
1
原创 @Configuration(Spring)详解让你懂它是什么、怎么用、常见坑与面试点
用来定义,用@Bean方法声明 Spring 管理的 Bean;Spring 会把它当作配置信息并用 CGLIB 动态代理(默认)处理,从而保证@Bean方法的单例语义与依赖注入正确。下面分条讲清楚你必须掌握的点(配合例子和常见面试问答)。
2025-12-18 15:51:10
1364
原创 四种脱敏方法
你在 Word 里把文字标红。像你用 PS 手动打马赛克。用模板 + 剪刀,一剪就好。银行柜台后面已经贴了磨砂膜。打印机看到红色,自动打码。这是手机号 / 身份证。
2025-12-18 10:24:48
305
原创 @Value(Spring)的全面讲解 — 让你真会用它
Value是提供的注解(),用来把外部的配置值或 SpEL(Spring Expression Language)表达式注入到 Spring 管理的 bean 中。简单、灵活,适合注入单个值。但也有坑和替代方案(比如下面把常见用法、机制、技巧、陷阱与最佳实践都讲清楚,附带实战例子。
2025-12-17 20:55:46
1719
原创 Entity、VO、DTO、Form问答检验?
1. 用户能看到什么,VO 就返回什么2. 必须对敏感信息脱敏3. 可以有前端需要的计算字段4. 只在 Controller 返回时使用。
2025-12-17 14:40:00
1011
原创 Spring IOC 和 AOP 的区别
IOC关注的是对象的管理和解耦,使用依赖注入来管理对象的生命周期和相互依赖。AOP关注的是对业务逻辑的增强,通过切面技术将横切关注点(如日志、事务等)与核心业务逻辑分离,使得代码更加简洁、清晰。这两个概念并不冲突,实际上,Spring 中的 AOP 就是基于 IOC 容器的,它依赖 IOC 容器来管理切面对象和目标对象,并通过动态代理的方式进行织入。希望这个解释能帮助你更清楚地理解Spring IOC和AOP之间的区别。
2025-12-17 11:53:56
1209
原创 Java设计模式-命令模式
所有的命令都需要实现一个命令接口,包含一个execute()方法。:每个具体的命令(比如下单、撤销订单)都需要实现命令接口。:这些类是命令的实际执行者(如餐厅的服务员、厨师等)。:负责调度命令并保存命令以支持撤销功能。
2025-12-16 18:21:21
233
原创 JVM-类初始化和类加载
开发者可以根据需求定制类的加载方式,比如从网络加载class文件、数据库、甚至是加密的文件中加载类等。自定义类加载器可以用来扩展Java应用程序的灵活性和安全性,是Java动态性的一个重要体现。这些类加载器之间的关系形成了。
2025-12-16 16:44:14
844
原创 Entity类转换为VO类
基础项目:使用第 2 种方式(Builder 模式 + 静态工厂方法)复杂项目:使用第 4 种方式(MapStruct 自动化转换)关键点确保敏感字段不暴露脱敏处理要完整状态转换要清晰提供方便的转换方法。
2025-12-16 14:57:37
306
原创 Entity、VO、DTO、Form 对象详解
在项目中,我们使用不同的对象模型来处理不同场景的数据,这是分层架构的重要体现。为什么需要多种对象?🔐安全性:防止敏感数据泄露🎯职责分离:每个对象只关注自己的职责🔄灵活性:不同层可以独立演化🛡️解耦:数据库变动不影响前端Entity是与数据库表一一对应的 Java 对象,也叫持久化对象。🗄️ 对应数据库表结构📦 包含所有字段(包括敏感字段)🔗 包含数据库注解(如 @Table、@Column)💾 只在 DAO/Mapper 层使用VO是返回给前端。
2025-12-14 22:27:03
789
原创 拦截器注册InterceptorRegistry 实现讲解
将我们自定义的 AuthInterceptor 注册到 Spring MVC。这样配置后,所有访问 /api/** 的请求都会经过。提供的拦截器注册器,用于配置拦截器的拦截规则。即使这些路径匹配 /api/**,也不会被拦截。的验证,除了登录和注册接口可以直接访问。Spring 会自动扫描并加载这个配置。告诉 Spring 这是一个配置类。如果没有这个注解,配置可能不会生效。** 表示匹配任意多级路径。排除不需要登录验证的接口。指定拦截器要拦截的路径。
2025-12-14 20:36:13
298
原创 Java自定义业务异常类
/ RespStatus枚举示例SUCCESS(200, "成功"),ERROR(500, "系统错误"),USER_NOT_FOUND(404, "用户不存在"),PARAM_ERROR(400, "参数错误"),FORBIDDEN(403, "无权限访问");// 构造方法、getter...// 使用示例这个BusinessException类是业务异常的统一封装,通过:标准化错误码和消息格式支持多种构造方式便于全局异常处理。
2025-12-14 18:20:49
275
原创 @Data
Data是Lombok// 当你写 @Data 时,Lombok 自动为你生成:// 1. getter 方法 - 所有字段// 2. setter 方法 - 非 final 字段// 3. equals() 方法 - 比较对象内容// 4. hashCode() 方法 - 哈希值计算// 5. toString() 方法 - 字符串表示// 6. 构造方法(所有字段)- 如果类没有其他构造方法@Data@Getter@Setter@ToString异常类通常只需要 getter。
2025-12-13 17:27:17
466
原创 简单业务异常类
二、稍微丰富版本(推荐)三、配合枚举使用四、实际使用例子五、全局异常处理六、总结要点最简写法(记住这个就行):使用三部曲: 定义异常类(上面代码)在需要的地方抛出 全局处理(返回统一格式):参数错误:未登录:无权限:不存在:系统错误
2025-12-12 16:34:37
176
原创 ApiInterceptorImpl - 用户认证拦截器(核心)
这个是一个经典的**“AOP(面向切面编程)”**思想的落地实践。它把“登录校验”这个非业务逻辑从 Controller 中剥离出来,统一管理,既安全又优雅。只有配合上这两个“绿叶”,ApiInterceptorImpl这朵“红花”才能真正跑起来。这是配套的自定义注解 (@LoginAuth和上下文工具类 (的标准生产级代码。这套组合拳()是 Java 后端开发中最经典的设计模式之一。Annotation负责定义“规则”。负责执行“规则”并填充数据。负责存储“数据”供后续使用。
2025-12-12 13:22:25
546
原创 SpEL详解
SpEL 是什么?是代码运行时的“计算器”。怎么用?用引用变量,用访问属性。怎么学好?记住它就是利用反射,把你的字符串变成了 Java 代码在运行。这是“对外接口”,定义开发者怎么用。/*** 锁的 Key,支持 SpEL 表达式* 例如:"{#user.id}" 或 "user:{#user.mobile}"*//*** 过期时间 (演示用)*/
2025-12-12 09:20:40
764
原创 Spring 的事务传播行为(Propagation)
传播行为A 有事务时 B 的行为A 挂了,B 怎么办?B 挂了,A 怎么办?典型应用场景REQUIRED(默认)加入 AB 回滚A 回滚绝大多数业务逻辑 (90%)挂起 A,B 开新事务B 不回滚(早已提交)A 可选择不回滚(需 try-catch)审计日志、发送流水NESTED在 A 中建保存点B 回滚 (陪葬)A 可选择不回滚 (回滚到保存点)复杂业务流中尝试性的步骤SUPPORTS加入 AB 回滚A 回滚只读查询挂起 A,B 以非事务运行发送短信/邮件等耗时且非库操作。
2025-12-11 22:34:19
569
原创 Spring 事务失效
失效场景根本原因解决方案同类内部调用绕过了 Spring 代理对象,使用了this注入自己 () 或 拆分 Service自己 try-catch异常未抛出,AOP 捕获不到throw e或 手动设置异常类型不对默认只回滚使用非 public 方法AOP 代理限制确保方法是public。
2025-12-11 18:51:09
913
原创 @Order-AOP 的执行顺序
Order(数字):数字越小,越在外层。执行顺序->->方法->->。原则:越是基础、通用的功能(如权限、异常处理),Order 应该越小(越靠外)
2025-12-11 15:54:08
458
原创 AOP拦截第三方库
无法加注解时,使用execution表达式指定类名和方法名。前提条件:被拦截的第三方对象必须通过@Bean注册到 Spring 容器中,并且通过@Autowired使用。应用场景:数据库连接池监控(HikariCP)、HTTP 客户端请求日志(HttpClient/OkHttp)、JSON 序列化性能分析等。
2025-12-11 10:23:52
496
原创 Java-元注解 (Meta-Annotations)
划定界限,告诉编译器这个标签只能贴在方法上。:延长寿命,告诉 JVM程序运行时不要丢掉这个标签,因为我们的逻辑代码(如拦截器)需要读取它。
2025-12-10 16:09:44
861
原创 ThreadLocal内存泄漏机制
由于线程生命周期(尤其是线程池)与对象生命周期不匹配,导致value对象被意外长生命周期引用而无法回收。关键在于理解四条引用链:线程 → ThreadLocalMap(强)ThreadLocalMap → Entry数组(强)Entry → value(强)Entry → key(弱)使用完ThreadLocal后,必须调用remove(),尤其是在线程池环境中。
2025-12-09 15:01:07
335
原创 JVM-内存模型
根据 JDK 8 规范,JVM 运行时内存共分为虚拟机栈、堆、元空间、程序计数器、本地方法栈五个部分。程序计数器:可以看作是当前线程所执行的字节码的行号指示器,用于存储当前线程正在执行的 Java 方法的 JVM 指令地址。如果线程执行的是 Native 方法,计数器值为 null。是唯一一个在 Java 虚拟机规范中没有规定任何 OutOfMemoryError 情况的区域,生命周期与线程相同。Java 虚拟机栈:每个线程都有自己独立的 Java 虚拟机栈,生命周期与线程相同。
2025-12-08 22:50:09
612
原创 MVC-三层架构详解
用户点击按钮↓前端发送HTTP请求↓Controller 接收请求(入口)↓Service 处理业务逻辑(您修改的地方 ⭐)↓Mapper 执行SQL语句↓Database 返回数据↓原路返回到前端。
2025-12-08 18:40:47
491
原创 Swagger的配置和使用
循序渐进:先配置基础Swagger,再逐步添加复杂注解实体优先:先给所有实体类添加@Schema注解,这是文档清晰的基础必填字段:务必通过或@NotNull标注必填参数示例值:所有example属性都要填写,这是文档可读性的关键环境隔离:使用确保生产环境不暴露API文档版本管理:API变更时及时更新文档版本号。
2025-12-08 15:14:50
424
原创 店铺分页查询优化:结合GEO地理位置排序
普通模式:当用户不提供坐标时,按数据库默认顺序返回分页结果距离优先模式:当用户提供坐标时,按距离从近到远返回分页结果@RequestParam("typeId") Integer typeId, // 必填:店铺类型@RequestParam(value = "current", defaultValue = "1") Integer current, // 页码,默认第1页@RequestParam(value="x",required=false) Double x, // 可选:用户经度。
2025-12-05 10:39:20
239
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅