在分析Spring源码之前,很容易陷入的一个误区就是,debugger一路点进去,然后迷失在茫茫的源码之中。
其实分析源码跟我们做系统开发一样,不会上来就开始撸代码,而是先做好系统的设计,然后才开始分工合作。正所谓“胸中有大纲,心中不慌张”,无论我们debugger到了何处,想想我们在地图的何处,就可以导航回去。
d7db65b7943648e49ba1425aeccce451.png f7947d8902134298a333bb8ff4d404ce.png
上图比较简略的标识了Spring容器的启动过程,所谓简略是指重点关注容器的变化过程的,比如:容器对象定义的加载、BeanFactory的后置处理,容器Bean的加载过程。而其他的过程比如属性资源的加载、监听器的处理等做了刻意的省略,在之后的Spring源码系列中,我们会用单独的章节进行介绍。
核心概念介绍
- Bean:我们知道Spring容器管理着各种各样的对象,这些对象我们统称为Bean对象
- BeanFactory:Spring并不直接对Bean对象进行实例化和初始化,这些过程都是通过BeanFactory来完成的。
- ApplicationContext:Spring进程上下文,其实这里的上下文才更接近于我们通常理解的Spring容器,它处理管理着我们的个中Bean对象,还有Environment对象,各种监听器,BeanFactory的后置处理器,Bean的后置处理器等。
- BeanDefinition:加载完spring的配置文件之后,并不是直接就生成各种Bean对象,而是将所有的定义信息封装在BeanDefinition列表中。
- BeanFactoryPostProcessor:在创建好BeanFactory对象之后,Spring会执行一些列的后置处理器,这些后置处理器给扩展留出了空间,因为持有BeanFactory对象,但凡是它已有的信息都可以进行扩展或修改,比如BeanDefinition信息,Environment信息(属性资源)等
- BeanPostProcessor:Bean的后置处理器,在Bean对象完成实例化和属性填充之后,我们有机会扩展后置处理器来对其进行修改
关键流程说明
配置信息读取
在获取BeanFactory对象的过程中,会通过BeanDefinitionReader对象进行各种配置文件的解析和读取。
BeanFactory后置处理
在执行设计的Bean对象创建过程前,我们有机会扩展BeanFactoryPostProcessor来做一些个性化的工作,比如修改BeanDefinition信息,扩充Environment等
-
实例化Bean
实例化Bean的过程是BeanFactory使用beanDefinitions来反射构建出Bean对象 -
初始化Bean
初始化Bean的过程相对比较复杂,包括对Bean的属性填充,Aware方法的调用、后置处理器的执行,以及init-method方法的调用
结语
学习Spring的过程我们可以尝试着从战略上藐视它,从战术上重视它。在大的面上,我们对几个关键对象有个了解,对整体的加载流程有个了解,可以不求甚解,但要有自己的独立认知和总结,有误差和遗漏也没有太大关系,在之后的慢慢深入分析中不断的回头来补充完善。
为什么说从战术上要重视呢?有些同学找了一个Spring的架构图看了下,写了个DEMO就说:哦,我已经理解了。其实深入源码看下去,无不是源码作者的匠心巧思,其中的扩展性考虑、对设计模式的应用、对各个模块的封装和组织都值得我们细细的去品读。
笔者原文发布在CSDN,欢迎点击查看:https://blog.csdn.net/mytream/article/details/124559529
也可以关注笔者:请给我一根烟的时间(https://blog.csdn.net/mytream),查看更多个人心得和分享
网友评论