自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(1077)
  • 资源 (9)
  • 收藏
  • 关注

原创 JVM专题

从JDK源码级别彻底剖析JVM类加载机制

2022-02-01 16:47:01 474

原创 MySQL学习系列

系列文章目录MySQL 的分支、变种与替代

2021-12-31 22:51:06 536

原创 gradle构建工具学习系列

系列文章目录

2021-12-18 12:05:23 568

原创 并发编程系列

系列文章目录并发编程之深入理解JMM&并发三大特性并发编程之深入理解Java线程

2021-11-28 16:07:26 432

原创 MyBatis源码学习系列文章目录

系列文章目录MyBatis开发要点MyBatis一级缓存MyBatis二级缓存MyBatis日志模块MyBatis日志增强MyBatis数据源MyBatis缓存模块(二级缓存深入理解)MyBatis反射模块MyBatis工作流程-初始化阶段一MyBatis工作流程-初始化阶段二MyBatis工作流程-代理封装阶段MyBatis工作流程-数据访问阶段MyBatis工作流程-与Spring整合...

2021-04-24 21:44:25 316

原创 腾讯课堂某培训机构Spring源码问题集锦

系列文章目录注解方式与xml方式注册问题

2021-04-17 11:12:25 395

原创 MyBatis工作流程-与Spring整合

系列文章目录MyBatis开发要点MyBatis一级缓存MyBatis二级缓存MyBatis日志模块MyBatis日志增强MyBatis数据源MyBatis缓存模块(二级缓存深入理解)MyBatis反射模块MyBatis工作流程-初始化阶段一MyBatis工作流程-初始化阶段二MyBatis工作流程-代理封装阶段MyBatis工作流程-数据访问阶段MyBatis工作流程-与Spring整合文章目录系列文章目录 前言与MyBatis相关的Beanbean实例化的流程1. Sql

2020-12-19 16:12:11 339 1

原创 兼容Oracle与MySQL的一些事

文章目录前言一、字段类型差异二、函数差异 1、几种兼容方案a. 利用Mybatis的特性b. 是否存在相同的函数c. 自定义同名函数三、语法差异四、锁的差异总结前言由于公司目前主要使用的数据库为Oracle,然后部分兼容MySQL,后期会考虑全部支持Oracle和MySQL。由于二者的各种差异,我们必须有一套可行的方案减少工作量。在兼容Oracle与MySQL的那些事中我们已经仔细讨论过在数据层对多数据库的支持了,接下来的目标就是结合这种支持同时考虑其他手段达到目标了。本文从以下几点来谈一下对兼容考

2020-11-09 10:56:58 2153 7

原创 18 Byte Buddy 进阶:揭秘方法委托中的“歧义解析”机制

如果默认的 4 条规则无法满足你的奇葩需求(比如你想根据方法上的自定义注解来选择),你可以实现接口。// 自定义逻辑:例如,优先选择带有 @AdminOnly 注解的方法 for(Resolution candidate : candidates) {// 直接选中 } } // 否则返回 null,交给下一个解析器处理 return null;

2026-03-16 18:45:21 384

原创 18 Byte Buddy 进阶指南:解锁 `@Pipe` 注解,实现灵活的方法转发

Pipe// 模拟一个简单的数据库服务 class MemoryDatabase {// 模拟耗时操作 try {} }// 模拟一个简单的数据库服务 class MemoryDatabase {// 模拟耗时操作 try {} }List;// 模拟一个简单的数据库服务 class MemoryDatabase {// 模拟耗时操作 try {} }ArrayList;// 模拟一个简单的数据库服务// 模拟耗时操作@Pipe。

2026-03-16 17:11:27 430

原创 18 Byte Buddy 进阶指南:优雅调用接口默认方法 (@DefaultCall)

