type
status
date
slug
summary
tags
category
icon
password
Spring 源码分析注释及测试代码 GitHub 仓库如下:
spring-framework
niuxvdong • Updated Dec 3, 2022
一、概述
核心组件接口
- Resource+ResourceLoader:资源和资源加载接口
- BeanFactory:顶层工厂接口
- BeanDefinition:存储 Bean 定义信息
- BeanDefinitionReader:BeanDefinition 读取器
- BeanDefinitionRegistry:BeanDefinition 档案馆,是一个 Map
- SingletonBeanRegistry
- ApplicationContext
- Aware
Spring 框架整体流程
- 不管是用 XML 还是注解也好,最终形成一份组件或者功能的配置清单。
- Spring 用 Resource 来表示所有的资源
- 这些资源被 ResourceLoader 加载然后交给 BeanDefinitionReader 解析成 BeanDefinition(Bean的定义信息)。BeanDefinition 就是一个对象的图纸,模板。
- 然后将这些 BeanDefinition 放入到 BeanDefinitionRegistry(其实就是一个Map)里,等待以后使用。
- 最后根据BeanDefinition创建一个个的对象。

二、Resource 资源接口
Resource 接口常见实现类如下:
- ContextResource:表示可以拿Web环境的资源
- HttpResource:可以从网络中拿到资源
- WritableResource:
- FileSystemResource:可以从文件系统拿到资源
- FileUrlResource:URL就是统一资源定位符的意思;URL可以定位到网络,磁盘,等任何你想定位到的位置;表示Spring几乎可以从任何地方拿到资源。
- AbstractResource
- ByteArrayResource:从byte数组拿到资源
- InputStreamResource:从Input流中拿到资源
- 综合来说Spring几乎可以从任何地方拿到资源。
三、ResourceLoader 资源加载接口
接口定义的方法:

ResourceLoad 接口常见实现类如下:
- DefaultResourceLoader:默认资源加载器
- ClassRelativeResourceLoader:能读取类路径相对路径
- FileSystemResourceLoader:能读取文件系统的
- ServletContextResourceLoader:能读取web环境的
源码注释中,Strategy interface(策略接口),显然用到了策略模式:
- 策略模式的环境类是 AbstractApplicationContext,持有一个 ResourcePatternResolver,
feat:Resource、ResourceLoader 资源加载接口,策略模式
四、BeanFactory 顶层工厂接口
GitHub 提交历史:
feat:BeanFactory 顶层接口分析
BeanFactory 部分代码及注释如下:
- 工厂方法模式
- 单例模式
- 原型模式
BeanFactory 接口继承图

- HierarchicalBeanFactory:定义父子工厂(父子容器)
- ListableBeanFactory:实现是 DefaultListableBeanFactory,保存了ioc容器中的核心信息。
- AutowireCapableBeanFactory:提供自动装配能力
- AnnotationApplicationContext:组合了一个总的注册中心(DefaultListableBeanFactory),它有自动装配能力。

AbstractApplicationContext

AbstractApplicationContext 就是资源加载器 ResourceLoader 策略模式的环境类,持有策略接口。
GenericApplicationContext

是 ApplicationContext 的子类,组合了 DefaultListableBeanFactory。
DefaultListableBeanFactory
类继承图:

DefaultListableBeanFactory:保存容器核心信息,拥有上面所有注册中心功能的一个总的注册中心,是 Spring 的总档案馆
- BeanDefinitionRegistry:Bean定义信息注册中心
- SimpleAliasRegistry:别名注册中心
- SingletonBeanRegistry:单实例注册中心
- BeanFactory:Bean工厂
- AutowireCapableBeanFactory:有自动装配能力的Bean工厂
- GenericApplicationContext:组合(非继承)了 DefaultListableBeanFactory, 拥有了其功能,有一个我们常用的实现类 AnnotationConfigApplicationContext,就是注解版的IOC容器
五、BeanDefinition 接口注册调用堆栈流程
BeanDefinition 流程图

Debug 断点堆栈信息一
- 我们要看BeanDefinition是何时被放入到 beanDefinitionMap,只需要在DefaultListableBeanFactory 用到
beanDefinitionMap.put()的地方打个断点。(ctrl + f 搜索即可)
- 然后 Debug 启动下面的测试类生成调用堆栈信息
端点位置以及 Debug 调用堆栈信息:

BeanDefinition 注册调用堆栈流程 GitHub 提交历史:
feat:BeanDefinition 注册调用堆栈流程
Debug 断点堆栈信息二
- 注册 BeanDefinition 肯定要 new,可以直接在 AbstractBeanDefinition 这个抽象父类的所有构造函数打断点
- 下面就是打完断点之后,运行MainTest测试类的调用栈

BeanDefinition 注册调用堆栈流程 GitHub 提交历史:
feat:断点打到必经的 AbstractBeanDefinition 的三个构造函数查看 Debug 调用堆栈
六、ApplicationContext 接口
IOC 容器拥有的功能:
- ioc事件派发器
- 国际化解析
- bean工厂功能—自动装配被组合进来的
- 资源解析功能

七、Aware 接口
Aware 接口流程图

Aware 接口概述
只要实现了 Aware 子接口的 Bean 都能获取到一个 Spring 底层组件:
- 基于回调机制

Debug 断点堆栈信息
可以在 Person 构造方法处以及实现了 ApplicationContextAware 接口重写的 set 方法里打个断点,可以清楚看到创建对象过程,以及 Aware 接口 底层组件注入的过程(利用后置处理器BeanPostProcessor + InitializingBean)。

Aware 接口回调调用堆栈流程 GitHub 提交历史:
feat:Aware 接口回调逻辑
八、属性赋值过程
基于 XML 的 Debug 断点堆栈信息
- set普通属性以及Aware接口属性

主要流程图如下方红框:
- 普通属性都在创建Bean完成后,调用populateBean方法进行赋值
- 实现了Aware接口的赋值则属于增强逻辑,是在普通属性赋值完成之后利用回调机制和多态对属性进行赋值(利用后置处理器)

xml 属性赋值调用堆栈流程 GitHub 提交历史:
feat:基于 xml 的自动装配 Debug 堆栈链
基于 注解 的 Debug 断点堆栈信息
使用注解配置 Debug 启动,同样断点打在几个 set 方法里。
注解版本流程图:绿框内的红色框,同样是通过后置处理器进行处理
- 注解版本的赋值同样是利用 后置处理器 AutowiredAnnotationBeanPostProcessor 进行赋值

注解版本 属性赋值调用堆栈流程 GitHub 提交历史:
feat:基于 注解 的自动装配 Debug 堆栈链
- 作者:ITNXD
- 链接:https://blog.itnxd.eu.org/article/chapter-1-of-spring-source-code-series-spring-core-component-interface
- 声明:本文采用 CC BY-NC-SA 4.0 许可协议,转载请注明出处。

