MyBatis 分页插件开发
PageHelper 内部到底怎么实现的?手写一个 MyBatis 分页插件,深入理解插件拦截机制。 一、MyBatis 插件的拦截原理 1.1 可拦截的四大对象——Executor / ParameterHandler / StatementHandler / ResultSetHandler 1.2 拦截哪个对象决定插件的功能——分页插件拦截 Executor 或 StatementHandler 1.3 Plugin.wrap() 动态代理的实现 二、分页插件设计思路 2.1 拦截点选择——Executor.query() 还是 Statemen...
MyBatis 执行链路详解
MyBatis 是如何把 XML 中的 <select> 标签变成一行 JDBC 查询的?本文从源码角度追踪完整链路。 一、MyBatis 核心架构 1.1 四大核心对象:SqlSession / Executor / StatementHandler / ResultSetHandler 1.2 架构分层图——接口层 → 数据处理层 → 基础支撑层 二、SqlSession——与 MyBatis 交互的门面 2.1 SqlSessionFactory → SqlSession 的创建 2.2 DefaultSqlSession ——sel...
Spring 事务失效场景与原因分析
“@Transactional 怎么不生效?” 这个问题被问了无数遍。本文总结 8 个事务失效场景,每个都有代码复现和修正方案。 一、事务不生效的总根源 1.1 Spring 事务是 AOP 代理实现的 1.2 所有失效原因最终都归结为”代理没有生效”或”异常没有触发回滚” 二、场景 1:非 public 方法 2.1 原理——CGLIB 无法代理 private/protected 方法 2.2 错误示例与修正 三、场景 2:自调用问题 3.1 同类中方法 A 调用方法 B,B 的事务失效 3.2 解决方案——AopContext.currentProxy() 或拆分...
Spring AOP 实现方式对比
Spring AOP 默认用 JDK 动态代理还是 CGLIB?为什么 @Transactional 自调用会失效?理解代理机制才能避开这些坑。 一、AOP 的核心概念 1.1 Aspect / JoinPoint / Advice / Pointcut / Weaving 1.2 Spring AOP vs AspectJ 的区别 1.3 Spring AOP 是基于代理的——只能拦截方法 二、JDK 动态代理 2.1 基于接口的代理——必须有接口 2.2 Proxy.newProxyInstance() 原理 2.3 Invocation...
Spring IoC 容器原理
Spring 的核心就是 IoC 容器。从 BeanDefinition 的定义到 Bean 的实例化,容器内部经历了什么? 一、IoC 的概念与优势 1.1 控制反转——创建对象的权利交给容器 1.2 DI 依赖注入——IoC 的具体实现方式 1.3 IoC 容器解决了什么问题 二、BeanDefinition——Bean 的”配方” 2.1 BeanDefinition 的元数据——scope / lazy-init / depends-on / init-method / destroy-method 2.2 注册方式:XML → @B...