
📖 资源简介
这套《Java七大热门技术框架源码解析【完结】》的教程资源我整理出来了,分享给需要的朋友。
✨ 资源亮点
- 体系完整:全套256节视频,从入门到进阶都有覆盖,不是零散的片段。
- 带源码课件:不是纯视频录像,配套的源代码和PPT都在,方便对照学习和二次修改。
- 模块丰富:涵盖26个学习模块,知识点覆盖全面。
📚 课程内容
课程大纲
- Mybatis架构及源码解析
- RocketMQ
- Spring
- Spring Boot
- Spring Cloud
- Spring Data源码解析
资源清单
| 类型 | 数量 |
|---|---|
| 视频教程 | 256 节 |
| 压缩文件 | 0 个 |
| 合计 | 256 |
一、为什么要读框架源码
“会用 SpringBoot 就行了,读源码有啥用?” 这是初中级工程师最常见的疑问。等到线上出问题——比如”这个 Bean 为什么没注入””事务为什么不回滚””循环依赖为什么有的能解有的不能”——你会发现官方文档根本帮不上忙,因为这些问题都发生在框架内部。
读源码的真正目的,不是背下 AbstractBeanFactory 的第 7 个方法,而是建立对框架行为的确定性认知:知道哪一步发生了什么、出问题该去哪一段打断点。这套 256 节的源码课程覆盖 MyBatis、RocketMQ、Spring、SpringBoot、SpringCloud、Spring Data、Tomcat 七大模块,每个模块都是”架构设计 → 核心源码 → 应用技巧 → 二次改造 → 造轮子 → 面试题”六步走,非常适合有 1-3 年业务开发经验、想进阶中高级的工程师。
下面把这套课程里最核心、面试追问最密集的几个点梳理出来。
二、Spring IoC 容器:BeanFactory vs ApplicationContext
Spring 容器有两大顶层接口,很多人分不清:
| 接口 | 定位 | 特点 |
|---|---|---|
BeanFactory |
顶层容器接口 | 基础容器,懒加载(getBean 时才实例化),提供最基本的 IoC 能力 |
ApplicationContext |
BeanFactory 子接口 | 饿汉式(启动时就单例预实例化),额外提供 AOP、事件、国际化、资源加载、注解配置等企业级能力 |
我们日常用的 AnnotationConfigApplicationContext、ClassPathXmlApplicationContext 都是 ApplicationContext 的实现。
Bean 生命周期(必背)
一个 Bean 从无到有,标准流程是:
- 实例化(Instantiation):
new出对象,属性还是 null; - 属性填充(Populate Bean):按
@Autowired/@Resource注入依赖; - Aware 接口回调:
BeanNameAware、BeanFactoryAware、ApplicationContextAware; - BeanPostProcessor#postProcessBeforeInitialization:初始化前后置处理(
@PostConstruct在这里被 CommonAnnotationBeanPostProcessor 处理); - InitializingBean#afterPropertiesSet 或自定义
init-method; - BeanPostProcessor#postProcessAfterInitialization:初始化后后置处理——AOP 代理对象就是在这里生成的;
- 使用;
- 销毁:
@PreDestroy→DisposableBean#destroy→destroy-method。
记住两个” BeanPostProcessor 夹”:所有初始化方法都夹在前后两个 postProcess 之间,这是理解 Spring 扩展点的关键。
@Component
public class MyBean implements BeanNameAware {
@Override
public void setBeanName(String name) {
System.out.println("Bean 名字是: " + name);
}
}
三、Spring AOP:JDK 动态代理 vs CGLIB
AOP 的本质是在目标方法前后织入横切逻辑,Spring 提供两种代理实现:
| 维度 | JDK 动态代理 | CGLIB |
|---|---|---|
| 要求 | 目标类必须实现接口 | 不需要接口,直接代理类 |
| 实现原理 | 基于接口,运行时生成接口实现类 | 基于继承,运行时生成子类 |
| 限制 | 不能代理未实现接口的类 | 不能代理 final 类 / final 方法(无法继承) |
| 性能 | 早期 JDK 创建快、调用慢;JDK 8+ 已反超 | 创建慢、调用快(字节码生成) |
SpringBoot 2.x 默认 proxyTargetClass=true,即强制使用 CGLIB,不再要求业务类实现接口。
// 一个最小的切面
@Aspect
@Component
public class LogAspect {
@Around("execution(* com.demo.service.*.*(..))")
public Object log(ProceedingJoinPoint pjp) throws Throwable {
long start = System.currentTimeMillis();
try {
return pjp.proceed(); // 执行目标方法
} finally {
System.out.println(pjp.getSignature() + " cost="
+ (System.currentTimeMillis() - start) + "ms");
}
}
}
织入时机:Spring AOP 是运行时织入(Runtime Weaving),在 Bean 生命周期的”初始化后后置处理”步骤,由 AnnotationAwareAspectJAutoProxyCreator 判断该 Bean 是否需要代理,需要则生成代理对象替换原 Bean 放进容器。这也是为什么在类内部自调用(this.method())不会走代理——this 是原始对象,不是代理对象。
四、SpringMVC 执行流程
一个 HTTP 请求进来,到 @RequestMapping 方法返回,完整链路:
1. 请求到达 DispatcherServlet(前端控制器)
2. DispatcherServlet 调 HandlerMapping
根据 URL 找到 HandlerExecutionChain(Handler 方法 + 拦截器链)
3. DispatcherServlet 调 HandlerAdapter
4. HandlerAdapter 反射调用 Controller 方法
5. 方法返回 ModelAndView(或 @ResponseBody 直接写 JSON)
6. 若返回视图:ViewResolver 解析 View → 渲染数据
7. 若 @ResponseBody:HttpMessageConverter 把对象转 JSON 写响应
8. 拦截器 postAfterCompletion 执行
9. 响应回客户端
面试高频:SpringMVC 中 @ResponseBody 是怎么把对象转 JSON 的? 答:由
RequestResponseBodyMethodProcessor处理,它内部遍历配置好的HttpMessageConverter(默认MappingJackson2HttpMessageConverter),把返回值序列化成 JSON 写入 response。
五、MyBatis:缓存与 #{} vs ${}
#{} vs ${}
这是 MyBatis 最高频的面试点,务必答清楚:
| 写法 | 编译期处理 | SQL 注入 | 适用 |
|---|---|---|---|
#{} |
预编译占位符 ?,PreparedStatement 设参 |
防注入 | 传值 |
${} |
字符串直接拼接进 SQL | 有注入风险 | 传表名/列名/排序字段(动态 SQL 结构) |
<!-- 正确:值用 #{} -->
<select id="findById" resultType="User">
SELECT * FROM user WHERE id = #{id}
</select>
<!-- 必要:动态排序字段用 ${}(必须自己白名单校验) -->
<select id="list" resultType="User">
SELECT * FROM user ORDER BY ${orderBy}
</select>
一级缓存与二级缓存
- 一级缓存:SqlSession 级别,默认开启。同一个 SqlSession 内,相同 SQL 直接命中。执行
update/insert/delete/commit都会清空。 - 二级缓存:Mapper(namespace)级别,需手动开启。多个 SqlSession 共享。
<!-- 开启二级缓存 -->
<cache eviction="LRU" flushInterval="60000" size="512" readOnly="true"/>
生产环境一般不推荐二级缓存,因为粒度粗、容易脏数据,更多直接用 Redis 做业务层缓存。
六、学习路线建议
按这套课程的模块顺序,建议这样推进:
- 先打 Spring 地基(Spring 模块):从架构设计 → IoC 源码 → AOP 源码 → MVC 源码,每读一个核心类就写个最小 demo 验证;
- 再读 MyBatis:MyBatis 源码相对小巧,适合第一次读框架源码练手,重点看
Configuration、Executor、StatementHandler三个角色; - SpringBoot:重点不是它怎么启动,而是自动装配——
@SpringBootApplication里的@EnableAutoConfiguration怎么扫META-INF/spring.factories; - SpringCloud:Nacos(注册+配置)→ OpenFeign(远程调用)→ Gateway(网关)→ Sentinel(流控降级),把整条微服务链路串起来;
- RocketMQ / Tomcat / Spring Data:作为拓展,按业务需要深入。
七、高频面试题速查
- BeanFactory 和 ApplicationContext 的区别?
- Bean 生命周期说一遍?AOP 代理对象在哪一步生成?
- 循环依赖怎么解决?为什么三级缓存不是两级?
- JDK 动态代理和 CGLIB 的区别?SpringBoot 默认用哪个?
- 为什么 this.method() 自调用不走 AOP?
- SpringMVC 一个请求的完整流程?
- MyBatis #{} 和 ${} 的区别?一级二级缓存?
- SpringBoot 自动装配原理?
- Nacos 作为注册中心和配置中心的工作机制?
- Sentinel 限流和熔断降级的区别?
八、写在最后
读源码最大的误区是”从 main 方法开始一行一行读”。正确姿势是带着问题读:先写 demo、打 debugger、观察关键节点,再带着断点去看源码。这套课程每个模块都配了”造轮子”环节——手写 IoC、手写 AOP、手写 MVC、手写 Starter——强烈建议你跟着敲一遍,写过一遍比读十遍都管用。
📁 目录结构
目录概览
📋 点击展开查看课程七大模块大纲
[V2]Java七大热门技术框架源码解析【完结】/
├── Mybatis 架构及源码解析
│ ├── 架构分层 / 数据处理流程
│ ├── 配置文件解析 / SQL 执行 / 缓存实现源码
│ ├── 动态 SQL / 复杂映射 / 插件 / 自定义 Redis 二级缓存
│ └── 手写 SQL 与业务分离的迷你框架
├── RocketMQ
│ ├── 消息队列基本概念 / 架构 / 特性
│ ├── NameServer / Broker / Producer / Consumer 启动与收发源码
│ ├── 双主双从集群 / 通信机制 / 负载均衡 / 事务消息
│ └── 二次改造:自定义延时消息
├── Spring
│ ├── 概述 / 架构设计 / 核心模块
│ ├── IoC 容器源码 / 注解源码 / AOP 源码 / MVC 源码 / WebFlux
│ ├── 应用技巧:Resource / Validation / SpEL / 缓存 / 调度
│ ├── 二次改造:自定义 BeanPostProcessor / FactoryBean / 注解
│ └── 手写 IoC / AOP / MVC 框架
├── Spring Boot
│ ├── 架构设计:Starter / AutoConfiguration / Actuator / 外部配置
│ ├── 启动流程 / 事件监听 / 配置加载 / 智能装配源码
│ ├── 应用技巧:热部署 / Banner / 日志 / 打包 / Docker
│ └── 自定义 Starter / 自定义 AutoConfiguration / FailureAnalyzer
├── Spring Cloud
│ ├── 框架概述(注册发现 / 负载均衡 / 远程调用 / 网关 / 流控降级)
│ ├── Nacos(注册 + 配置)
│ ├── LoadBalancer / OpenFeign / Gateway / Sentinel
├── Spring Data 源码解析
│ ├── Commons / JPA / REST / Redis / ES / MongoDB
└── Tomcat 源码深度解析
├── 架构设计 / 核心组件 / 类加载器 / 容器初始化 / 请求处理 / 线程模型
└── 性能优化 / 集群 Session 共享 / 手写 Web 服务器
资源获取
💡 建议:尽快保存到本地网盘或电脑,避免分享链接后期失效。
整理不易,如果对你有帮助,欢迎分享给更多需要的朋友。













请登录后查看评论内容