- 博客(126)
- 收藏
- 关注
原创 RestTemplate 发送 JSON 请求时为何要手动序列化对象?
方式适用情况是否推荐FastJSON 环境,手动序列化✅ 推荐Jackson 生态,手动序列化✅ 推荐仅当默认支持 JSON 序列化⚠️ 可能有问题✅最佳实践:手动转换 JSON 字符串,避免误解析,确保为!
2025-03-12 10:27:29
291
原创 深入理解 `ParameterizedTypeReference`:解决 Java 泛型擦除问题
本文将深入解析 ParameterizedTypeReference。获取带有泛型的 HTTP 响应时,可能会遇到。正确解析带泛型的 JSON 数据。在 Java 中,泛型的实现采用。,导致 JSON 反序列化失败!,Spring 能够正确识别。正是用来解决这个问题的。希望这篇博客能帮助你理解。假设我们有一个 API。在 Java 中,由于。Redis 泛型缓存。
2025-03-12 10:24:31
647
原创 如何找回已删除的 Git 远程和本地分支
在日常开发中,我们有时可能会误删 Git 分支,无论是本地分支还是远程分支。如果发现自己需要找回已删除的分支,不要惊慌,Git 提供了一些方法来帮助我们恢复它。本文将介绍几种常见的恢复方法。,大多数情况下,它可以帮助你找回误删的分支。如果远程分支被误删,但本地仍有一个旧的拷贝,你可以尝试找回它。,你可以尝试联系管理员查看是否能恢复被删除的分支。命令检查 Git 仓库中的“悬空”对象。Git 记录了所有的 HEAD 变更,无法找到有用的信息,可以尝试。可以帮助我们找到最近的提交。这可能会恢复你丢失的代码。
2025-03-10 15:37:12
513
原创 Git Fast-forward 合并详解:原理、场景与最佳实践
在使用 Git 进行团队协作时,我们经常需要合并分支。合并方式有很多种,其中是一种最简单且无冲突的合并方式。本文将详细介绍 Fast-forward 的原理、适用场景、常见问题及最佳实践。Fast-forward(快速合并)指的是。git mergegit pull如果远程分支有新的提交,而本地分支自上次拉取后,那么执行git pull或git merge时,Git 会进行 Fast-forward 合并。假设这里E,整个过程是 Fast-forward 合并。如果本地已经有新的提交,例如X这时执行。
2025-03-10 15:33:56
735
原创 解决 Java 9 模块化带来的 `Unable to make protected native java.lang.Object java.lang.Object.clone()` 问题
Java 9 的模块化系统通过强封装和显式的模块声明,解决了类路径管理中的许多问题,提升了系统的可维护性、可扩展性和性能。模块化不仅使得依赖关系更加清晰、管理更加容易,还提高了应用的启动速度和运行时效率。相比传统的类路径管理,模块化通过明确声明依赖关系和暴露 API,避免了类冲突、冗余类加载以及版本管理的问题。而这些正是大型项目在类路径管理中常见的挑战。
2025-02-14 16:29:27
766
原创 探索 Java 9 的模块化系统
Java 9 的模块化系统通过强封装和显式的模块声明,解决了类路径管理中的许多问题,提升了系统的可维护性、可扩展性和性能。模块化不仅使得依赖关系更加清晰、管理更加容易,还提高了应用的启动速度和运行时效率。相比传统的类路径管理,模块化通过明确声明依赖关系和暴露 API,避免了类冲突、冗余类加载以及版本管理的问题。而这些正是大型项目在类路径管理中常见的挑战。
2025-02-14 16:00:31
719
原创 Maven 中的 `<dependencyManagement>` 标签及其高级用法
在父项目的pom.xml中,使用标签定义各个依赖的版本。这些依赖不会直接引入,而是作为版本管理的模板供子项目引用。示例:父项目的pom.xml</</</</</</</</</</</</</</</</</</</</标签在 Maven 中扮演着至关重要的角色,尤其在多模块项目中。通过集中管理依赖版本,它简化了依赖配置,避免了版本冲突,提高了项目的可维护性和一致性。合理使用该标签,可以显著提升多模块项目的构建效率,并确保项目的各个部分保持一致的依赖版本。
2025-02-14 10:21:04
1067
原创 坑:MyBatis-Plus 逻辑删除配置与使用指南
在使用 MyBatis-Plus 时,逻辑删除是一项常见的需求,它通过标志位来标记数据是否被删除,而不是直接删除数据。MyBatis-Plus 提供了简单的配置来实现这一功能,但在实际使用过程中,可能会遇到一些坑。本文将介绍如何正确配置和使用 MyBatis-Plus 的逻辑删除功能。
2025-02-11 10:29:10
741
原创 Cookie、Session 和 Token 请求流程的核心区别
在现代 Web 开发中,处理用户身份验证和会话管理是至关重要的。常见的三种方式——和,在用户请求的身份验证过程中扮演着不同的角色。尽管它们都用于管理用户状态和身份验证,但它们的工作原理、使用场景以及跨域处理方式各不相同。本文将详细探讨这三者的请求流程和核心区别,帮助开发者理解它们的使用和适用场景。
2025-02-11 08:57:08
788
原创 Session 与 Token 的跨域 CORS 配置及其区别
在现代 Web 开发中,跨域请求是一个常见的需求,尤其是在前后端分离的应用中。为了确保安全性,浏览器会实施,这会限制一个网站对另一个不同源网站资源的访问。因此,跨域请求需要后端做出特定配置来允许特定来源的请求访问其资源。本文将分别介绍和在跨域请求中的 CORS 配置,并基于这些配置,探讨它们的区别。在传统的会话管理中,通过将会话信息(如sessionID)存储在服务器端,并将其传递给客户端(通常存储在Cookie中)。浏览器在每次请求时会自动附带Cookie,以便服务器识别当前用户的会话状态。
2025-02-11 08:56:01
742
原创 多数据源情况下,数据库连接池的加载流程
在多数据源配置的场景下,默认数据源的选择是一个重要的问题,特别是在引入动态数据源时。本文将详细分析多数据源下的数据库连接池的加载,并展示相关的执行流程和源码。通过以上分析,可以清晰地了解默认数据源选择的内部机制及其背后的逻辑,若有疑问请评论区留言讨论哟🧘。第二张图片主要关注点是:数据源的选择,即什么情况下会选择。在加载数据源时,会遍历数据源配置,并通过。首先进入多数据源的自动配置类,关注一下。注解里面的类,下文需要用到。列表,找到第一个支持的。的注入流程,然后在注入到。的对象之间的注入的关系。
2024-12-26 16:44:16
844
原创 为什么在多数据源的情况下,单数据源的自动配置类会失效?
而单数据源的默认配置显然无法满足这些需求,因此被动态数据源框架的配置完全替代。)后,单数据源的自动配置机制会失效,原因主要在于多数据源自动配置类的优先加载和 Spring Boot 的条件装配逻辑。这种机制是 Spring Boot 条件装配机制和自动配置优先级协同工作的结果,也是动态数据源实现灵活性的重要基础。后,单数据源的自动配置类失效的根本原因是多数据源自动配置类的优先加载和条件装配的逻辑冲突。因此,动态数据源配置优先于单数据源配置完成初始化。的条件不再满足,导致单数据源的自动配置逻辑被跳过。
2024-12-25 16:04:00
497
原创 Spring Boot 2.1.7 数据源自动加载过程详解
在 Spring Boot 中,数据源的自动配置是框架中一个关键功能,本文将以 Spring Boot 2.1.7 版本为例,详细讲解数据源是如何自动加载的。我们通过源码分析,追踪整个加载流程。Spring Boot 使用 机制加载自动配置类。在 包的 文件中,可以找到:其中, 是数据源的自动配置类。进入 类,可以看到其内部有一个静态嵌套类 :关键点解释::依赖于 判断是否满足条件。:确保没有自定义的 和 Bean。:导入了 、、 等数据源的配置类。3. 类进入 ,这是
2024-12-17 16:35:01
1252
原创 Spring Boot 3.x:自动配置类加载机制的变化
Spring Boot 3.x 对自动配置类加载机制的变化,主要是将自动配置类的注册方式从。
2024-12-17 14:09:25
1112
原创 Spring Boot 条件注解:@ConditionalOnProperty 完全解析
是 Spring Boot 中非常实用的条件注解,可以通过配置文件灵活地控制 Bean 和配置类的加载,避免不必要的资源浪费,并提高系统的可维护性。在不同的环境(开发、测试、生产)中,我们可能需要加载不同的配置。在实际项目中,我们可能需要通过配置文件中的某个属性来控制某个功能的启用或禁用。在 Spring Boot 项目中,有时候我们希望根据配置文件中的某个属性值来决定是否启用某个功能或加载某个组件。注解就可以发挥作用。它通过配置文件的属性值控制 Bean 或配置类的加载,使得我们的程序更具灵活性。
2024-12-17 11:27:14
3656
原创 深入理解 MySQL 锁机制:分类、实现与优化
MySQL 的锁机制为并发控制提供了丰富的工具,但不同的锁类型和实现方式适用于不同场景。理解锁的分类、主动和被动实现、以及优化策略,是提升数据库性能、避免并发问题的关键。MySQL 提供了多种类型的锁,不同的存储引擎和场景下的实现各具特点。本篇文章将详细介绍 MySQL 锁的分类、实现(主动与被动)以及优化策略。希望本文能帮助您更好地理解和应用 MySQL 的锁机制。如果有问题或建议,欢迎在评论区交流!在高并发的数据库应用中,锁机制是保障事务在操作数据库时。中的死锁日志,排查问题并优化事务设计。
2024-11-27 20:35:06
874
原创 深入理解 Maven 生命周期与常用命令:从编译到安装
Maven 是 Java 项目管理中不可或缺的工具之一,其核心功能包括依赖管理、项目构建和发布等。本文将围绕 Maven 的生命周期及常用命令,解析从项目编译到安装的完整流程,并结合实际案例帮助读者更好地掌握 Maven 的使用。Maven 的构建过程由多个生命周期(Lifecycle)组成,每个生命周期又包含若干阶段(Phase)。Maven 提供了强大的生命周期管理工具,从源码编译到模块共享的每一步都能自动化执行。的基础上,将打包文件安装到本地 Maven 仓库,供其他项目引用。
2024-11-19 14:44:29
773
1
原创 观察者模式 vs 不使用观察者模式:商品库存变化的通知
特性不使用观察者模式使用观察者模式耦合性高,商品类直接依赖多个模块(商品详情页、购物车等)低,商品类只依赖于Observer接口扩展性差,增加新模块需要修改商品类好,新增模块只需实现观察者接口并注册即可维护性差,修改商品类可能导致其他模块发生问题好,模块独立,修改不会影响其他模块符合设计原则不符合开闭原则符合开闭原则。
2024-11-14 22:20:46
843
原创 从业务场景学习观察者模式
观察者模式(Observer Pattern)是一种行为型设计模式,用于定义对象间一对多的依赖关系。当一个对象(即被观察者或主题)的状态发生变化时,所有依赖于它的对象(即观察者)都会收到通知并更新。发布-订阅(Publish-Subscribe)模式:被观察者发布消息,观察者订阅消息;模型-视图(Model-View)模式:在 MVC 架构中,Model 的变化通知 View;源-监听(Source-Listener)模式:被观察者作为消息源,观察者作为消息监听者。首先,我们定义一个。
2024-11-14 17:26:31
970
原创 如何在Mac上切换到JDK 17开发环境
通过这篇指南,您已经成功将Mac上的开发环境切换到JDK 17。使用重新构建项目后,您可以在项目中充分利用JDK 17的新特性。
2024-11-11 14:41:39
2336
原创 通过 Nacos 服务发现进行服务调用时的 500 错误排查与解决
检查服务在 Nacos 中的注册状态,确保调用目标服务是健康的。检查 Feign 客户端配置,确保服务名匹配。确认调用方服务是否需要注册到 Nacos,若需要,则确保注册依赖与配置完整。使用检查重复依赖问题,确保每个依赖仅引入一次。在微服务架构中,依赖的版本和冲突问题往往容易被忽视。希望通过本次问题的排查过程,大家在遇到类似的 Nacos 服务调用异常时,能有效排查并快速解决。
2024-11-06 15:59:46
1541
原创 享元模式在 JDK 中的应用解析
在 JDK 中,字符串常量池、Integer缓存机制和枚举类型都是享元模式的经典应用实例。字符串常量池通过共享相同内容的字符串对象来避免内存浪费。Integer缓存机制通过缓存小范围的整数对象来减少对象创建的开销。枚举类型通过保证每个枚举值只有一个实例,避免了重复创建对象。这些 JDK 中的优化设计为我们提供了很好的借鉴,尤其在需要管理大量相似对象时,享元模式可以显著提升系统的内存使用效率和性能。在实际开发中,了解和应用享元模式,可以帮助我们更好地进行内存管理和性能优化。
2024-11-05 13:54:48
880
原创 享元模式及其运用场景:结合工厂模式和单例模式优化内存使用
享元模式(Flyweight Pattern)是一种结构型设计模式,它通过共享对象来减少内存使用,尤其是对于大量相似对象的场景。享元模式通常与工厂模式和单例模式结合使用,从而有效地控制和复用对象的创建。在享元模式中,享元对象的核心思想是将不可变的部分(共享的状态)和可变的部分(外部状态)进行区分,从而优化系统性能。享元模式通过共享对象的方式有效减少了内存使用,尤其适用于对象数量庞大且状态相似的场景。
2024-11-05 11:16:28
1296
原创 外观模式及运用场景
外观模式通过提供一个统一的接口,简化了复杂系统的使用,减少了客户端与多个子系统之间的直接交互。在电商系统、数据库访问和线程管理等场景中,外观模式都能有效提高系统的可维护性和可读性。合理运用外观模式,可以显著提升开发效率和用户体验。
2024-11-02 09:09:28
473
原创 适配器模式适用的场景
适配器模式的核心优势在于能够将不同接口之间的兼容性问题转化为更易处理的形式。通过上述四个场景的详细示例,我们可以看到适配器模式在开发中的广泛应用。不论是统一多个类的接口设计、替换外部系统、兼容老旧接口还是处理不同数据格式,适配器模式都能有效提高代码的灵活性与可维护性。希望这篇博客能够帮助你更好地理解适配器模式的应用!
2024-10-31 21:49:05
1022
原创 适配器模式:类适配器与对象适配器
适配器模式的核心思想是提供一个兼容性接口,使得不兼容的接口之间能够顺利通信。类适配器适合简单且不需适配多个源类的情况。对象适配器更灵活,适用于需要适配多个源类或动态变化的情况。通过合理使用适配器模式,可以显著提高系统的可维护性和扩展性,降低代码耦合度。希望这篇博客能够帮助你更好地理解适配器模式及其应用!
2024-10-31 21:08:51
887
原创 深入理解 Logback.xml文件及运用
在Java开发中,日志记录是不可或缺的一部分,它帮助开发者监控应用程序的运行状态和调试问题。Logback作为一种强大的日志框架,与SLF4J(Simple Logging Facade for Java)紧密结合,提供了一种灵活的日志解决方案。SLF4J是一个简单的日志门面,允许开发者使用统一的API,而不必依赖具体的日志实现。Logback是SLF4J的默认实现,它不仅提供了丰富的功能,还具备高性能和低延迟的特点。通过使用SLF4J,开发者可以在不同的环境中灵活地切换日志实现,例如Logback、Log
2024-10-29 15:54:24
1291
原创 装饰器模式详解:动态扩展对象功能的优雅解决方案
首先,我们定义DataLoader接口和一个简单的实现类// 基础接口,定义读写数据的方法// 基本的文件加载实现类@Override@Override装饰器基类实现了DataLoader接口,并包含一个DataLoader类型的成员变量wrapper,通过它调用基础对象的read()和write()方法。// 装饰器基类,所有装饰器都继承自此类@Override@Override用于加密和解密数据,用于压缩和解压数据。每个装饰器在read()和write()
2024-10-28 17:22:25
1231
原创 装饰器模式的适用场景示例
类,用于发送 HTTP 请求。在某些场景下,我们希望对传输的数据进行加密以提高安全性,但在其他场景下不需要加密。通过装饰器模式,可以轻松地在需要时动态扩展这个功能,并在不需要时撤销它。装饰器模式在这种情况下提供了一个解决方案,通过组合的方式对类进行功能扩展,而不是通过继承。有时我们无法继承一个类,例如该类被声明为。
2024-10-28 17:18:23
514
原创 装饰者模式与静态代理模式的区别
装饰者模式:装饰者模式允许用户在不改变原有对象结构的情况下,动态地为对象添加功能。它通过创建一个装饰类来包裹原始类,从而增强其功能。装饰者和被装饰对象都实现相同的接口,使得增强功能可以灵活组合。静态代理模式:静态代理模式是通过代理对象来控制对原始对象的访问。在静态代理中,代理类持有被代理对象的引用,并在其方法中调用被代理对象的方法,以实现对其功能的控制。代理者和被代理对象都实现了相同的接口。
2024-10-28 11:13:31
563
原创 记录 Maven 版本覆盖 Bug 的解决过程
最直接的解决方案是删除子模块pom.xml中的 Apollo 版本定义,让 Maven 使用父模块中定义的版本。打开子模块的pom.xml文件。找到的定义,并将其删除。-- 删除这一行 -->
2024-10-28 10:09:49
508
原创 如何使用 Git Cherry-Pick 和 Reset 处理误提交,并确保安全回滚
通过和,我们可以有效地解决误提交的问题。创建新的上线分支:基于master创建新的 10.24 号上线分支。查找误提交记录:使用git log查找 10.17 分支上误提交的内容。应用误提交到正确分支:通过将误提交内容转移到 10.24 分支。回滚错误提交:使用回滚 10.17 分支的误提交。安全推送远程仓库:通过确保回滚操作安全地同步到远程仓库。使用这些 Git 功能,既能解决误提交的问题,又能在多人协作时避免对其他人的工作产生影响。
2024-10-16 15:33:21
912
原创 桥接模式详解与代码实现
桥接模式的核心是“将抽象部分与实现部分分离”,在设计上通过组合的方式代替继承。通常情况下,我们会遇到一个类需要多个维度变化的情况(如不同的抽象和实现),这时,如果使用继承,类层次结构会变得很复杂。而桥接模式通过组合的方式使不同维度的变化可以独立进行,从而降低类之间的耦合。通过桥接模式,我们可以将多维度的变化解耦,从而避免类的组合爆炸。这种模式尤其适用于需要在两个或多个独立维度变化的场景,比如在本文的图形和颜色的例子中。桥接模式不仅使代码更具灵活性和可维护性,还提高了系统的扩展性。
2024-10-15 21:03:08
715
原创 解决本地启动成功但线上集成失败的依赖冲突问题
在开发过程中,常常会遇到在本地启动项目成功,但在上线集成时却失败的情况。这通常是由于环境或配置的差异所导致的。本文将分享一个具体的案例,以及如何通过排除不必要的依赖解决这个问题。
2024-10-11 12:40:59
419
原创 Git 的工作目录、本地仓库和远程仓库
工作目录:你的编辑环境,包含了项目文件。你在这里进行所有代码的修改。本地仓库:记录了你的所有版本历史,包含已提交的更改。你在完成修改后通过git commit将更改记录到这里。远程仓库:团队共享代码的地方,你可以通过git push和git pull命令与之交互,以同步本地和远程的代码。
2024-10-09 14:18:26
593
原创 CGLIB原理
CGLIB 动态代理基于子类继承,通过字节码操作技术(如 ASM)动态生成代理类。它可以在运行时增强类的功能,使得开发者无需修改原有类的代码就能实现日志、权限校验等功能。虽然 CGLIB 在性能上有一定的开销,但其强大的代理能力使得它在 Spring 等框架中得到了广泛应用。
2024-10-03 16:41:03
1411
原创 切面和拦截器的区别
切面(AOP, Aspect-Oriented Programming)和拦截器(Interceptor)是两种常见的编程机制,用于在执行方法时进行拦截或增强,但它们的应用场景和工作方式有显著的区别。下面我们来分析切面和拦截器的不同以及它们各自的应用场景。
2024-10-03 11:46:39
1235
原创 静态代理和动态代理的区别及命名原因
静态代理和动态代理是两种常用的代理模式,尽管它们的实现方式不同,但本质都是通过代理类控制对目标对象的访问。静态代理的代理类在编译期生成,比较简单易懂,但缺乏灵活性;而动态代理则是在运行时生成代理类,提供了更强的灵活性,适合于代理多个类或接口的场景。因此,它们被称为“静态”和“动态”主要取决于代理类的生成时机。静态代理在编译时生成,表现为“静态”;而动态代理在运行时生成,表现为“动态”。
2024-10-03 10:45:40
867
原创 Java 静态代理详解:为什么代理类和被代理类要实现同一个接口?
代理模式的核心思想是通过代理对象来控制对目标对象的访问。在静态代理中,开发者手动创建代理类来封装真实对象的行为,并在不修改原有类的前提下,添加额外的功能或行为。// 定义接口// 被代理类实现接口@Override// 代理类也实现同一个接口@Override// 调用被代理类的方法// 使用代理在这个例子中,Service是一个接口,实现了这个接口。同样实现了Service接口,并通过组合的方式持有的引用。保证接口的一致性,确保客户端可以无差别地调用代理类或被代理类。
2024-10-03 10:23:05
1075
原创 从内存层面分析Java 类加载与对象创建的完整过程
类的加载遵循了双亲委派模型,经历加载、验证、准备、解析和初始化五个阶段。在类加载过程中,静态变量首先被赋默认值,之后在初始化阶段被赋予指定的初始值。对象的创建分配内存,并为实例变量赋默认值。在构造方法执行前,实例变量按声明顺序被赋初始值。静态变量的初始化是在类加载时完成的,实例变量的初始化是在对象创建时完成的。这种类加载与对象创建的机制确保了 Java 程序的稳定性与灵活性,同时也为我们提供了理解 JVM 运作方式的基础。今天的内容就到这里啦,如果大家有任何问题欢迎评论区留言交流!
2024-10-03 10:13:54
738
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人