【老王读Spring IoC-0】Spring IoC引入

前言

当我们谈起 Spring 的时候,一定会说到的两个词就是 IOC 和 AOP。这两个特性是 Spring 的基石。
掌握了这两大特性的源码,那么对整个 Spring 的生态的理解就更透彻了,看起源码来也能得心应手了。

首先,我们来研究下 Spring IOC。

正文

IoC(Inversion of Control),翻译过来叫"控制反转"。IoC 最常见的方式是 DI(Dependency Injection),依赖注入,它是解决代码耦合度的一种方式。
具体的解释可以参考百度百科: https://baike.baidu.com/item/控制反转/1158025

对 IoC 的分析与理解

通常我们讲 Spring IoC 会说 IoC 容器,IoC 容器有两大功能:

  1. 控制反转
    即 bean 实例的不由开发者来创建,而是交给 IoC 容器来帮我们创建。这样 bean 的控制权反转过来,交给了 IoC 容器。
  2. 依赖注入
    bean 所依赖的属性是由 IoC 容器创建的,那这些依赖属性的赋值操作(即:依赖的注入)同样也由 IoC 容器去完成。

要实现"控制反转"功能的话,我们需要解决 bean class 的扫描问题,只有将这些 bean class 扫描出来了,我们才知道要创建哪些 bean 的实例。
要实现"依赖注入"功能的话,我们需要知道 bean 里面依赖哪些属性,然后再将依赖的属性全部通过 IoC 容器去创建,然后赋值即可。

第 1 点很简单,我们只需要扫描所有的 @Service/@Component 等注解标记的类,将它们放到一个 Map 中进行存储就可以了。

为什么要用 Map 来做为容器?
答:因为我们在做依赖注入的时候,需要根据 beanName/beanType 来查找 bean 来进行注入。

第 2 点就比较复杂了,因为依赖的注入分很多种情况:
a. 简单的依赖注入。比如 A 依赖 B
b. 连续依赖的注入。比如 A 依赖 B,B 依赖 C。这时,A 注入的 B 需要是一个完整的、填充了所有依赖的 Bean。
c. 循环依赖的注入。比如 A 依赖 B,B 依赖 C,C 又依赖 A。或者说,A 依赖 B,B 又依赖 A。

第 2 点的实现,才是 Spring IoC 的精华所在。
而且,Spring 实现的依赖注入远不止这些,还有对配置项的注入、对随机值的注入等。
注入的方式又可分为反射注入、构造注入、setter 注入、工厂方法注入等。
注入的 bean 的生命周期又可以细分为 singleton、prototype、request、session。具体可以查看 org.springframework.context.annotation.Scope

版本约定

Spring 的版本繁多,每个版本的特性都会有些差别,同一功能,在不同的版本中的实现也可能略有差异。如果事先不约定好版本,那么可能我们的对话都不在一个频道上。
所以,一切不告诉版本的源码解读都是耍流氓。
在后期的文章中,我使用的 Spring 版本都是 5.3.9,是通过 SpringBoot 2.5.3 间接引入的依赖。(每篇文章中,我都会提前说明版本)

小结

通过上面的分析,我们知道 Spring IoC 有两大特性:控制反转、依赖注入。
Spring IoC 的功能非常强大,设计也很复杂。在不熟悉的情况下,我们不太可能一下子就将所有的特性都研究完,需要一点一点各个击破。
在接下来的文章中,我会对 IoC 的两大特性分别进行研究。


系统的学习源码知识,请点击视频讲解:
SpringIoC源码由浅入深: https://download.csdn.net/course/detail/29969

源码测试工程下载:
老王读Spring IoC源码分析&测试代码下载
老王读Spring AOP源码分析&测试代码下载


扫码关注不迷路…⇩↓☟⬇︎⥥…
gzh


系列博文:
【老王读Spring IoC-0】Spring IoC 引入
【老王读Spring IoC-1】IoC 之控制反转引入
【老王读Spring IoC-2】IoC 之 BeanDefinition 扫描注册
【老王读Spring IoC-3】Spring bean 的创建过程
【老王读Spring IoC-4】IoC 之依赖注入原理
【老王读Spring IoC-5】Spring IoC 小结——控制反转、依赖注入

相关阅读:
【Spring源码三千问】@Resource 与 @Autowired 的区别
【Spring源码三千问】bean name 的生成规则
【Spring源码三千问】BeanDefinition详细分析
【Spring源码三千问】Spring 是怎样解决循环依赖问题的?
【Spring源码三千问】哪些循环依赖问题Spring解决不了?
【Spring源码三千问】@Lazy为什么可以解决特殊的循环依赖问题?
【Spring源码三千问】BeanDefinition注册、Bean注册、Dependency注册有什么区别?
【Spring源码三千问】Bean的Scope有哪些?scope=request是什么原理?
【Spring源码三千问】为什么要用三级缓存来解决循环依赖问题?二级缓存行不行?一级缓存行不行?

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

老王学源码

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值