1、前言
Spring源码一直贯穿我们Java的开发中,只要你是一个Java开发人员就一定知道Spring全家桶。Spring全家桶为我们一共一站式服务,IOC、AOP更是Spring显著特性。但是Spring到底怎么为我们提供容器,管理资源的呢?下来,我们将一步步探究Spring源码内幕。本章节主要讲述Spring源码的概述。
2、总览图
总览图中,主要通过注解的方式探索整个源码的流程,这也是程序的入口。主要包括三个类:
-
FileSystemXmlApplicationContext
-
ClassPathXmlApplicationContext
xml配置方式 -
AnnotationConfigApplicationContext
注解配置的方式
其中,AnnotationConfigApplicationContext
又分为三个大部分:
-
this() 构造函数, 构建注解需要的读取注解需要的
xxxReader
和xxxScanner
-
register() 注册注解需要的配置类
-
refresh() 核心流程,也是所有Spring的核心关键点
refresh
是整个Spring生产Bean对象的关键流程,管理这Bean的生命周期。
-
加载配置文件
-
解析文件内容
-
装载生成Bean所需要的所有定义信息
-
初始化Bean对象
-
填充Bean对象的属性
-
Bean对象的后置处理
最终完成Bean对象的创建,其中使用三级缓存解决循环依赖的问题、扩展接口的加载与调用、aop的处理等一系列的操作。
3、整体流程示意图
整体的流程大致也是reflesh的流程。加载、解析、扩展、实例化、初始化的过程。这是Spring为我们管理Bean的生命周期,同时IOC依赖注入的整个过程。
4、关键类的认识
4.1 BeanFactory
BeanFactory
是Spring框架中一个核心接口,主要用来管理和提供程序应用的Bean,管理这Bean的整个生命周期。主要作用如下:
-
Bean创建和实例化
-
Bean依赖注入
-
Bean生命周期的管理
-
Bean的获取和查找
通过BeanFactory,我们也可以窥探一二。
4.2 FactoryBean
FactoryBean
同样也是用来创建Bean,但是FactoryBean
不必须严格遵守Bean的生命周期,用户可以快捷的创建Bean对象,从而被Spring管理。
-
通过getObject()方法获取Bean对象
-
还可以通过
&
+ 名称 获取FactoryBean
本身。 -
actoryBean可以用于装饰和增强对象。通过在getObject()方法中对实际对象进行包装或增强,可以在对象创建过程中添加额外的逻辑或功能。
4.3 DefaultListableBeanFactory
BeanFactory
的默认实现类。不指定的情况下,我们所说的BeanFactory
就是 DefaultListableBeanFactory
本尊。
4.4 RootBeanDefinition
RootBeanDefinition
封装的Bean的所有定义信息,也是Bean对象创建的核心。也是Bean父子类定义信息的合并。
4.5 BeanFactoryPostProcessor
BeanFactoryPostProcessor
Bean工厂的后置处理器,也是一个钩子方法。可以修改Bean工厂的Bean属性值。
BeanFactoryPostProcessor
是在加载Bean定义之后,实例化之前对Bean的定义进行修改。这些修改可以包括添加新的属性值、更改属性值或者删除属性值等。这个过程发生在Bean的实例化之前,因此对Bean的定义进行的任何修改都会影响到后续的Bean实例化过程。
4.6 BeanPostProcessor
BeanPostProcessor
是在Bean的实例化之后但在依赖注入之前对Bean进行定制化处理。这个过程发生在Bean的依赖注入之前,因此可以在这个阶段对Bean进行一些额外的处理,例如初始化、属性注入等。
5、后记
因为对框架的不断深入学习,后续还会不断完善各章节的内容。