从“会用”到“懂透”,Spring 进阶的必经之路
Spring 早已成为 Java 开发的事实标准,但对于许多开发者而言,停留在“调用 API”和“拷贝配置”的层面,往往意味着遇到复杂 bug 时无从下手,或者在技术选型时缺乏判断依据。这套课程的核心价值,在于跳出“说明书式”的教学,转而深入剖析 Spring 框架背后的设计哲学与核心编程思想。它不满足于告诉你“怎么用”,而是通过拆解 Java 语言特性、JDK API 取舍以及模块化设计逻辑,揭示 Spring 是如何将这些基础能力转化为强大框架特性的。对于正处于职业瓶颈期、渴望从 CRUD 工程师向架构思维转型的开发者来说,这是一次补齐底层认知短板的绝佳机会。
适合人群与前置要求
本课程并非面向零基础新手。读者需要具备扎实的 Java 基础,熟悉面向对象编程思想,并有过实际的 Spring Boot 或 Spring MVC 项目开发经验。如果你已经能够独立完成常规的 Web 接口开发,但对 IoC(控制反转)、DI(依赖注入)和 AOP(面向切面编程)的理解仅停留在概念层面,或者在使用 Spring 时经常困惑于“为什么这样设计”,那么这套课程非常适合你。它假设你已经“会写代码”,目标是将你的理解从“语法应用”提升到“框架设计”的高度。
学习路径建议
建议的学习顺序应从宏观架构入手,再回归微观实现。首先重点攻克“Spring 模块化设计”与“核心特性总览”,建立对整个框架版图的空间认知,明白各个模块(如 Core、Beans、Context、AOP)之间的职责边界。随后,深入“Java 语言特性运用”与“JDK API 实践”章节,这是理解 Spring 源码最关键的钥匙,重点掌握反射、动态代理在 Spring 中的具体落地方式。最后,结合“Spring 编程模型”与“版本特性演进”,将碎片化的知识点串联成线,理解 Spring 如何随着 JDK 版本的迭代而自我进化。这种由面到点、再由点及面的学习方式,能最大程度降低认知负荷。
学完能独立做什么
完成本课程的学习后,你应当具备以下能力:第一,能够清晰阐述 Spring 核心模块的设计意图,不再将 IoC 容器视为黑盒,而是理解其 Bean 生命周期管理的每一个关键节点;第二,具备初步的源码阅读能力,能够追踪 Spring 如何处理依赖注入、如何代理目标对象,从而在遇到“Bean 循环依赖”或“AOP 失效”等疑难杂症时,能通过原理分析快速定位问题根源;第三,能够根据业务场景合理选用 Spring 提供的扩展点,而非盲目堆砌注解。这些能力将直接转化为你在面试中的技术深度,以及在复杂企业级项目中的架构把控力。请配合课程中的代码示例进行动手复现,唯有通过实操验证理论,才能真正将这套编程思想内化为自己的技能。
课程目录
未分组
- 01 _ 课程介绍
- 02 _ 内容综述
- 03 _ 课前准备:学习三件套(工具、代码与大脑)
- 04 _ 特性总览:核心特性、数据存储、Web技术、框架整合与测试
- 05 _ Spring版本特性:Spring各个版本引入了哪些新特性?
- 06 _ Spring模块化设计:Spring功能特性如何在不同模块中组织?
- 07 _ Java语言特性运用:各种Java语法特性是怎样被Spring各种版本巧妙运用的?
- 08 _ JDK API实践:Spring怎样取舍Java I_O、集合、反射、动态代理等API的使用?
- 09 _ Java EE API整合:为什么Spring要与“笨重”的Java EE共舞?
- 10 _ Spring编程模型:Spring实现了哪些编程模型?
- 11 _ Spring核心价值:我们能从Spring Framework中学到哪些经验和教训呢?
- 12 _ 面试题精选
- 13 _ IoC发展简介:你可能对IoC有些误会?
- 14 _ IoC主要实现策略:面试官总问IoC和DI的区别,他真的理解吗?
- 15 _ IoC容器的职责:IoC除了依赖注入,还涵盖哪些职责呢?
- 16 _ 除了Spring,还有其它的IOC容器实现吗?
- 17 _ 传统IoC容器实现:JavaBeans也是IoC容器吗?
- 18 _ 轻量级IoC容器:如何界定IoC容器的“轻重”?
- 19 _ 依赖查找 VS. 依赖注入:为什么Spring总会强调后者,而选择性忽视前者?
- 20 _ 构造器注入 VS. Setter 注入:为什么Spring官方文档的解读会与作者的初心出现偏差?
- 21 _ 面试题精选
- 22 _ Spring IoC依赖查找:依赖注入还不够吗?依赖查找存在的价值几何?
- 23 _ Spring IoC依赖注入:Spring提供了哪些依赖注入模式和类型呢?
- 24 _ Spring IoC依赖来源:依赖注入和查找的对象来自于哪里?
- 25 _ Spring IoC配置元信息:Spring IoC有哪些配置元信息?它们的进化过程是怎样的?
- 26 _ Spring IoC容器:BeanFactory和ApplicationContext谁才是Spring IoC容器?
- 27 _ Spring应用上下文:ApplicationContext除了IoC容器角色,还提供哪些特性?
- 28 _ 使用Spring IoC容器:选BeanFactory还是ApplicationContext?
- 29 _ Spring IoC容器生命周期:IoC容器启停过程中发生了什么?
- 30 _ 面试题精选
- 31 _ 定义Bean:什么是BeanDefinition?
- 32 _ BeanDefinition元信息:除了Bean名称和类名,还有哪些Bean元信息值得关注?
- 33 _ 命名Spring Bean:id和name属性命名Bean,哪个更好?
- 34 _ Spring Bean的别名:为什么命名Bean还需要别名?
- 35 _ 注册Spring Bean:如何将BeanDefinition注册到IoC容器?
- 36 _ 实例化Spring Bean:Bean实例化的姿势有多少种?
- 37 _ 初始化Spring Bean:Bean初始化有哪些方式?
- 38 _ 延迟初始化Spring Bean:延迟初始化的Bean会影响依赖注入吗?
- 39 _ 销毁Spring Bean: 销毁Bean的基本操作有哪些?
- 40 _ 回收Spring Bean:Spring IoC容器管理的Bean能够被垃圾回收吗?
- 41 _ 面试题精选
- 42 _ 依赖查找的今世前生:Spring IoC容器从Java标准中学到了什么?
- 43 _ 单一类型依赖查找:如何查找已知名称或类型的Bean对象?
- 44 _ 集合类型依赖查找:如何查找已知类型多个Bean集合?
- 45 _ 层次性依赖查找:依赖查找也有双亲委派?
- 46 _ 延迟依赖查找:非延迟初始化Bean也能实现延迟查找?
- 47 _ 安全依赖查找
- 48 _ 内建可查找的依赖:哪些Spring IoC容器内建依赖可供查找?
- 49 _ 依赖查找中的经典异常:Bean找不到?Bean不是唯一的?Bean创建失败?
- 50 _ 面试题精选
- 51 _ 依赖注入的模式和类型:Spring提供了哪些依赖注入的模式和类型?
- 52 _ 自动绑定(Autowiring):为什么Spring会引入Autowiring?
- 53 _ 自动绑定(Autowiring)模式:各种自动绑定模式的使用场景是什么?
- 54 _ 自动绑定(Autowiring)限制和不足:如何理解和挖掘官方文档中深层次的含义?
- 55 _ Setter方法依赖注入:Setter注入的原理是什么?
- 56 _ 构造器依赖注入:官方为什么推荐使用构造器注入?
- 57 _ 字段注入:为什么Spring官方文档没有单独列举这种注入方式?
- 58 _ 方法注入:方法注入是@Autowired专利吗?
- 59 _ 接口回调注入:回调注入的使用场景和限制有哪些?
- 60 _ 依赖注入类型选择:各种依赖注入有什么样的使用场景?
- 61 _ 基础类型注入:String和Java原生类型也能注入Bean的属性,它们算依赖注入吗?
- 62 _ 集合类型注入:注入Collection和Map类型的依赖区别?还支持哪些集合类型?
- 63 _ 限定注入:如何限定Bean名称注入?如何实现Bean逻辑分组注入?
- 64 _ 延迟依赖注入:如何实现延迟执行依赖注入?与延迟依赖查找是类似的吗?
- 65 _ 依赖处理过程:依赖处理时会发生什么?其中与依赖查找的差异在哪?
- 66 _ @Autowired注入:@Autowired注入的规则和原理有哪些?
- 67 _ JSR-330 @Inject注入:@Inject与@Autowired的注入原理有怎样的联系?
- 68 _ Java通用注解注入原理:Spring是如何实现@Resource和@EJB等注解注入的?
- 69 _ 自定义依赖注入注解:如何最简化实现自定义依赖注入注解?
- 70 _ 面试题精选
- 71 _ 依赖查找的来源:除容器内建和自定义Spring Bean之外,还有其他来源提供依赖查找吗?
- 72 _ 依赖注入的来源:难道依赖注入的来源与依赖查找的不同吗?
- 73 _ Spring容器管理和游离对象:为什么会有管理对象和游离对象?
- 74 _ Spring Bean Definition作为依赖来源:Spring Bean的来源
- 75 _ 单例对象作为依赖来源:单体对象与普通Spring Bean存在哪些差异?
- 76 _ 非Spring容器管理对象作为依赖来源:如何理解ResolvableDependency?
- 77 _ 外部化配置作为依赖来源:@Value是如何将外部化配置注入Spring Bean的?
- 78 _ 面试题精选
- 79 _ Spring Bean作用域:为什么Spring Bean需要多种作用域?
- 80 _ _singleton_ Bean作用域:单例Bean在当前Spring应用真是唯一的吗?
- 81 _ _prototype_ Bean作用域:原型Bean在哪些场景下会创建新的实例?
- 82 _ _request_ Bean作用域:request Bean会在每次HTTP请求创建新的实例吗?
- 83 _ _session_ Bean作用域:session Bean在Spring MVC场景下存在哪些局限性?
- 84 _ _application_ Bean作用域:application Bean是否真的有必要?
- 85 _ 自定义Bean作用域:设计Bean作用域应该注意哪些原则?
- 86 _ 课外资料:Spring Cloud RefreshScope是如何控制Bean的动态刷新?
- 87 _ 面试题精选
- 88 _ Spring Bean 元信息配置阶段:BeanDefinition配置与扩展
- 89 _ Spring Bean 元信息解析阶段:BeanDefinition的解析
- 90 _ Spring Bean 注册阶段:BeanDefinition与单体Bean注册
- 91 _ Spring BeanDefinition合并阶段:BeanDefinition合并过程是怎样出现的?
- 92 _ Spring Bean Class加载阶段:Bean ClassLoader能够被替换吗_
- 93 _ Spring Bean实例化前阶段:Bean的实例化能否被绕开?
- 94 _ Spring Bean实例化阶段:Bean实例是通过Java反射创建吗?
- 95 _ Spring Bean实例化后阶段:Bean实例化后是否一定被是使用吗?
- 96 _ Spring Bean属性赋值前阶段:配置后的PropertyValues还有机会修改吗?
- 97 _ Aware接口回调阶段:众多Aware接口回调的顺序是安排的?
- 98 _ Spring Bean初始化前阶段:BeanPostProcessor
- 99 _ Spring Bean初始化阶段:@PostConstruct、InitializingBean以及自定义方法
- 100 _ Spring Bean初始化后阶段:BeanPostProcessor
- 101 _ Spring Bean初始化完成阶段:SmartInitializingSingleton
- 102 _ Spring Bean销毁前阶段:DestructionAwareBeanPostProcessor用在怎样的场景_
- 103 _ Spring Bean销毁阶段:@PreDestroy、DisposableBean以及自定义方法
- 104 _ Spring Bean垃圾收集(GC):何时需要GC Spring Bean?
- 105 _ 面试题精选
- 106 _ Spring配置元信息:Spring存在哪些配置元信息?它们分别用在什么场景?
- 107 _ Spring Bean配置元信息:BeanDefinition
- 108 _ Spring Bean属性元信息:PropertyValues
- 109 _ Spring容器配置元信息
- 110 _ 基于XML资源装载Spring Bean配置元信息
- 111 _ 基于Properties资源装载Spring Bean配置元信息:为什么Spring官方不推荐?
- 112 _ 基于Java注解装载Spring Bean配置元信息
- 113 _ Spring Bean配置元信息底层实现之XML资源
- 114 _ Spring Bean配置元信息底层实现之Properties资源
- 115 _ Spring Bean配置元信息底层实现之Java注解
- 116 _ 基于XML资源装载Spring IoC容器配置元信息
- 117 _ 基于Java注解装载Spring IoC容器配置元信息
- 118 _ 基于Extensible XML authoring 扩展Spring XML元素
- 119 _ Extensible XML authoring扩展原理
- 120 _ 基于Properties资源装载外部化配置
- 121 _ 基于YAML资源装载外部化配置
- 122 _ 面试题
- 123 _ 引入动机:为什么Spring不使用Java标准资源管理,而选择重新发明轮子?
- 124 _ Java标准资源管理:Java URL资源管理存在哪些潜规则?
- 125 _ Spring资源接口:Resource接口有哪些语义?它是否“借鉴”了SUN的实现呢?
- 126 _ Spring内建Resource实现:Spring框架提供了多少种内建的Resource实现呢?
- 127 _ Spring Resource接口扩展:Resource能否支持写入以及字符集编码?
- 128 _ Spring资源加载器:为什么说Spring应用上下文也是一种Spring资源加载器?
- 129 _ Spring通配路径资源加载器:如何理解路径通配Ant模式?
- 130 _ Spring通配路径模式扩展:如何扩展路径匹配的规则?
- 131 _ 依赖注入Spring Resource:如何在XML和Java注解场景注入Resource对象?
- 132 _ 依赖注入ResourceLoader:除了ResourceLoaderAware回调注入,还有哪些注入方法?
- 133 _ 面试题精选
- 134 _ Spring国际化使用场景
- 135 _ Spring国际化接口:MessageSource不是技术的创造者,只是技术的搬运工?
- 136 _ 层次性MessageSource:双亲委派不是ClassLoader的专利吗?
- 137 _ Java国际化标准实现:ResourceBundle潜规则多?
- 138 _ Java文本格式化:MessageFormat脱离Spring场景,能力更强大?
- 139 _ MessageSource开箱即用实现:ResourceBundle +MessageFormat组合拳?
- 140 _ MessageSource内建依赖:到底“我”是谁?
- 141 _ 课外资料:SpringBoot为什么要新建MessageSource Bean?
- 142 _ 面试题精选
- 143 _ Spring校验使用场景:为什么Validator并不只是Bean的校验?
- 144 _ Validator接口设计:画虎不成反类犬?
- 145 _ Errors接口设计:复杂得没有办法理解?
- 146 _ Errors文案来源:Spring国际化充当临时工?
- 147 _ 自定义Validator:为什么说Validator容易实现,却难以维护?
- 148 _ Validator的救赎:如果没有Bean Validation,Validator将会在哪里吗?
- 149 _ 面试题精选
- 150 _ Spring数据绑定使用场景:为什么官方文档描述一笔带过?
- 151 _ Spring数据绑定组件:DataBinder
- 152 _ DataBinder绑定元数据:PropertyValues不是Spring Bean属性元信息吗?
- 153 _ DataBinder绑定控制参数:ignoreUnknownFields和ignoreInvalidFields有什么作用?
- 154 _ Spring底层JavaBeans替换实现:BeanWrapper源于JavaBeans而高于JavaBeans?
- 155 _ BeanWrapper的使用场景:Spring数据绑定只是副业?
- 156 _ 课外资料:标准JavaBeans是如何操作属性的
- 157 _ DataBinder数据校验:又见Validator
- 158 _ 面试题精选
- 159 _ Spring类型转换的实现:Spring提供了哪几种类型转换的实现?
- 160 _ 使用场景:Spring类型转换各自的使用场景以及发展脉络是怎样的?
- 161 _ 基于JavaBeans接口的类型转换:Spring是如何扩展PropertyEditor接口实现类型转换的?
- 162 _ Spring内建PropertyEditor扩展:哪些常见类型被Spring内建PropertyEditor实现?
- 163 _ 自定义PropertyEditor扩展:不尝试怎么知道它好不好用?
- 164 _ SpringPropertyEditor的设计缺陷:为什么基于PropertyEditor扩展并不适合作为类型转换?
- 165 _ Spring 3通用类型转换接口:为什么Converter接口设计比PropertyEditor更合理?
- 166 _ Spring内建类型转换器:Spring的内建类型转换器到底有多丰富?
- 167 _ Converter接口的局限性:哪种类型转换场景Converter无法满足?有什么应对之策?
- 168 _ GenericConverter接口:为什么GenericConverter比Converter更通用?
- 169 _ 优化GenericConverter接口:为什么GenericConverter需要补充条件判断?
- 170 _ 扩展Spring类型转换器:为什么最终注册的都是ConditionalGenericConverter?
- 171 _ 统一类型转换服务:ConversionService足够通用吗?
- 172 _ ConversionService作为依赖-能够同时作为依赖查找和依赖注入的来源吗?
- 173 _ 面试题精选
- 174 _ Java泛型基础:泛型参数信息在擦写后还会存在吗?
- 175 _ Java 5类型接口-Type:Java类型到底是Type还是Class?
- 176 _ Spring泛型类型辅助类:GenericTypeResolver
- 177 _ Spring泛型集合类型辅助类:GenericCollectionTypeResolver
- 178 _ Spring方法参数封装-MethodParameter:不仅仅是方法参数
- 179 _ Spring 4.2泛型优化实现-ResolvableType
- 180 _ ResolvableType的局限性:形式比人强?
- 181 _ 面试题精选
- 182 _ Java事件_监听器编程模型:为什么Java中没有提供标准实现?
- 183 _ 面向接口的事件_监听器设计模式:单事件监听和多事件监听怎么选?
- 184 _ 面向注解的事件_监听器设计模式:便利也会带来伤害?
- 185 _ Spring标准事件-ApplicationEvent:为什么不用EventObject?
- 186 _ 基于接口的Spring事件监听器:ApplicationListener为什么选择单事件监听模式?
- 187 _ 基于注解的Spring事件监听器:@EventListener有哪些潜在规则?
- 188 _ 注册Spring ApplicationListener:直接注册和间接注册有哪些差异?
- 189 _ Spring事件发布器:Spring 4.2给ApplicationEventPublisher带来哪些变化?
- 190 _ Spring 层次性上下文事件传播:这是一个Feature还是一个Bug?
- 191 _ Spring内建事件(Built-in Events):为什么ContextStartedEvent和 ContextStoppedEvent是鸡肋事件? - 深入剖析源码,掌握核心编程特性
- 192 _ Spring 4.2 Payload事件:为什么说PayloadApplicationEvent并非一个良好的设计?
- 193 _ 自定义Spring事件:自定义事件业务用得上吗?
- 194 _ 依赖注入ApplicationEventPublisher:事件推送还会引起Bug?
- 195 _ 依赖查找ApplicationEventPublisher:ApplicationEventPublisher从何而来?
- 196 _ ApplicationEventPublisher底层实现:ApplicationEventMulticaster也是Java Observable的延伸?
- 197 _ 同步和异步Spring事件广播:Spring对J.U.C Executor接口的理解不够?
- 198 _ Spring 4.1事件异常处理:ErrorHandler使用有怎样的限制?
- 199 _ Spring事件_监听器实现原理:面向接口和注解的事件_监听器实现有区别吗?
- 200 _ 课外资料:Spring Boot和Spring Cloud事件也是Spring事件?
- 201 _ 面试题精选
- 202 _ Spring注解驱动编程发展历程
- 203 _ Spring核心注解场景分类
- 204 _ Spring注解编程模型
- 205 _ Spring元注解(Meta-Annotations)
- 206 _ Spring模式注解(Stereotype Annotations)
- 207 _ Spring组合注解(Composed Annotations)
- 208 _ Spring注解属性别名(Attribute Aliases)
- 209 _ Spring注解属性覆盖(Attribute Overrides)
- 210 _ Spring @Enable模块驱动
- 211 _ Spring条件注解
- 212 _ 课外资料:Spring Boot和Spring Cloud是怎样在Spring注解内核上扩展的_
- 213 _ 面试题精选
- 214 _ 理解Spring Environment抽象
- 215 _ Spring Environment接口使用场景
- 216 _ Environment占位符处理
- 217 _ 理解条件配置Spring Profiles
- 218 _ Spring 4重构@Profile
- 219 _ 依赖注入Environment
- 220 _ 依赖查找Environment
- 221 _ 依赖注入@Value
- 222 _ Spring类型转换在Environment中的运用
- 223 _ Spring类型转换在@Value中的运用
- 224 _ Spring配置属性源PropertySource
- 225 _ Spring內建的配置属性源
- 226 _ 基于注解扩展Spring配置属性源
- 227 _ 基于API扩展Spring外部化配置属性源
- 228 _ 课外资料:Spring 4.1测试配置属性源-@TestPropertySource
- 229 _ 面试题精选
- 230 _ Spring应用上下文启动准备阶段
- 231 _ BeanFactory创建阶段
- 232 _ BeanFactory准备阶段
- 233 _ BeanFactory后置处理阶段
- 234 _ BeanFactory注册BeanpostProcessor阶段
- 235 _ 初始化内建Bean:MessageSource
- 236 _ 初始化内建Bean:Spring事件广播器
- 237 _ Spring应用上下文刷新阶段
- 238 _ Spring事件监听器注册阶段
- 239 _ BeanFactory初始化完成阶段
- 240 _ Spring应用上下刷新完成阶段
- 241 _ Spring应用上下文启动阶段
- 242 _ Spring应用上下文停止阶段
- 243 _ Spring应用上下文关闭阶段
- 244 _ 面试题精选
- 245 _ 结束语
- 加餐1:为什么说ObjectFactory提供的是延迟依赖查找_
- 加餐2 _ 依赖查找(注入)的Bean会被缓存吗?
- 加餐3 _ @Bean的处理流程是怎样的?
- 加餐4 _ BeanFactory如何处理循环依赖的?
- 加餐5 _ MyBatis与Spring Framework是如何集成的?