*** 场景一:强制调用 ServiceA 的默认方法* 即使 MyService 重写了 log,这里也能通过 targetType 找回 ServiceA 的默认逻辑} /*** 场景二:强制调用 ServiceB 的默认方法} /*** 场景三:如果不想指定 targetType,且方法本身就是默认方法的直接实现(未重写)* 注意:对于 MyService 这种重写了的情况,不加 targetType 可能会导致绑定失败或调用的是 super (如果存在)} }

2026-03-16 15:20:02 439

原创 17 深入理解 Byte Buddy @Super:是“父类代理”而非“父类实例”

/ 普通虚方法 (可被重写)// Final 方法 (不可被重写)// Private 方法 (不可见)/**/*** 拦截逻辑* @param origin 原始方法信息* @param allArgs 所有参数* @param zuper 原始方法的调用句柄。

2026-03-13 13:42:01 412

原创 12 Byte Buddy 进阶指南:如何动态定义全新方法与字段

重写 (Override):针对父类或接口中已存在的方法进行修改。定义 (Define):创建一个全新的方法或字段,它在父类中并不存在。Byte Buddy 允许你通过和API 轻松实现后者。你可以使用来声明一个新方法,指定其名称、返回类型、参数列表和可见性。定义完成后,必须立即通过提供具体的实现逻辑。与方法不同,字段的处理逻辑要简单得多。方法定义的时序敏感后立即intercept是标准动作。警惕:后续注册的匹配器可能会“误伤”你刚定义的新方法。对策。

2026-03-12 13:25:49 160

原创 ByteBuddy系列文章目录

系列文章目录系列文章目录。

2026-03-12 09:26:37 78

原创 11 ByteBuddy 泛型深坑:为什么名字相同的 `T` 却不是同一个类型?

ByteBuddy 文档中提到的机制,是其在处理泛型时最核心的智能特性之一。核心认知:泛型类型变量(TE等)不是全局唯一的,它们是上下文相关的。跨类复用泛型类型时,必须更新其绑定的上下文。自动修复:当你传入一个包含类型变量的Type对象给 ByteBuddy 时,它不会盲目复制,而是会自动识别并将其重绑定到新生成类或方法的上下文中。开发者收益:你不需要关心字节码中复杂的常量池索引、签名属性格式或类型变量表。你只需要关注业务逻辑,ByteBuddy 会保证生成的字节码在泛型层面是严格合法的。

2026-03-11 16:56:00 176

原创 08 ByteBuddy 进阶:Manifest 加载策略——用内存换“后悔药”?

ByteBuddy 的 Manifest 版本是一个强大的“后悔药”,它让动态类在加载后依然保留了“肉身”(字节码)。核心建议默认忽略:95% 的场景下,你只需要操作Class对象,不需要原始字节码。请坚持使用普通的WRAPPER策略。按需开启:只有当你明确调用了且期望得到非空结果时,才切换到*_MANIFEST版本。警惕内存:使用 Manifest 版本时,务必监控 JVM 堆内存使用情况,避免因为动态类过多而导致 OOM。认清局限。

2026-03-11 15:21:04 229

原创 08 ByteBuddy 加载策略全解析:从“隔离”到“注入”,如何避开循环依赖的深坑?

ByteBuddy 的加载策略不仅仅是技术实现的选择,更是架构设计不要低估动态生成的复杂性:一个动态类背后往往隐藏着一群“辅助类”。拥抱隔离Wrapper 策略通过创建独立的 ClassLoader,将复杂的依赖关系封装在内部,对外提供干净的接口。这是最稳健、最推荐的做法。慎用注入Injection 策略虽然能打破隔离,但也打破了 ByteBuddy 自动管理依赖的能力,将巨大的风险转移给了开发者。最佳实践口诀默认就用 Wrapper,安全省心不出错;

2026-03-11 15:12:35 246

原创 08 ByteBuddy 进阶:揭秘 `DynamicType.Unloaded` —— 从字节码生成到自由掌控

理解是掌握 ByteBuddy 的关键一步。它打破了“动态生成只能在内存里跑”的思维定势。操作方法适用场景结果保存构建时增强、调试分析硬盘上出现.class文件注入动态补丁 Jar、插件系统现有 Jar 包中新增条目提取网络传输、加密、自定义加载获得byte[]数组加载.load(...)运行时动态代理、热部署JVM 中产生可用的Class对象最佳实践建议开发阶段:多使用.saveIn()配合反编译工具,验证生成的字节码是否符合预期。生产环境:如果性能敏感且逻辑固定,优先考虑构建时生成。

