spring整体架构分析

403 阅读2分钟

上一篇 spring5.3.x源码阅读环境搭建

一、前言

我相信很多朋友都有过想阅读源码的想法,或者有的朋友已经从环境搭建就已经停滞不前,抽象的源码更是让很多朋友望而却步,从今天开始我就同朋友们一同阅读源码,分享我在阅读源码中的技巧,提高阅读源码的能力。

二、抛出问题

  1. bean来源在哪里呢?
  2. bean时如何创建的呢?
  3. bean创建时spring干了什么事情呢?
  4. 。。。。。。

三、分析问题

接下来我们通过流程图加描述的方式来理解spring整体都帮我们干了什么事情!!!

image.png

我在这里在有必要赘述一下,spring其实基本上所有的功能都是先抽象成了接口或者抽象类,所以我们理解spring关注接口或者抽象类有什么功能就可以,如果一味的具体的实现类那么阅读spring就会是从入门到放弃。

Resource接口:

  • 这里我们先说第一个接口Resource从字面意思理解就是资源的意思,其实我们平常定义在xml,或者以注解例如@Compontent、@Service、@Configuration的方式定义的类都是其实资源,其实spring还支持从网络,磁盘文件中获取资源,稍后我们将展示。 image.png image.png

从上图中可以看出其实最终所说的资源Recource就一个InputStream流。 image.png 再看上图中的继承了Resource接口的接口,这里介绍两个,首先看ContextResourceClassPathContextResource这就是我们所熟悉的从类路径下面获取文件资源。 image.png 再看FileSystemResource这个可以从文件系统下面获取资源。 image.png

ResourceLoader接口:

当我们有了资源之后我们就可以利用ResourceLoader来加载资源,ResourceLoader内部存储了加载到的资源Resource getResource(String location);image.png

BeanDefinitionReader接口:

XmlBeanDefinitionReader实现了BeanDefinitionReader通过读取xml并且将读取到的资源转换为BeanDefinition image.png

AnnotatedBeanDefinitionReader类:

此类和xml功能相同,只不过此类是一个读取注解版的工具类和BeanDefinitionReader没有关系,后续介绍。

BeanDefinition接口:

我们有了资源之后spring并没有直接将资源读取并创建为对应的类,而是将读取到的资源同一封装成为了一个个的BeanDefinition存储了一些元数据信息scope(单例、原型)lazyInit(是否懒加载)等等信息。 image.png image.png 最终将这些BeanDefinition信息注册到beanDefinitionMap容器中,后续我们在读源码时会查看。

四、结束

本章讲解了spring BeanDefinition的读取架构流程 本章节先到这后续会更新spring的工厂。

上一篇 spring5.3.x源码阅读环境搭建