从Spring为什么要用IoC的支点,我撬动了整个Spring的源码脉络

前言

有一天,我翻开源码横看竖看,满屏只看到四个字,我看不懂啊。

所以是不是曾和我一样迷失在毫无头绪的源码里,在各种类和方法里翻山越岭,却如同管中窥豹。是的话,要不今晚早点睡?

呸,扯远了,写文章怎么能分神呢。

所以正当我苦恼的时候,我想起了一句话“给我一个支点我就可以撬动整个地球”,阿基米德说的。

咦,突然让我灵机一动,那撬动整个Spring源码的支点是什么呢?或者说Spring作者在开发Spring时的支点是什么呢?这么想让我开始觉得有点意思了。

如果尝试先从使用Spring的角度来看源码,好像事情也并没有那么错综复杂。

你是怎么使用Spring的,你就怎么看Spring源码!

先把镜头拉回到使用Spring后最大变化是什么?毫无疑问是改变了我们编程方式,原来是程序员自己既要定义对象,然后还要通过new的方式创建出对象。而在Spring中则我们只需要定义Bean,然后交给Spring来创建对象(从甲乙方的角度,定义对象是提需求的甲方,实现对象是执行的乙方。那么new的方式是即做甲方又做乙方。而Spring让程序员当了一回甲方)。

而这个动作就是IOC(Inversion of Control)控制反转。不过IoC不是一种具体的技术,而是一种设计思想。

那问题来了,IoC是怎么来的?

其实IoC可以追溯到一个原则,好莱坞原则。把IOC对应到这一原则,一切都很好理解,就是在IoC中,所有的对象都是被动的,对象初始化和调用都由Spring负责。

“不要给我们打电话,我们会给你打电话(don‘t call us, we‘ll call you)”这是著名的好莱坞原则。在好莱坞,把简历递交给演艺公司后就只有回家等待。由演艺公司对整个娱乐项的完全控制,演员只能被动式的接受公司的差使,在需要的环节中,完成自己的演出。—— 好莱坞原则

Bean是Spring中的图纸

为什么要有Bean,或者说Bean是什么呢?

我们知道无论是控制反转还是依赖注入都是围绕Object,而对应到Spring中也就是Bean;Bean其实是包装了的Object(对象)

所以Bean是Spring中最核心的东西,Bean`好比有了图纸,才能在Spring上建各种不同的的房子、车子。

可以说一个Bean就是经过了我们定义最后由Spring所创建的Object

(所以对于程序而言是由一堆的Object构成,那么在Spring所构成的程序里就是一堆Bean

什么是依赖注入(DI)

前面说Bean是图纸,那么我们就是拿着图纸的设计师,因为在Spring中创建Bean的工作是由Spring来承担的,所以我们要做的是定义Bean信息。如下图所示,我们通过XML,注解的方式来定义Bean的信息。

而这个我们手动的方式定义Bean的方式,我们称为是依赖注入(DI)的方式。

将程序运行需要依赖外部的资源,从外部注入到内部,而容器加载了外部的文件、对象、数据怼到程序内的对象,此时程序内外对象之间的依赖关系,就是依赖注入

所以说IoC是设计思想,那么DI就是具体的实现方式。

上面我们是我们常定义的是手动方式,而汽车都有分手动挡和自动挡,那么依赖注入方式也有分。

手动方式:

  • XML 资源配置元信息
  • Java 注解配置元信息
  • API 配置元信息

自动方式:

  • Autowiring

依赖除了有按方式,也有按注入类型区分:

  • Setter注入
  • 构造器注入
  • 接口注入
  • 方法注入

但是我们在开发中定义Bean信息的方式还可以有properties,yaml等等。

那么如果我们想要更多配置方式怎么呢?

其实Spring已经想好了,通过定义规范来约束所有需要解析操作的接口BeanDefinitionReader

如下图BeanDefinitionReader类结构图所示,可以看到那些实现BeanDefinitionReader接口的类。

  • XmlBeanDefinitionReader:读取XML文件定义的Bean。
  • PropertiesBeanDefinitionReader:可以从属性文件Resource,
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值