- 博客(37)
- 收藏
- 关注
原创 Lombok全面解析
Lombok 是一个 Java 库,通过使用注解的方式,自动生成常见的样板代码,如 getter、setter、toString()、equals()、hashCode() 方法以及构造函数等,减少了开发者的重复工作。常见的 Lombok 注解包括 @Getter、@Setter、@ToString、@EqualsAndHashCode、@Builder、@Value 等,Lombok 使得 Java 开发者能够专注于业务逻辑的实现,而不必处理冗长的样板代码。
2025-07-28 17:59:07
946
原创 参数校验:spring-boot-starter-validation 使用指南
摘要:spring-boot-starter-validation是Spring Boot提供的验证工具,通过自动配置Java Bean Validation和Hibernate Validator实现数据校验。核心功能包括:1)提供常用验证注解如@NotNull、@Size等;2)支持实体类字段验证和方法参数验证;3)提供异常处理机制捕获验证错误;4)支持分组验证(@Validated)功能。使用时可添加Maven依赖,在实体类字段上添加验证注解,并在控制器方法使用@Valid/@Validated触发验
2025-07-23 18:04:05
365
原创 Http请求中的特殊字符
摘要:SpringBoot应用中GET请求传递包含特殊字符(如+)的参数时,+会被自动转换为空格。原因是URL编码规范将+视为空格替代符。解决方法包括:1)使用URLEncoder对参数预编码,服务端需解码两次;2)改用POST请求,通过请求体(application/json或x-www-form-urlencoded)传递参数可避免编码问题。POST方式能完整保留特殊字符,是更可靠的解决方案。
2025-07-18 17:52:26
679
原创 Java线程池
摘要:本文介绍了Java线程池的核心接口与实现。Executor是线程池基类,ExecutorService扩展了Executor,提供任务提交、关闭管理等功能。ThreadPoolExecutor是关键实现类,通过七大参数(核心/最大线程数、空闲时间、队列、拒绝策略等)精细控制线程池行为。文章详细解析了shutdown()、awaitTermination()和shutdownNow()等关键方法的使用场景及区别,并提供了线程池参数配置的常见示例和任务提交方式对比。
2025-07-18 14:26:48
752
原创 轻松驾驭Maven,打造高效Java项目
Maven是一个基于POM的Java项目管理工具,通过标准化项目结构和生命周期实现自动化构建和依赖管理。其核心包含三个生命周期:clean(清理)、site(文档生成)和默认生命周期(构建打包)。每个生命周期包含多个阶段,通过绑定插件目标实现具体功能。Maven通过pom.xml文件管理项目,关键元素包括坐标信息(groupId/artifactId/version)、依赖管理、构建配置等。支持继承机制,子项目可复用父POM配置,简化多模块项目管理。Maven还提供直接运行插件目标的能力,便于执行特定任务如
2025-07-17 11:27:50
1139
原创 Jackson:从入门到熟手,Java 处理 JSON 的终极指南
使用 Jackson 需要引入以下依赖jackson-annotations(Jackson 注解)jackson-core(Jackson 核心)建议始终使用 Maven 中央仓库中最新版本的 jackson-databind。this(null);super(t);@Override或者使用 @JsonSerialize 来注册自定义序列化器...this(null);@Override。
2025-07-15 13:41:29
1319
原创 Python模块与包
当你退出 Python 解释器并重新进入时,之前定义的函数和变量会丢失。因此,如果你要编写较长的程序,最好使用文本编辑器准备代码,并通过脚本方式将其传递给 Python 解释器来执行,这样你可以避免每次重新定义的麻烦。随着程序变得更加复杂,可能需要将代码拆分为多个文件,这样不仅有助于维护,还能提高代码的可重用性。比如,如果你有一些常用的函数,可以把它们独立封装,在多个程序中导入使用,而无需重复编写相同的代码。为了支持这种编程方式,Python 提供了模块。
2025-07-11 15:24:43
919
原创 Python中的下划线
单个下划线 _ 前缀用于表示,即这些成员是类的内部实现,通常不应直接访问。这是一个 约定俗成的规则,并不具备实际的访问限制。
2025-07-11 13:45:39
859
原创 Python 闭包和装饰器
嵌套函数嵌套函数嵌套函数是指在一个函数内部定义另一个函数。Python 支持这种函数嵌套的特性,能够增强函数的灵活性、封装性和模块化,尤其在实现等功能时经常用到。嵌套函数的定义一个嵌套函数就是在另一个函数内部定义的函数。内部函数通常只能在外部函数的作用域内访问,但外部函数可以调用并返回内部函数。嵌套函数的作用域嵌套函数有其自己的作用域,也能够访问外部函数的作用域中的变量。:内部函数可以直接访问外部函数定义的变量。:外部函数通常不能访问内部函数的局部变量,除非通过返回或参数传递。
2025-07-11 11:18:10
714
原创 从函数开始探索Python编程
本文介绍了Python函数的核心概念,包括函数定义、参数传递、作用域、参数类型、返回值、默认参数、可变参数、特殊参数(仅位置/仅关键字参数)以及lambda表达式。重点讲解了参数传递机制(对象引用传递)、默认参数的注意事项、如何使用*args和**kwargs处理不定长参数,以及如何通过函数注解提供元数据。文章还强调了文档字符串的重要性,并提供了函数定义和调用的实用示例。这些内容涵盖了Python函数编程的关键知识点,适合开发者系统学习函数的使用技巧和最佳实践。
2025-07-09 16:03:57
959
原创 HTTP Content-Type
MIME类型是互联网上标识文件格式的标准方法,由主类型和子类型组成(如text/plain)。常见类型包括:text类(纯文本、HTML等)、application类(JSON、XML、二进制数据等)、multipart类(表单数据分段传输)以及媒体类(图片、音频、视频)。其中multipart/form-data用于文件上传,通过boundary分隔不同数据块。MIME类型通过Content-Type标头告知接收方如何处理数据,是网络通信中的重要标识标准。
2025-07-08 14:21:29
755
原创 HTTP 重定向
重定向循环是指一个页面不断地被重定向到另一个页面,而新的页面又重定向回原来的页面,形成一个无法结束的循环,导致无法访问任何页面。是服务器向客户端(通常是浏览器)发出的指令,告诉客户端某个请求的资源已被移到新的位置。所代表的重定向类型,用于告知客户端和搜索引擎,某个资源已永久迁移到新位置。这些重定向的关键在于。用于告诉客户端某个资源当前无法从原位置访问,但可以通过临时的另一个 URL 来访问。用于缓存验证,告诉客户端缓存的资源未被修改,可以继续使用本地缓存。,也不应将新的 URL 视为资源的永久位置。
2025-07-07 16:22:06
386
原创 HTTP Cookie
Cookie是Web服务器发送到浏览器的小数据片段,用于在HTTP请求间保持状态(如登录信息、用户偏好)。它解决了HTTP无状态的问题,通过会话ID实现身份验证。Cookie可设置过期时间(expires/max-age),未设置则浏览器关闭时删除。相比LocalStorage(5MB,仅客户端)和SessionStorage(会话级),Cookie(约4KB)会自动随请求发送到服务器。安全性方面,建议启用HttpOnly(防XSS)、Secure(HTTPS传输)和SameSite(防CSRF)属性。现代
2025-07-07 15:54:03
764
原创 如何用 Mockito 玩转单元测试
当我们需要测试某个类的功能时,但又不希望依赖其外部组件或复杂的对象时,可以使用 Mockito 来创建模拟对象,这些模拟对象可以控制方法返回值、抛出异常或执行特定的逻辑。stubbing 是模拟(mock)对象行为的过程,指的是为模拟对象的方法调用提供预定义的返回值或行为。Mockito 是一个广泛使用的 Java 测试框架,它提供了简洁而强大的功能,用于模拟(mock)和验证对象的行为,尤其是在单元测试中。Stubbing 是指通过明确的指令为模拟对象的方法调用提供预定义的返回值或行为。
2025-07-07 11:22:53
1292
原创 RestTemplate实战
摘要:Spring的RestTemplate是一个同步HTTP客户端工具,简化了RESTful API调用过程。它提供了getForObject、postForEntity等常用方法,支持JSON/XML等多种数据格式处理。文章介绍了GET/POST等HTTP操作示例,对比了RequestEntity和ResponseEntity的区别,并展示了如何配置超时时间和添加JWT认证拦截器。RestTemplate适合轻量级应用,开发者只需掌握核心方法即可满足日常开发需求。
2025-07-05 09:57:35
1103
原创 HTTP 缓存
通常,响应是基于请求的 URL 来区分的,但在很多情况下,相同的 URL 可能会根据不同的请求头(如 Accept、Accept-Language、Accept-Encoding、User-Agent 等)返回不同的内容。也就是说,客户端会检查缓存中的响应是否已过时,如果响应已被更新,服务器将返回最新的内容。虽然启发式缓存在很多情况下都能够提高性能,但在可能的情况下,建议开发者通过适当的缓存头(如 Cache-Control、Expires 和 ETag)来明确指定缓存策略,以确保缓存的准确性和一致性。
2025-07-04 11:49:07
1043
原创 HTTP 压缩
浏览器会发送一个 Accept-Encoding 头,标明其支持的算法及优先级顺序,服务器根据该信息选择一种算法,用于压缩响应体,并通过 Content-Encoding 头部告诉浏览器选用的压缩算法。随着时间的推移,压缩算法不断得到优化,新的高效算法也逐渐被客户端和服务器所支持。端到端压缩指的是由服务器完成的消息正文压缩,这一过程在数据从服务器到达客户端的整个传输过程中保持不变。目前,最常用的两种压缩算法是。对于有损压缩,通常可以根据需要调整压缩的程度,压缩越多,质量可能越差,反之则质量更高。
2025-07-04 10:24:33
393
原创 HTTP 请求方法
HTTP方法定义了客户端与服务器的交互方式,常见方法包括GET(获取数据)、POST(创建数据)、PUT(全量更新)、PATCH(部分更新)、DELETE(删除数据)、HEAD(获取元数据)、OPTIONS(预检请求)、CONNECT(建立隧道)和TRACE(调试)。每种方法对应不同操作,具有不同的幂等性和请求体要求。HTTP消息由起始行(方法/状态码)、标头(元数据)、空行和正文(数据)组成。OPTIONS用于跨域预检,CONNECT建立加密隧道,TRACE用于诊断请求路径。理解这些方法的差异对于开发RE
2025-07-03 17:19:26
1292
原创 Java 原生 HTTP Client
Java 11引入的HttpClient是标准HTTP客户端库,支持同步/异步请求和HTTP/1.1/2协议。核心组件包括HttpClient(配置连接参数)、HttpRequest(构建请求)和HttpResponse(处理响应)。提供BodyHandlers处理不同响应类型,支持基本认证流程。同步请求会阻塞线程,异步请求通过CompletableFuture实现非阻塞调用,适合高并发场景。该API简化了HTTP通信,是Java网络编程的重要工具。
2025-07-03 13:55:35
1427
原创 [工具系列] 开源的 API 调试工具 Postwoman
Hoppscotch是一款开源的API测试工具,作为Postman的轻量替代品,提供核心功能而不需登录。主要功能包括多种HTTP请求类型支持、请求参数与头部设置、响应数据分析、环境变量管理以及脚本编写(Pre-request和Post-request)。特别适合个人开发者进行API测试,支持环境切换、历史记录和WebSocket测试,并允许通过MIT许可证自由使用。其直观界面和开源特性使其成为小型团队的高效选择。
2025-07-02 15:00:30
1090
原创 [springboot系列] 探秘JUnit 5: Java单元测试利器
JUnit5是Java单元测试框架的最新版本,由JUnit Platform、Jupiter和Vintage三个子模块组成。Jupiter模块提供核心测试功能,包含@Test、@BeforeEach等注解。新特性包括参数化测试(@ParameterizedTest)、条件执行(@EnabledIf)、自定义显示名称(@DisplayName)等。JUnit5通过@ExtendWith支持扩展机制,改进断言API(Assertions)和异常测试(assertThrows)。相比JUnit4,它采用模块化架构
2025-06-30 20:53:26
715
原创 [python系列] Leetcode刷题必备Python基础知识
Python 3 对整数类型使用了 大数算法,因此 整数类型(int)并没有固定的上限或下限,其时间复杂度主要与整数的位数(即数字的大小)相关。Number(数字)、String(字符串)、Bool(布尔)、Tuple(元组);它比较的是对象的 内存地址,即是否指向同一个对象。=, <, >, <=, >=):O(min(n, m))not:取反运算,True 变 False,False 变 True。运算符会遍历对象中的所有元素来比较它们的值。id() 返回一个 整数值,表示对象的内存地址。
2025-06-27 14:09:30
1064
原创 [redis系列] redis info命令
INFO 是 Redis 提供的一个命令,用于查看当前 Redis 服务器的各种运行状态信息。执行 INFO 命令后,会返回一个结构化的文本,每部分提供了对应的系统指标或运行数据,这些信息对于监控 Redis 性能、排查故障以及理解 Redis 的内部状态非常有帮助。used_memory_rss Redis 实际从系统申请的内存(常大于 used_memory)used_cpu_sys Redis 主进程在内核态使用的 CPU 时间(秒)展示各个命令的调用次数和平均执行时间,可以帮助识别高频或慢命令。
2025-06-26 10:55:16
1164
原创 [python系列] 创建虚拟环境 venv
Python虚拟环境(如venv)为项目提供隔离的运行环境,包含独立的Python解释器、依赖管理和包安装空间。其核心价值在于避免包版本冲突、提高项目移植性、保持系统环境整洁以及支持多版本测试。创建虚拟环境后,可通过激活环境或直接指定路径两种方式使用。激活模式下终端会显示环境名,所有操作都限制在该环境中;推荐直接调用虚拟环境路径执行命令更便捷。删除时只需移除对应文件夹即可,不影响其他项目。虚拟环境是Python开发中管理依赖和确保项目稳定性的最佳实践。
2025-06-25 14:25:23
969
原创 [redis系列] 发布订阅 Pub/Sub
Redis 的发布/订阅(Pub/Sub)模式允许发布者通过通道广播消息,发布者不关心是否有订阅者;订阅者根据兴趣接收相关消息,而无需了解具体的发布者。这种机制通过将发布者和订阅者解耦,使得它们不直接依赖于对方,大大提高了系统的扩展性。
2025-06-24 17:58:19
685
原创 [springboot系列] 过滤器和拦截器
过滤器(Filter)是 Servlet 规范中的组件,运行在 Servlet 容器中,可对所有 HTTP 请求进行预处理和后处理(如编码设置、跨域配置),依赖Servlet API且执行时机最早;拦截器(Interceptor)是 Spring MVC 框架的组件,仅拦截 Controller 层请求,可获取 HandlerMethod 信息(如方法参数、注解),适合权限验证、日志记录等业务层面的拦截。
2025-06-24 11:22:56
1216
原创 [redis系列] redis脚本
Redis Lua 脚本功能使得用户能够在 Redis 服务器端执行自定义的 Lua 脚本,从而实现更高效、更灵活的数据操作。Lua 脚本运行在 Redis 服务器内部,这意味着你可以减少客户端与服务器之间的通信开销,并且可以通过原子操作确保多个 Redis 命令的执行一致性。组合功能:Lua 脚本能够将 Redis 中的简单命令组合起来,从而实现复杂的业务需求,避免多次网络往返。数据操作原子性:通过 Lua 脚本,开发者可以在 Redis 中执行应用程序逻辑,对多个键进行条件更新。
2025-06-20 13:34:07
1238
原创 [redis系列] redis事务
Redis 的单个命令是原子性的,要么执行成功,要么执行失败,不会出现并发干扰的问题。然而,当涉及到多个命令时,为了确保它们作为一个不可分割的操作序列执行,就需要依赖 Redis 的事务特性,其核心命令包括 MULTI、EXEC、DISCARD 和 WATCH。
2025-06-19 11:32:07
796
原创 [redis系列] redis单线程 vs 多线程
Redis 在早期的版本中是 单线程架构,而从 Redis 6.x 开始,Redis 引入了一些多线程机制,但依然保持了单线程的主业务逻辑。
2025-06-18 16:11:49
885
原创 [redis系列] 目录
Redis 是一个高效的内存数据存储系统,提供多种数据结构,如字符串、哈希、列表、集合、有序集合等,每种结构都有对应的操作命令。它支持强大的功能,如事务处理、脚本执行、发布/订阅模式以及高可用集群架构(Redis Sentinel 与 Redis Cluster)。此外,Redis 提供灵活的过期策略与持久化机制(RDB 和 AOF),广泛应用于缓存、消息队列、实时分析等场景。
2025-06-13 16:05:17
187
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人