Spring系列源码分析-3

Spring整体架构

为什么要学习源码?

1.BUG:

在我们后来的企业级开发期间,调试一些疑难BUG,肯定都要深入到框架底层来进行调试,那如果懂得框架底层源码的时候,在调试BUG期间就会知道这个BUG是由业务逻辑某一部分导致的还是框架底层导致的,因为现在市面上的任何一个框架都不能说是毫无BUG的,都在不断的更新迭代修复,所以学好框架源码这也是必要的。

2.面试:

在面试过程当中,设计模式与框架源码也是一个高频考点。比如经常会有面试官问到:你有没有掌握某一个框架的源码?你所知道的设计模式有哪些?如果你是用另一种角度来进行回答的:比如首先你挑了一个设计模式,也比较与众不同的,你没有挑工厂模式,没有挑单例,假设你挑了一个桥接模式或者是其他模式等。接下来你又在Spring的底层找了一处功能的源码实现,然后发现它使用的就是桥接模式,那接下来应该是这么回答:

 Spring源码的底层在对于某一个功能的实现的时候,它使用了桥接模式,桥接模式它是怎么用的,并在Spring底层又达到了怎么样的一个效果。那么相信这个回答一定是出彩于任何人的,所以这就是无论从什么维度来说都应该学好源码。

Spring里面有很多核心接口,只要把这些核心接口搞清楚了,那么Spring的整个运作就非常的清楚了

在整体流程过程中,暴露出了以下信息

Spring基础接口:

1、Resource(资源)+ResourceLoader(资源加载器)

每写一个xml/注解配置都是一个Resource(资源),然后由ResourceLoader(资源加载器)去读取Resource(资源)里面的资源,然后读取完的这些资源,再转为BeanDefinition (Bean的定义信息)

2、BeanFactory(Bean工厂)

这是Spring框架里面最大的工厂,所有东西都在这个BeanFactory工厂里面

3、BeanDefinition(Bean的定义信息)

这是Bean的定义信息,这些定义信息都存在BeanDefinitionRegistry(档案馆里面)

4、BeanDefinitionReader(bean定义信息的读取器)

BeanDefinitionReader(bean定义信息的读取器)去读取资源,并把资源转成BeanDefinition,然后存到BeanDefinitionRegistry里面,最终进行制造

5、BeanDefinitionRegistry(Bean的注册中心)

这个是存Bean的定义信息的。

6、ApplicationContext

IOC容器

7、Aware 

可装配,装配Spring底层的一些组件。

Spring的生命周期-后置处理器

1、BeanFactoryPostProcessor

Bean工厂的后置增强处理器

2、InitializingBean

初始化bean

3、BeanPostProcessor

Bean的后置增强处理器

先大概了解下Spring的工作流程(具体会在后面Spring核心源码分析篇章中详细解释)

 

1、Spring暴露给程序员的就是要么写一个xml文件,要么就是写一堆注解。

2、不管这些xml文件也好还是注解也罢,最终都会生成一个组件或者功能的配置清单

3、这个组件或者功能配置的清单,Spring就要进行读取,然后这就决定了Spring框架的各种行为。

4、也就是说所有的资源都被Spring用Resources来表示,这叫资源。

5、这些资源(xml/注解),Spring底层有一个类叫ResourcesLoader(资源加载器),这个ResourcesLoader(资源加载器)就负责加载这些资源。

6、这些资源(xml/注解)写了一些组件或者功能配置,那么实际上在Spring的底层,所有的组件所有的配置都应该放在了BeanDefinition里面,也就是说(xml/注解)写的组件应该在底层对应一个叫BeanDefinition(bean的定义信息)

7、也就是说这些资源(xml/注解),在Spring底层要解析这些资源(xml/注解),然后最终生成BeanDefinition(bean的定义信息)

8、那么BeanDefinition(bean的定义信息)怎么来的?

8.1 是由一个叫BeanDefinitionReader(bean定义信息的读取器)

8.2 所以ResourcesLoader资源加载器,把这些(xml/注解)资源加载来以后交给BeanDefinitionReader(bean定义信息的读取器)

8.3 然后BeanDefinitionReader(bean定义信息的读取器)就把这些信息给读取来,然后放入Spring里面。

9、放到Spring的哪里呢?

9.1 Spring底层所有的组件,都得有这个BeanDefinition(Bean定义信息),所以就放在了BeanDefinitionRegistry档案馆里面

10 、所以在资源(xml/注解)写的配置,会被先来加载到BeanDefinitionRegistry档案馆里面,而这个BeanDefinitionRegistry档案馆就是一个map。这个Map就保存每一个组件是如何定义的。

11、相当于这个BeanDefinitionRegistry通过解析xml,把xml里面的内容解析成一个一个类,这个类就叫BeanDefinition(bean的定义信息)。

12、BeanDefinition(bean的定义信息)有了以后(也就是说只要Spring一启动,它就把所有的资源一加载,把一大堆的xml/注解都转换为BeanDefinition(bean的定义信息)以后)

13、接下来就是把这些BeanDefinition(bean的定义信息)挨个给他创建成对象。

14、如何挨个创建对象?

14.1 把所有定义的bean的信息,把它拿来经过漫长的过程就来进行对象的创建(按照bean定义信息创建对象)

14.2 只要这些对象创建完,那么就能在容器中可以获取了

15、但问题是有些时候,在容器中拿的是单实例的,那每次获取都是获取的同一个对象,那处理这些单实例就很简单

16、在整个对象创建过程中,是有各种池的:临时对象池(earlySingletonObjects),单例工厂池(singletonFactories),已注册的单例池(registeredSingletons),单例对象池(singletonObjects)。

17 、其中就有一个叫单例对象池(singletonObjects),所有创建好的单实例对象全放在这里

18、以后从工厂中获取,其实就是从这个单例对象池(singletonObjects)里面进行获取的

这是整个Spring的大致工作流程也就是以上这个样子

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值