说到Spring相信所有的Javaer都如雷贯耳,作为Java领域的世界第一框架,几乎在所有的Web项目中都能看到他的身影,随着时间的推移Spring覆盖的范围越来越广,功能也越来越多,但其最核心的思想永远都是控制反转IoC和面向切面AOP。老实说这两个特性用起来并不复杂,理论原理也并不深奥,但理解和内化的程度总有深浅之分,就像读Thinking in Java,初学者和工作两三年的人看到的东西不同,工作两三年和十年之人对内容理解的又会不一样。Tomcat之后想尽自己的能力去揭开Spring的面纱,向优秀的源码学习,提高自己代码的驾驭能力
之后的一段时间会以IoC和AOP两条主线对Spring相关代码进行分析,为了尽量减少越来越复杂的扩展功能干扰,Spring源码解析的版本定为3.2.8.RELEASE
,大家可以在https://github.com/spring-projects/spring-framework
上clone/fork
项目,再使用Gradle
进行构建,也可以通过maven
项目导入源码的方式学习源码
除了按两条主线进行讲解之外,还会根据平常使用过程中常用功能的原理性分析进行不间断“加餐”,由于客观上Spring的复杂性以及自身能力的局限性,难免出现表述不清,逻辑混乱和理解偏差,分析到如之前Tomcat源码那般不太现实,请大家见谅
在正式开始之前,我们先想一想一个最简单的,从配置文件读取配置并获得对象的流程中存在那些环节,并按照面向对象的思想对各个环节进行包装描述
- 在Spring中支持各种类型各种格式的配置文件,比如xml的形式,key-value的形式等,我们可以将这些文件抽象成一个个
Resource
资源; - 既然存在资源,那运行的时候肯定要将这些资源加载进内存进行操作,加载的动作我们也可以将其封装到一个加载器
Loader
内; - 再想想资源加载进来要干什么,毫无疑问要获得资源中的内容,那么解析资源内容对应一个阅读器
Reader
; - 大家都知道我们配置对象使用
<bean>
,当然除了<bean>
还有很多其他标签,总之这些标签也都可以抽象出来形成一个个BeanDefinition
; - 众多标签解析形成的实体肯定要在统一的地方进行管理保存,那这个地方就是
BeanFactory
; - 同样的,将标签对应实体往
BeanFactory
中存放这个动作抽象成BeanRegistery
我们按着如上6个部分推测去阅读源码,如果推测有偏差修正之,正确则关注实现细节