Spring源码解析-总览

1、前言

复制代码
 Spring源码一直贯穿我们Java的开发中,只要你是一个Java开发人员就一定知道Spring全家桶。Spring全家桶为我们一共一站式服务,IOC、AOP更是Spring显著特性。但是Spring到底怎么为我们提供容器,管理资源的呢?

下来,我们将一步步探究Spring源码内幕。本章节主要讲述Spring源码的概述。

2、总览图

复制代码
总览图中,主要通过注解的方式探索整个源码的流程,这也是程序的入口。主要包括三个类:
  • FileSystemXmlApplicationContext

  • ClassPathXmlApplicationContext xml配置方式

  • AnnotationConfigApplicationContext 注解配置的方式

其中,AnnotationConfigApplicationContext 又分为三个大部分:

  • this() 构造函数, 构建注解需要的读取注解需要的xxxReaderxxxScanner

  • 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、后记

因为对框架的不断深入学习,后续还会不断完善各章节的内容。

相关推荐
惊讶的猫13 分钟前
意图识别置信度和检索重排的分数
java
明月_清风15 分钟前
为什么最近开始关注 JEV?几个实战案例告诉你答案
人工智能·后端
caoerzhong36 分钟前
仓库管理数字化趋势解读:JeeWMS 开源 Java WMS 视角下的五个演进方向
java·开源
GetcharZp1 小时前
5 分钟拥有自己的 S3:RustFS 上手(MinIO 的 Rust 替代,Apache 2.0 可商用)
后端
程序员JerrySUN1 小时前
Jetson Edge AI 实战01:Nano、Xavier、Orin 怎么选?Jetson 硬件选型详解【视频讲解】
java·数据库·redis·安全·mybatis
杨杨杨大侠2 小时前
RAG 到底是怎么工作的?从用户提问到模型回答的完整链路
spring·openai·ai编程
行百里er2 小时前
Redis 版本演进、新特性与协议那些事儿
redis·后端
Joy T2 小时前
Spring AI 2.0 Agent 进阶:Memory、State 与 Context Engineering 常见技术全景
java·人工智能·后端·spring·agent入门·agent state
估值探索者2 小时前
【Python量化系统工程化 #08】关了 SSH 就停?systemd 让脚本开机自启 + 异常自动拉起
java·c++·人工智能·分类·数据挖掘