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 容器有两大功能:
- 控制反转
即 bean 实例的不由开发者来创建,而是交给 IoC 容器来帮我们创建。这样 bean 的控制权反转过来,交给了 IoC 容器。 - 依赖注入
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-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源码三千问】为什么要用三级缓存来解决循环依赖问题?二级缓存行不行?一级缓存行不行?