上一篇 spring5.3.x源码阅读环境搭建
一、前言
我相信很多朋友都有过想阅读源码的想法,或者有的朋友已经从环境搭建就已经停滞不前,抽象的源码更是让很多朋友望而却步,从今天开始我就同朋友们一同阅读源码,分享我在阅读源码中的技巧,提高阅读源码的能力。
二、抛出问题
- bean来源在哪里呢?
- bean时如何创建的呢?
- bean创建时spring干了什么事情呢?
- 。。。。。。
三、分析问题
接下来我们通过流程图加描述的方式来理解spring整体都帮我们干了什么事情!!!
我在这里在有必要赘述一下,spring其实基本上所有的功能都是先抽象成了接口或者抽象类,所以我们理解spring关注接口或者抽象类有什么功能就可以,如果一味的具体的实现类那么阅读spring就会是从入门到放弃。
Resource接口:
- 这里我们先说第一个接口
Resource从字面意思理解就是资源的意思,其实我们平常定义在xml,或者以注解例如@Compontent、@Service、@Configuration的方式定义的类都是其实资源,其实spring还支持从网络,磁盘文件中获取资源,稍后我们将展示。
从上图中可以看出其实最终所说的资源
Recource就一个InputStream流。再看上图中的继承了
Resource接口的接口,这里介绍两个,首先看ContextResource的ClassPathContextResource这就是我们所熟悉的从类路径下面获取文件资源。再看
FileSystemResource这个可以从文件系统下面获取资源。
ResourceLoader接口:
当我们有了资源之后我们就可以利用
ResourceLoader来加载资源,ResourceLoader内部存储了加载到的资源Resource getResource(String location);。
BeanDefinitionReader接口:
XmlBeanDefinitionReader实现了BeanDefinitionReader通过读取xml并且将读取到的资源转换为BeanDefinition
AnnotatedBeanDefinitionReader类:
此类和xml功能相同,只不过此类是一个读取注解版的工具类和
BeanDefinitionReader没有关系,后续介绍。
BeanDefinition接口:
我们有了资源之后spring并没有直接将资源读取并创建为对应的类,而是将读取到的资源同一封装成为了一个个的
BeanDefinition存储了一些元数据信息scope(单例、原型)、lazyInit(是否懒加载)等等信息。![]()
最终将这些
BeanDefinition信息注册到beanDefinitionMap容器中,后续我们在读源码时会查看。
四、结束
本章讲解了spring
BeanDefinition的读取架构流程 本章节先到这后续会更新spring的工厂。