2026-03-11 14:54:39 367

原创 03 别再用 CGLIB 了!深度解析 Byte Buddy:为什么它是现代 Java 框架的首选?

代码生成(Code Generation)是一把双刃剑,请慎用。这是核心逻辑,我们将在这里插入计时代码。/*** 拦截所有方法* @param origin 原始方法信息* @param superCall 用于调用原始方法的回调 (关键:这是直接调用,非反射)* @param args 参数try {// 🚀 执行原始业务逻辑 // Byte Buddy 会将此处优化为直接的 invokevirtual 指令 return superCall . call();} } }

2026-03-10 17:04:43 345

原创 03 从零手写安全框架:揭秘 Spring Security 背后的“字节码魔术”

/ 1. 注解:标记哪些方法需要保护// 需要的角色,如 "ADMIN"// 2. 全局用户上下文(模拟)// 默认普通用户// 3. 框架入口// 承诺:传入什么类型,返回什么类型的“安全代理”特性硬编码子类反射调用运行时代码生成通用性❌ 仅支持已知类✅ 支持任意类✅支持任意类性能⭐⭐⭐⭐⭐⭐⭐ (慢)⭐⭐⭐⭐⭐ (直接调用类型安全✅ 编译期检查❌ 运行期检查✅生成时/加载时检查侵入性高 (需手动写类)低零 (完全透明)Java 的静态类型系统虽然严格,但通过。

2026-03-10 16:31:53 278

原创 29 解锁 Byte Buddy 高阶玩法:自定义参数绑定器 (Custom Parameter Binder)

首先,我们需要定义注解。注意:必须设置保留策略为RUNTIME,否则 Byte Buddy 在运行时无法读取注解信息。// 1. 定义注解 @Retention(RetentionPolicy . RUNTIME) // ⚠️ 关键:必须是 RUNTIME @interface StringValue {// 存放要注入的字符串内容 }

2026-03-10 14:42:12 328

原创 28 超越默认:深入理解 Byte Buddy 的自定义 Assigner 与类型转换魔法

领域特定转换:如自动将对象转为 JSON (toJson)、XML、或特定格式的字符串。遗留系统适配:旧系统期望特定的包装类型或转换逻辑,而新代码产生的是标准类型。DSL 实现:在动态脚本引擎中,定义独特的类型 coercion 规则(如"123"自动转为123数字)。调试与日志:如本例所示,强制将所有返回值转为字符串以便统一记录。

2026-03-10 14:02:34 380

原创 27 别在字节码里写 `if-else`!Byte Buddy 跳转指令的避坑指南

Byte Buddy 关于跳转指令的这一章,实际上是在传达一种工程智慧认清边界:工具各有专长。编译器擅长生成正确的控制流字节码;Byte Buddy 擅长动态织入和类型操纵。避免重复造轮子:不要试图在运行时重新实现javac的功能(特别是 Stack Map Frame 计算)。拥抱可维护性:将业务逻辑保留在.java源文件中,让你能继续使用强大的 IDE 生态和调试工具。记住这句话(让编译器去编译你的逻辑,让 Byte Buddy 负责将它们粘合在一起。下次当你想要动态生成一段if-else。

2026-03-10 13:45:59 375

原创 26 突破 Byte Buddy 标准 API:手写字节码的终极指南

虽然 Byte Buddy 内置了等常用操作,但为了演示原理,我们假设需要自定义一个特殊的“加 100”操作。// 定义一个自定义的栈操作:向栈顶元素加 100 enum AddHundred implements StackManipulation {INSTANCE;// 1. 压入常数 100 Size pushSize = IntegerConstant . forValue(100) . apply(methodVisitor , implementationContext);

2026-03-10 11:27:53 185

原创 25 Byte Buddy 注解完全指南:让动态生成的类“骗”过 Spring 和 JUnit

假设我们有一个自定义注解@Version,用于标记类的版本号。// 1. 定义注解 @Retention(RetentionPolicy . RUNTIME) @Target(ElementType . TYPE) @interface Version {} // 2. 实现注解接口 (动态创建实例) class VersionImpl implements Version {} }

2026-03-09 11:30:45 440

原创 24 Byte Buddy 进阶指南:5 种“特种”实现策略,让字节码操作更优雅

Byte Buddy 提供的这些“特种”实现策略,极大地丰富了我们的工具箱。策略核心行为典型场景推荐指数StubMethod返回默认值 (0/null)Mock 测试、静默屏蔽方法⭐⭐⭐⭐ (常用)抛出异常故障注入、强制禁用方法⭐⭐⭐⭐ (测试必备)MethodCall链式转发调用装饰器、AOP 前置/后置逻辑⭐⭐⭐⭐⭐ (灵活高效)适配 JDK Handler复用旧代码、代理类而非接口⭐⭐⭐ (特定迁移场景)运行时动态绑定动态语言引擎、极致性能分发⭐⭐ (高级玩家)智能匹配委托。

2026-03-09 11:26:04 396

原创 23 告别反射!用 Byte Buddy 和 FieldAccessor 打造高性能动态代理

首先,定义我们的基础类、策略接口、访问器接口和工厂接口。// 1. 原始业务类// 2. 策略接口:定义具体的行为// 注意:方法名和签名需与 UserService.execute() 匹配// 3. 访问器接口:用于动态更换策略 (关键!// 4. 工厂接口:用于创建动态实例通过结合Byte Buddy的和,我们构建了一个高性能、类型安全且完全解耦的动态代理系统。告别反射:利用生成的字节码直接访问字段,性能媲美原生代码。优雅设计。

2026-03-09 10:56:06 364

原创 22 Byte Buddy 进阶:构造函数策略与 SuperMethodCall 的深层奥秘

策略常量行为描述适用场景风险点(默认)复制父类所有可见构造函数。通用场景,确保子类能像父类一样被灵活实例化。无不生成任何构造函数。当你打算完全手动通过自定义时。若不手动定义,类将无法实例化。仅生成一个无参构造函数,调用父类无参构造。简单 POJO 增强,且确定父类有无参构造时。高风险:若父类没有无参构造,生成时会直接抛异常。仅复制父类的public构造函数。希望限制子类只能通过 public 构造器创建,隐藏内部构造逻辑。无法通过 protected 构造器实例化子类。

2026-03-07 19:46:37 375

原创 21 Byte Buddy 进阶:驾驭接口默认方法与 MethodCall 万能钥匙

特性MethodCall核心定位简单透传调用父类/默认方法解决接口默认方法冲突全能型:精确编排任意调用参数处理自动透传(必须严格匹配)自动透传高度灵活:可忽略、重排、硬编码、读字段目标对象隐式的super指定接口的super任意类、任意实例、thissuper典型场景标准 AOP、标准构造函数多接口实现时的默认方法调用复杂构造函数、调用静态工具、自定义逻辑流复杂度低中高。

2026-03-07 19:46:10 415 1

原创 20 Byte Buddy 深度解析:零依赖架构与高级参数注入艺术

注解核心能力是否需要 Binder推荐场景@Empty注入 0/null否测试桩、忽略参数@StubValue智能返回空值否通用熔断器、泛型拦截读取字段否无 Getter 的日志/审计读写字段是状态重置、动态配置@Morph改参后调用是参数脱敏、默认值填充反射调用父类否动态路由、元数据处理。

2026-03-06 16:17:18 390

原创 19 Byte Buddy 进阶指南:从静态拦截到动态编排的艺术

Byte Buddy 的远不止是简单的静态方法调用。特性注解/方法核心用途典型场景默认方法调用调用接口的default实现增强接口默认逻辑,保留原有行为方法转发@Pipe将调用转发给现有实例动态装饰器模式、第三方库增强消歧控制控制多候选方法时的选择策略复杂的拦截器分发逻辑实例委托toField()委托给特定对象而非静态类有状态的拦截器、依赖注入集成构造委托拦截方法并返回新实例对象池、工厂模式重写最佳实践建议优先使用@Pipe处理对象增强,它比继承更轻量,比静态委托更灵活。

2026-03-06 14:07:02 176

原创 Logback MDC 实战:在分布式混沌中构建清晰的日志链路

该过滤器负责在请求开始时提取关键信息(如用户名、Request ID、IP),并在请求结束后自动清理。MDC 是将“杂乱无章的并发日志”转化为“有序的业务链路”的关键技术。核心价值:实现日志的逻辑隔离,让排查问题像查快递物流一样清晰。最佳实践Web 入口统一设值:利用 Filter/Interceptor 自动注入 RequestID、用户信息。出口强制清理:严防线程复用带来的数据污染。异步手动传递:在线程切换时显式拷贝上下文。格式统一规范:在中固化%X{}输出格式。

2026-03-06 13:47:41 251

原创 Logback 过滤器深度指南:从“三值逻辑”到高性能拦截

场景生产环境中,我们需要记录所有日志,但绝对不能让包含 “password” 或 “token” 关键字的日志输出到控制台。⚠️ 重要提示:Logback 1.5.13+ 版本出于安全考虑移除了支持动态脚本的。现在推荐编写自定义 Java 类来实现评估逻辑。第一步:编写自定义评估器import ch// 如果消息包含敏感词,返回 true (表示匹配成功) return msg . contains("password") || msg . contains("token");} }

2026-03-06 13:44:26 205

原创 Logback TCP 远程日志实战:构建高可用的集中式日志中心

Logback 的 TCP 实现不仅仅是一个“远程写文件”工具,它是一个分布式日志对象传输协议。适用场景:中小规模集群、对日志上下文完整性要求高、希望快速搭建私有日志中心的场景。核心配置:发送端用,接收端用。安全红线:跨网络必配 SSL。通过合理配置,你可以构建一个既高性能又安全的日志汇聚系统,让分散的微服务日志在中央服务器上“原样重现”,为故障排查和数据分析提供最坚实的数据基础。

2026-03-06 13:41:38 350

原创 Logback Encoder 深度解析:从文本格式化到结构化 JSON 的进化之路

Encoder 是 Logback 现代化的核心标志。它不仅仅是一个格式化工具,更是连接应用日志与下游日志系统(如 ELK、Splunk、S3)的桥梁。传统文本日志:使用,别忘了开启方便运维。云原生/微服务:首选,利用其结构化特性和字段裁剪功能,打造高效的日志链路。迁移过渡:利用兼容旧资产。掌握 Encoder 的配置,能让你的日志系统从“能看”升级为“好用”、“易管”、“高性能”,真正成为洞察系统运行的利器。

2026-03-06 13:38:37 336

原创 Logback Appender 实战指南:从控制台到异步高性能归档

防磁盘爆满:是否使用了?是否配置了maxHistory和?防性能阻塞:高并发系统是否包裹了?是否设为false?防日志丢失是否根据业务容忍度合理设置?应用关闭时是否有 Shutdown Hook 确保队列刷盘?多环境适配:开发环境用,生产环境用或远程 Socket。关键报警:是否利用或过滤器实现了错误日志的实时通知?Logback 的 Appender 机制赋予了日志系统极大的灵活性。掌握这些配置,不仅能让你轻松应对运维挑战,还能在系统出现故障时,迅速从海量数据中定位真相。

2026-03-06 13:36:18 329

原创 Logback 配置全攻略:从自动加载到动态热更的实战指南

分离配置:利用隔离测试环境,利用系统属性-D区分生产环境。善用变量:使用处理路径、环境名,避免硬编码。控制累加性:需要隔离日志(如审计、高频调试)时,务必设置。开启热加载:生产环境配置,方便临时调整日志级别排查问题。模块化:使用<include>拆分大文件,保持配置清晰。优雅退出:确保配置中包含,防止应用关闭时日志丢失。Logback 的强大不仅在于它能记录日志,更在于它能通过灵活的配置适应各种复杂的架构场景。掌握这些技巧,你的日志系统将不再是负担,而是洞察系统运行的最强利器。

2026-03-06 13:31:42 337

原创 深入理解 Logback 架构:从层级继承到性能优化的实战指南

利用树状层级:通过命名规范(包名)自然形成父子关系,利用继承机制减少重复配置。掌控累加性:明白默认是“叠加输出”,需要隔离时务必使用。坚持占位符:永远使用,拒绝字符串拼接,为生产环境性能保驾护航。避免紧循环日志:即使在关闭状态下,频繁的方法调用也有开销;若开启,IO 阻塞更是灾难。日志是系统的黑匣子,只有读懂了它的架构,才能在故障发生时,迅速透过纷繁的日志行,洞察系统的真相。

2026-03-06 13:28:31 440

原创 从零开始掌握 Logback:Java 日志框架的“Hello World”实战指南

门面模式(Facade Pattern)。:它是一个接口规范。你的业务代码只依赖它,就像你只负责按“打印按钮”,而不关心打印机品牌。Logback:它是具体实现。它负责真正执行打印操作,将日志输出到控制台、文件或网络。这样做的好处是什么?如果你的项目未来想从 Logback 切换到 Log4j2,你只需要修改 Maven 依赖,一行业务代码都不用改。默认的 ConsoleAppender 虽然方便,但在实际开发中,我们需要将日志写入文件、按天切割、区分错误级别。这就需要配置文件。在目录下创建。

2026-03-06 13:24:53 369

原创 18 Byte Buddy 进阶:打破 Java 类型系统的枷锁 —— 受检异常与运行时类型

Byte Buddy 的这两大特性是为了最大化代码复用性而设计的,但它们要求开发者承担更多的责任。特性作用优点风险建议忽略受检异常允许拦截器抛出未声明的受检异常编写通用拦截器无需关心目标方法的throws声明破坏 API 契约,可能导致调用者无法捕获预期外的异常拦截器内部消化:捕获受检异常并转为暂停静态类型检查,使用Object通配一个拦截器处理所有重载方法和参数类型,极大减少代码重复失去编译期类型安全,类型错误推迟到运行时 (运行时防御:在拦截器内使用instanceof进行显式类型判断。

2026-03-05 17:13:00 343

K8S安装以及基础知识的学习

K8S学习笔记

2023-08-20

Quartz2.2.2版本发布包脚本定义

Quartz发布包

2023-07-28

examples.zip

MySQL学习系列SQL案例

2022-01-03

Spring Boot整合Druid Demo项目代码包

Spring Boot整合Druid Demo项目源代码,同时整合了MyBatis,以及实现动态的数据源、Druid连接池的监控。

2020-03-03

simpe-demo-diffdb.7z

该项目包含了动态数据源、兼容Oracle/MySQL数据库、同时通过MyBatis-PageHelper、MyBatis-Plus解决多数据库分页的问题

2020-11-10

动态多数据源示例代码

本项目由SpringBoot+MyBatis+Druild组成,主要关于多数据的动态配置,以及多数据源的配置。用于通过前端请求自由切换数据源,切换数据源的同时也动态执行不同的SQL

2020-11-04

Spring Boot中整合MyBatis

关于SpringBoot中如何配置数据层MyBatis,以及多数据源的配置,多个数据层mapperInterface和xml文件路径的配置源码

2020-04-01

dubbo-thought.7z

Java SPI 机制与 Dubbo SPI 机制的一些说明与测试代码 方便SPI的学习 该项目来自于享学课堂学习资料 请勿随意商业使用

2020-02-22

编程式创建Aspect代理源码

编程式创建Aspect代理源码 You can use the org.springframework.aop.aspectj.annotation.AspectJProxyFactory class to create a proxy for a target object that is advised by one or more @AspectJ aspects.

2020-05-27

Spring Boot中整合MyBatis

关于SpringBoot中如何配置数据层MyBatis,以及多数据源的配置,多个数据层mapperInterface和xml文件路径的配置源码

2020-04-01

springcloud.zip

Spring Cloud 微服务源码:分为用户微服务、课程微服务、网关微服务,通过consul实现了服务发现组件和配置服务器,外面的请求通过网关打进来,微服务之间通过轻量级通信机制,包括http和rabbitmq,微服务之间有一定的认证与授权机制,从而保证安全,对于高并发的应用,通过集成Resilience4j,从而提升应用的可用性。

2020-03-15

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除