type
status
date
slug
summary
tags
category
icon
password
 
Spring 源码分析注释及测试代码 GitHub 仓库如下:
spring-framework
niuxvdongUpdated Dec 3, 2022

一、概述

 

核心组件接口

 
  1. Resource+ResourceLoader:资源和资源加载接口
  1. BeanFactory:顶层工厂接口
  1. BeanDefinition:存储 Bean 定义信息
  1. BeanDefinitionReader:BeanDefinition 读取器
  1. BeanDefinitionRegistry:BeanDefinition 档案馆,是一个 Map
  1. SingletonBeanRegistry
  1. ApplicationContext
  1. Aware
 

Spring 框架整体流程

 
  1. 不管是用 XML 还是注解也好,最终形成一份组件或者功能的配置清单。
  1. Spring 用 Resource 来表示所有的资源
  1. 这些资源被 ResourceLoader 加载然后交给 BeanDefinitionReader 解析成 BeanDefinition(Bean的定义信息)。BeanDefinition 就是一个对象的图纸,模板。
  1. 然后将这些 BeanDefinition 放入到 BeanDefinitionRegistry(其实就是一个Map)里,等待以后使用。
  1. 最后根据BeanDefinition创建一个个的对象。
 
notion image

二、Resource 资源接口

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

三、ResourceLoader 资源加载接口

 
接口定义的方法:
 
notion image
 
 
ResourceLoad 接口常见实现类如下:
  1. DefaultResourceLoader:默认资源加载器
    1. ClassRelativeResourceLoader:能读取类路径相对路径
    2. FileSystemResourceLoader:能读取文件系统的
    3. ServletContextResourceLoader:能读取web环境的
 
源码注释中,Strategy interface(策略接口),显然用到了策略模式
  • 策略模式的环境类是 AbstractApplicationContext,持有一个 ResourcePatternResolver,
feat:Resource、ResourceLoader 资源加载接口,策略模式
 

四、BeanFactory 顶层工厂接口

 
GitHub 提交历史:
feat:BeanFactory 顶层接口分析
 
BeanFactory 部分代码及注释如下:
  • 工厂方法模式
  • 单例模式
  • 原型模式
 
 

BeanFactory 接口继承图

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

AbstractApplicationContext

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

GenericApplicationContext

 
notion image
 
是 ApplicationContext 的子类,组合了 DefaultListableBeanFactory。
 
 

DefaultListableBeanFactory

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

五、BeanDefinition 接口注册调用堆栈流程

 

BeanDefinition 流程图

 
notion image

Debug 断点堆栈信息一

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

Debug 断点堆栈信息二

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

六、ApplicationContext 接口

 
 
IOC 容器拥有的功能:
  1. ioc事件派发器
  1. 国际化解析
  1. bean工厂功能—自动装配被组合进来的
  1. 资源解析功能
 
 
notion image
 

七、Aware 接口

 

Aware 接口流程图

 
notion image
 

Aware 接口概述

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

Debug 断点堆栈信息

 
可以在 Person 构造方法处以及实现了 ApplicationContextAware 接口重写的 set 方法里打个断点,可以清楚看到创建对象过程,以及 Aware 接口 底层组件注入的过程(利用后置处理器BeanPostProcessor + InitializingBean)。
notion image
 
 
Aware 接口回调调用堆栈流程 GitHub 提交历史:
feat:Aware 接口回调逻辑
 

八、属性赋值过程

 

基于 XML 的 Debug 断点堆栈信息

  • set普通属性以及Aware接口属性
 
notion image
 
主要流程图如下方红框:
  • 普通属性都在创建Bean完成后,调用populateBean方法进行赋值
  • 实现了Aware接口的赋值则属于增强逻辑,是在普通属性赋值完成之后利用回调机制和多态对属性进行赋值(利用后置处理器
notion image
 
xml 属性赋值调用堆栈流程 GitHub 提交历史:
feat:基于 xml 的自动装配 Debug 堆栈链
 

基于 注解 的 Debug 断点堆栈信息

 
使用注解配置 Debug 启动,同样断点打在几个 set 方法里。
 
注解版本流程图:绿框内的红色框,同样是通过后置处理器进行处理
  • 注解版本的赋值同样是利用 后置处理器 AutowiredAnnotationBeanPostProcessor 进行赋值
 
notion image
 
注解版本 属性赋值调用堆栈流程 GitHub 提交历史:
feat:基于 注解 的自动装配 Debug 堆栈链
 
Spring 源码系列第二章 - 后置工厂处理器与 Bean 生命周期行为型模式之迭代器设计模式
Loading...
ITNXD
ITNXD
一个普通的干饭人🍚
最新发布
Java 并发编程
2025-7-31
Spring 源码系列第三章 - 后置 Bean 处理器与 Bean 生命周期
2022-12-25
Spring 源码系列第一章 - Spring 核心组件接口
2022-12-11
Spring 源码系列第二章 - 后置工厂处理器与 Bean 生命周期
2022-12-10
行为型模式之迭代器设计模式
2022-12-2
行为型模式之责任链设计模式
2022-12-1