16 张图解锁 Spring 的整体脉络(下)

举报
龙哥手记 发表于 2022/11/21 22:42:49 2022/11/21
【摘要】 《读尽源码 第二十二篇》

IOC 容器

当然,这时候出场的肯定是 IOC 啦。

我们都知道 IOC 是 控制反转 ,但是别忘了 容器 这个词,比如 容器的根接口BeanFactory ,容器的实现👇

  1. ClassPathXmlApplicationContext
  2. AnnotationConfigApplicationContext
  3. FileSystemXmlApplicationContext

同时我们要注意这里无处不在的 后置处理器 xxxPostProcessor 🐷

这个是 Spring 中扩展性强的原因了!

我们可以在各个过程中合理应用这些 PostProcessor 来扩展,或者修改 Bean 定义信息等等

image-20211213225748030

可以看到在这个容器中,完成了 Bean 的初始化,而这个过程还有很多细节 ,请往下看看 👇

DI 到时写 属性填充 时再介绍 🐷

BeanFactory 后置处理器

作为 IOC 容器根接口的 BeanFactory ,有着非常高的扩展性,比如最开始获取原料 BeanDefinition 时,就出现了两个针对 BeanFactory 工厂的后置处理器 👇

BeanDefinitionRegistryPostProcessor

通过该接口,我们可以自己掌控我们的 原料,通过 BeanDefinitionRegistry 接口去 新增,删除,获取我们这个 BeanDefinition

BeanFactoryPostProcessor

通过该接口,可以在 实例化对象前,对 BeanDefinition 进行修改 ,冻结 ,预实例化单例 Bean 等

经过上面层层阻碍后,我们最终会来到目标方法 getBean ,将原料投入生产,最终获取一个个 Bean 对象出来

那么随之而来的就是这个 Bean 的生命周期啦 😄

Bean 生命周期

Bean 的创建和管理有标准化的流程!

这里在我们的工厂 BeanFactory 中写得很清楚 👇

image-20210902072224002

总共 14 个步骤,是不是一下子就清晰多了 😄

image-20211213225831583

在看这部分的源码时,要多注意两个英文单词 😝

  1. 实例化 👉 Instantiation
  2. 初始化 👉 Initialization

ps: 别看快搞错了 哈哈 😝

仔细阅读上面这 14 个步骤,会发现前面 8 个都是 Aware 接口,而他们的作用也很简单,就是获取 xxAware 这个单词的前缀 xx 😄

比如事件发布器 ApplicationEventPublisher ,只要你实现了 ApplicationEventPublisherAware 接口,就可以获取 事件发布器 ApplicationEventPublisher !

Bean 后置处理器

在实例化 和 初始化流程中,把这个 Bean 的后置处理器 BeanPostProcessor 安排上,就得到下图啦 👇

image-20211213225953964

这里留意下 实例化 有扩展点 InstantiationAwareBeanPostProcessor , 初始化 扩展点 BeanPostProcessor 就非常多啦,我们主要来关注下这个 AOP

AOP

那么 AOP 是在哪个步骤代理对象的呢?👇

image-20211213230042502

可以在 AbstractAutoProxyCreator 类中看到 👇

image-20210903080803199

总结

本文就先介绍到这里啦 🐖

主要介绍了 Spring 里面的这些脉络,方便小伙伴们对它有个整体的印象先~

再介绍其中的一些扩展点,比如从源材料开始的 BeanFactoryPostprocessor ,到产物 Bean 的 BeanPostprocessor 。

实例化,初始化的顺序,Bean 的生命周期,以及 BeanFactory 及子类扩展的功能,再到 ApplicationContext 的功能。

还有这个核心机制: 工厂+XML+反射,以及 AOP 发生的地方。😋

image-20211213230212297

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。