- 博客(201)
- 收藏
- 关注
原创 使用 Jasypt 加密数据库名和密码
Jasypt (Java Simplified Encryption) 是一个 Java 库,提供了简单易用的加密功能,可以安全地加密配置文件中的敏感信息,如数据库凭据。Gradle2. 生成加密后的密码方法一:使用命令行工具方法二:使用 Java 代码3. 配置 Spring Boot 应用application.propertiesapplication.yml4. 生产环境密钥管理方法一:通过环境变量方法二:通过系统属性
2025-10-19 22:10:42
246
原创 使用线程池更新阅读次数
这段代码通过线程池异步处理和Redis 缓存的结合,高效解决了高并发场景下文章浏览量更新的性能问题,同时通过初始化逻辑保证了数据一致性,是典型的 “异步 + 缓存” 优化方案,广泛应用于博客、电商等需要统计访问量的系统。
2025-10-16 21:36:54
349
原创 ThreadLocal 内存泄漏
ThreadLocalMap 中 Value 的强引用无法被切断,且线程长期存活。解决的核心是 “使用完必清理”—— 通过finally块强制调用remove(),确保 Value 能被 GC 回收。只要遵循这个原则,ThreadLocal 就是安全的线程私有数据存储工具,广泛应用于 “线程隔离” 场景(如 Spring 事务管理、用户上下文传递等)。
2025-10-16 21:26:53
273
原创 统一异常处理
这段代码是 Spring 项目中实现全局异常处理的基础框架,通过和实现了异常的统一捕获和响应,确保了系统异常处理的规范性、安全性和可维护性。实际开发中可根据业务需求扩展,实现更精细的异常分类处理。
2025-10-16 19:57:50
320
原创 BeanUtils
无论哪个库的BeanUtils,核心能力都围绕JavaBean 的属性操作属性拷贝:将一个对象的属性值复制到另一个对象(同名属性)。属性访问:通过属性名动态获取或设置对象的属性值。类型转换:在属性拷贝或设置时自动处理不同类型之间的转换(如 String 转 Integer)。对象比较:比较两个对象的属性值是否相等。BeanUtils是对象属性操作的实用工具,Spring 版本轻量高效,适合简单拷贝场景;Apache 版本功能丰富但性能较差,适合需要复杂类型转换的场景。
2025-10-16 19:42:55
471
原创 优雅的缓存?
AOP 自定义缓存的核心思想是:通过切面(Aspect)拦截被特定注解标记的方法,在方法执行前先查询缓存,若缓存存在则直接返回;若缓存不存在,则执行原方法,再将结果存入缓存。整个过程对业务代码完全透明。自定义缓存注解:标记需要缓存的方法,可配置缓存过期时间、缓存名称等参数。切面类(Aspect):通过 AOP 环绕通知(@Around)拦截方法调用,实现缓存的读取、写入逻辑。缓存容器:通常使用 Redis、Caffeine 等作为底层缓存存储(本文以 Redis 为例)。
2025-10-16 19:03:34
660
原创 优雅的日志?
创建自定义日志注解定义 AOP 切面类,编写日志记录逻辑在需要记录日志的方法上使用自定义注解配置 AOP 使其生效/*** 自定义日志注解*/@Target({ElementType.METHOD}) // 注解只能用于方法上@Retention(RetentionPolicy.RUNTIME) // 注解在运行时有效@Documented // 生成文档/*** 操作模块*//*** 操作描述*/
2025-10-16 16:11:24
348
原创 用户密码加密(MD5 哈希计算)
在 Apache Commons Codec 中,md5Hex// 处理字符串(默认使用UTF-8编码转换为字节数组)// 处理字节数组// 处理输入流(如文件流)
2025-10-16 15:07:03
370
原创 MP如何分页?
当需要复杂 SQL(如多表联查、自定义 WHERE 语句)时,可通过 Mapper 接口自定义方法,配合IPage实现分页。步骤示例Mapper 接口:定义方法,参数为IPage<实体类>和条件参数// 方式 1:通过注解写自定义 SQL(简单联查)"${ew.customSqlSegment}") // ${ew.customSqlSegment} 自动拼接条件(来自 QueryWrapper)
2025-10-15 18:48:44
524
原创 Mybatis动态语句
经常遇到很多按照很多查询条件进行查询的情况,比如智联招聘的职位搜索等。其中经常出现很多条件不取值的情况,在后台应该如何完成最终的SQL语句呢?动态 SQL 是 MyBatis 的强大特性之一。如果你使用过 JDBC 或其它类似的框架,你应该能理解根据不同条件拼接 SQL 语句有多痛苦,例如拼接时要确保不能忘记添加必要的空格,还要注意去掉列表最后一个列名的逗号。利用动态 SQL,可以彻底摆脱这种痛苦。
2025-10-11 15:32:01
592
原创 MyBatis多表映射
setting属性属性含义可选值默认值指定 MyBatis 应如何自动映射列到字段或属性。NONE 表示关闭自动映射;PARTIAL 只会自动映射没有定义嵌套结果映射的字段。FULL 会自动映射任何复杂的结果集(无论是否嵌套)。PARTIAL我们可以将autoMappingBehavior设置为full,进行多表resultMap映射的时候,可以省略符合列和属性命名映射规则(列名=属性名,或者开启驼峰映射也可以自定映射)的result标签!--开启resultMap自动映射 -->
2025-10-11 15:21:22
613
原创 MyBatis基本使用
数据输出总体上有两种形式:- 增删改操作返回的受影响行数:直接使用 int 或 long 类型接收即可- 查询操作的查询结果我们需要做的是,指定查询的输出数据类型即可!并且插入场景下,实现主键数据回显示!
2025-10-11 13:25:42
864
原创 springboot与spring MVC中的控制器
注解作用示例通用映射,可指定路径、HTTP 方法等专门处理 GET 请求(的简化)专门处理 POST 请求专门处理 PUT 请求(通常用于更新资源)专门处理 DELETE 请求(通常用于删除资源)核心作用:控制器是处理 HTTP 请求的入口,负责接收请求、调用业务逻辑、返回响应。Spring MVC:以为核心,可返回视图(传统 MVC)或数据(需),需手动配置 Web 组件。:以为核心(默认返回 JSON),通过自动配置简化开发,更适合前后端分离场景。
2025-10-10 21:39:13
871
原创 Spring Boot中Spring MVC各个组件的工作机制
通过自动配置简化基础组件(如映射器、适配器、转换器)的注册,通过注解驱动(如)快速绑定请求与处理逻辑,通过拦截器和全局异常处理器实现横切关注点。整个流程围绕 “请求→映射→解析→处理→响应” 的生命周期,各组件分工明确,既保留了 Spring MVC 的灵活性,又通过自动配置降低了使用门槛。
2025-10-10 21:15:15
713
原创 TCP与UDP
TCP 是 “可靠的连接主义者”:牺牲速度和灵活性,换取数据的绝对可靠,适合 “数据不能错” 的场景。UDP 是 “高效的无政府主义者”:牺牲可靠性,换取速度和低开销,适合 “延迟不能高” 的场景。实际应用中,二者并非对立关系,很多系统会结合使用(如 HTTP/3 基于 UDP 实现,但通过 QUIC 协议叠加了 TCP 的可靠性特性,兼顾实时性和可靠性)。
2025-10-10 20:41:31
649
原创 跨域请求CORS
浏览器的 “同源” 指的是两个 URL 的协议、域名、端口三者完全一致。与:不同源(协议不同,http vs https)。与:不同源(域名不同,主域 vs 子域)。与:不同源(端口不同)。当一个请求的发起源(如浏览器中当前页面的 URL)与目标资源的 URL不同源时,该请求即为跨域请求。页面(前端)向(后端 API)发起 AJAX 请求,因端口不同,属于跨域。跨域请求的本质是浏览器同源策略的限制,核心解决方案围绕 “绕开限制”(如 JSONP、代理)或 “告知浏览器允许跨域”(如 CORS)展开。
2025-10-10 20:02:11
345
原创 Tomcat优化
Tomcat 优化的核心是 “匹配业务场景低并发应用:重点优化 JVM 内存和基础配置。高并发 API 服务:启用 NIO2/APR 协议、优化线程池、结合 Nginx 负载均衡。静态资源多的应用:通过 Nginx 分离静态资源,启用 HTTP/2 和缓存。结合监控工具持续调优,才能实现 Tomcat 性能最大化。
2025-10-10 19:58:58
865
原创 TCP三次握手四次挥手
三次握手:通过三次交互确认双方收发能力正常,协商初始序列号,建立可靠连接,核心解决 “失效连接请求” 问题。四次挥手:因全双工特性,双方需分别关闭发送通道,通过四次交互确保数据传输完成,核心解决 “双向关闭” 的可靠性问题。这两个过程是 TCP “可靠性” 和 “连接导向” 特性的直接体现,也是理解 TCP 协议的基础。
2025-10-10 19:50:17
533
原创 Netty与Tomcat
Netty 是 “网络通信的工具包”:专注于底层网络通信的高效处理,适合需要自定义协议、追求极致性能的场景(如中间件、RPC、游戏服务器)。Tomcat 是 “Web 应用的运行容器”:专注于 HTTP/Servlet 规范的实现,适合部署常规 Web 应用,无需开发者关心网络细节,但受限于 Web 规范。
2025-10-10 19:44:20
780
原创 Netty 高性能与线程模型
主从 Reactor 模型实现高效并发处理;自定义 ByteBuf 与零拷贝机制减少内存开销;事件驱动与责任链模式提升事件处理效率;底层优化规避 NIO 缺陷,最大化利用操作系统资源。这些特性使得 Netty 能够在高并发场景下(如每秒数万连接、百万级消息吞吐量)保持低延迟和高吞吐量,成为 Java 网络编程的事实标准。
2025-10-10 19:40:25
915
原创 BIO、NIO、AIO
BIO(Blocking IO)是最传统的 I/O 模型,所有 I/O 操作都是阻塞的:当线程执行read()或write()等 I/O 操作时,会被挂起(阻塞),直到数据准备完成(读操作)或数据写入完成(写操作)后才继续执行。NIO(Non-blocking IO,Java 1.4 引入,也称为 New IO)是同步非阻塞 I/O 模型:线程发起 I/O 操作后无需阻塞等待,可继续执行其他任务;当数据就绪时,线程再回来处理 I/O 操作。
2025-10-10 19:26:09
631
原创 HTTP与 HTTPS
HTTP:基于 TCP 的明文传输协议,用于在客户端和服务器之间传输超文本(如 HTML、图片等),不提供数据加密和身份验证,数据在传输过程中可能被窃听、篡改或伪造。HTTPS:并非独立协议,而是 “HTTP + SSL/TLS” 的组合,通过 SSL(Secure Sockets Layer)或其继任者 TLS(Transport Layer Security)协议对 HTTP 传输的数据进行加密、身份验证和完整性校验,确保传输过程的安全性。
2025-10-10 18:36:45
499
原创 计算机网络原理
(理论模型):物理层 → 数据链路层 → 网络层 → 运输层 → 会话层 → 表示层 → 应用层。:GET(获取资源)、POST(提交数据)、PUT(更新资源)、DELETE(删除资源)等。(实际应用):网络接口层(物理 + 数据链路) → 网络层 → 运输层 → 应用层。:无状态(每次请求独立)、基于 TCP 的应用层协议。
2025-10-10 18:21:57
510
原创 Git使用
确实会 “改写提交历史”:它将当前分支的提交 “嫁接” 到目标分支的最新提交之后,形成线性历史(而非 merge 的分叉历史)。:不会生成新提交,而是将当前分支的提交 “重播” 到目标分支上,形成线性历史(看起来像所有开发都在一条线上进行)。(包括工作区和暂存区),仅建议在确定本地修改无用时使用(如 “完全放弃本地,强制同步远程”)。:会生成一个新的 “合并提交”,保留原分支的分叉历史(清晰展示分支并行开发过程)。分出(当开发完成,准备发布时),仅修复发布前的小 Bug,不开发新功能。
2025-10-09 15:56:53
366
原创 JVM的内存分区
线程私有区域(程序计数器、虚拟机栈、本地方法栈):随线程创建 / 销毁,内存管理简单,无需 GC;线程共享区域(Java 堆、方法区):存放共享数据(对象、类信息等),是 GC 的主要管理对象,内存管理复杂。
2025-10-08 21:27:12
663
原创 Redis分片集群哈希槽
哈希槽是 Redis Cluster 实现分布式存储的核心机制,通过 “16384 个固定槽位 + 键的哈希映射”,解决了数据分片、节点扩缩容、负载均衡等关键问题。其设计既保证了分布式系统的灵活性,又简化了客户端和集群的交互逻辑,是 Redis 集群高可用、高扩展能力的基础。
2025-10-08 20:51:53
506
原创 Java异常体系
维度及其子类(非受检)其他受检异常(如编译时检查不强制处理(无需try-catch或throws强制处理(必须try-catch或throws本质程序逻辑错误(可通过编码避免)外部环境异常(代码正确也可能发生)典型示例处理原则优先通过逻辑避免,而非try-catch必须处理,确保异常场景下程序可控写出更健壮的代码—— 对于逻辑错误,通过规范编码消灭;对于外部风险,通过强制处理规避。
2025-10-08 20:29:13
444
原创 Redis持久化
Redis 持久化是指将内存中的数据持久化到磁盘,防止因 Redis 服务重启、崩溃等情况导致数据丢失的机制。和,此外还支持两者结合的。
2025-10-08 11:42:58
406
原创 动态SQL
简化 SQL 拼接:无需手动处理条件为空时的语法错误(如多余的AND提高灵活性:根据参数动态生成不同 SQL,适应多场景查询 / 更新需求。增强安全性:结合#{}可防止 SQL 注入,比直接字符串拼接更安全。动态 SQL 是 MyBatis 应对复杂查询场景的核心能力,熟练使用可大幅提升数据库操作代码的质量。
2025-10-07 16:49:41
292
原创 SqlSession
SqlSession是 MyBatis 中连接应用与数据库的 “桥梁”,封装了 SQL 执行、事务管理和一级缓存等核心功能。其生命周期短暂且线程不安全,使用时需遵循 “创建 → 使用 → 关闭” 的流程,优先通过 Mapper 接口方式执行 SQL,以保证代码的可读性和可维护性。理解SqlSession的工作机制,有助于深入掌握 MyBatis 的底层原理和最佳实践。
2025-10-07 16:41:25
833
原创 MyBatis如何获取自动生成的(主)键值
自增主键(MySQL 等):数据库在插入时自动生成主键,MyBatis 通过通知 JDBC 驱动获取生成的主键,并通过回填到实体类。序列主键(Oracle 等):需手动先查询序列值(或@SelectKey),将其作为主键插入,同时回填到实体类,本质是 “先获取、再插入、后回填”。关键要求:实体类中对应主键的属性必须有setter 方法(MyBatis 通过反射回填值),否则无法获取主键。数据库类型配置方式核心配置适用场景XML / 注解自增主键(AUTO_INCREMENT)Oracle。
2025-10-07 16:22:09
662
原创 MyBatis中 #{}和${}
特性#{}${}处理方式预编译,替换为?直接字符串拼接SQL 注入风险无(安全)有(危险)类型处理自动添加引号和类型转换不处理,需手动添加引号适用场景大多数参数传递(条件、值等)动态 SQL 结构(表名、排序等)
2025-10-07 15:41:50
884
原创 Spring中常用的设计模式
工厂模式与单例模式支撑了 IOC 容器的 Bean 管理;代理模式是 AOP 实现的基础;模板方法模式简化了重复操作(如数据库访问);观察者模式支撑了事件驱动模型;适配器、装饰器、策略模式则增强了框架的兼容性和扩展性。
2025-10-07 15:16:48
650
原创 Spring
Spring 的本质是通过 IoC 实现对象解耦,通过 AOP 实现横切逻辑复用,并在此基础上提供了数据访问、Web 开发、事务管理等核心功能。其生态系统(如 Spring Boot、Spring Cloud)进一步降低了开发门槛,使其成为 Java 开发的事实标准。理解 Spring 的关键不在于记住 API,而在于掌握 “控制反转” 和 “面向切面” 的设计思想 —— 这些思想不仅适用于 Spring,也贯穿于整个软件工程的 “高内聚、低耦合” 原则中。
2025-10-07 15:02:38
665
原创 SpringMVC或SpringBoot中如何返回JSON数据
实际开发中常需自定义 JSON 格式(如日期格式化、忽略 null 值等),可通过 Jackson 注解或全局配置实现。通过或指定返回响应体;依赖消息转换器(默认 Jackson)将返回值序列化为 JSON;可通过注解或全局配置自定义 JSON 格式;推荐使用统一响应体和全局异常处理,规范接口格式。
2025-10-07 14:39:31
928
原创 Spring MVC 与 Spring Boot
Spring MVC 是 "工具":解决 Web 层的请求处理问题,是 Spring 生态的 Web 核心。Spring Boot 是 "加速器":基于 Spring MVC 等 Spring 组件,简化开发流程,让开发者更专注于业务逻辑而非配置。Spring Boot = Spring MVC + 自动配置 + 起步依赖 + 嵌入式服务器 + ...,它是使用 Spring MVC 的最佳实践方式。
2025-10-07 12:11:23
646
原创 Spring MVC 与 Spring Boot 详解
Spring MVC 是 "骨架":负责 Web 层的请求处理,是 Spring 生态处理 HTTP 的核心。Spring Boot 是 "自动化工具":基于 Spring MVC 等 Spring 组件,通过自动配置、起步依赖等特性简化开发,让开发者聚焦业务逻辑而非框架配置。是构建 Java Web 应用的主流方案。
2025-10-07 12:10:30
631
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