Spring IOC知识点总结

广义的 IOC

在这之前,我们先记住一句话。好莱坞原则:Don’t call me, we will call you. 即“不用打电话过来,我们会打给你”。

控制反转(Inversion of Control,简称IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称DI),还有一种方式叫“依赖查找”(Dependency Lookup)。通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递(注入)给它。

两种实现: 依赖查找(DL)和依赖注入(DI)。

IOC 和 DI 、DL 的关系:

image

  • DI(Dependency Injection) 是 Spring 使用的方式,容器负责组件的装配。
  • DL(Dependency Lookup)已经被抛弃。

IOC容器的原理

IOC容器其实就是一个大工厂,它用来管理我们所有的对象以及依赖关系。

  • 原理就是通过Java的反射技术来实现的!通过反射我们可以获取类的所有信息(成员变量、类名等等等)!
  • 再通过配置文件(xml)或者注解来描述类与类之间的关系
  • 我们就可以通过这些配置信息和反射技术来构建出对应的对象和依赖关系了!

我们简单来看看实际Spring IOC容器是怎么实现对象的创建和依赖的:

  1. 根据Bean配置信息在容器内部创建Bean定义注册表
  2. 根据注册表加载、实例化bean、建立Bean与Bean之间的依赖关系
  3. 将这些准备就绪的Bean放到Map缓存池中,等待应用程序调用

Spring容器(Bean工厂)可简单分成两种

  • BeanFactory

    • 这是最基础、面向Spring的
  • ApplicationContext

    • ApplicationContext是BeanFactory的子类
没有特殊要求的情况下,应该使用ApplicationContext完成。因为BeanFactory能完成的事情,ApplicationContext都能完成,并且提供了更多接近现在开发的功能。

对IOC的理解

首先,IOC控制反转

谁控制谁,控制什么,什么是反转(有反转就应该有正转了)

谁控制谁,控制什么

  • 在之前,没有IOC时,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;
  • 而现在,是由IOC专门一个容器来创建这些对象,即由Ioc容器来控制对 象的创建;
  • 谁控制谁?当然是IOC容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象还包括比如文件等)。

所谓反转

  • 有反转就应该有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;
  • 而所谓的反转,其实是反转的控制权,由 Spring 来控制对象的生命周期,那么对象的控制就完全脱离了我们的控制,控制权交给了Spring 。这个反转是指:我们由对象的控制者变成了 IOC 的被动控制者。

其次,说到IOC就会想到DI 依赖注入(IOC 是通过DI来实现的),那么:

谁依赖谁,为什么需要依赖;谁注入谁,注入了什么

  • 谁依赖谁:A对象 依赖于 IOC 容器。
  • 为什么需要依赖:A对象需要 IOC 容器提供对象需要的数据、B对象 等外部资源,没有这些资源不能完成业务处理。
  • 谁注入谁:IOC 容器注入 A对象。
  • 注入了什么:IOC 容器将 A对象 需要的数据、B对象等外部资源按需注入给对象。

好处: 降低了开发的成本,提高了代码复用率、软件的灵活性。

总结

IOC:不是什么技术,而是一种设计思想。在 Spring 开发中,由 IOC 容器控制对象的创建、初始化、销毁等。这也就实现了对象控制权的反转,由我们对对象的控制转变成了Spring IOC 对对象的控制

DI:是 IOC 的具体实现。程序把依赖交给容器,容器帮你管理依赖。


我的人生成长之路
Good good study, day day up!

为 API 生,为框架死,为 debug 奋斗一辈子;

889 声望
33 粉丝
0 条评论
推荐阅读
微信JSAPI支付 (签名问题)
jsapi微信底层就不过多描述了,主要记录一下,查了很多资料,发现微信返回参数不能直接返给前端使用,还需要进行一次签名,不然前台就会提示签名错误

潘佳琦阅读 302

Java项目是不是分布式,真有那么重要吗?
「微服务」「分布式」在我刚毕业的时候还是比较关注的,那时候还入门了一把SpringCloud,写了一篇很长的文章,还是很顶的,有不少的大号都给我转载了,在知乎又获得了很多的赞。

Java3y2阅读 586评论 1

线上FullGC问题排查实践——手把手教你排查线上问题 | 京东云技术团队
观察该机器日志发现,此时有很多线程在执行跑批任务。正常来说,跑批任务是低CPU高内存型,所以此时考虑是FullGC引起的大量CPU占用(之前有类似情况,告知用户后重启应用后解决问题)。

京东云开发者2阅读 339

封面图
Spring Framework IOC 原理
Spring Framework 提供了除IOC之外的很多有意思的功能,深入研究其技术原理,可在项目技术选型上提供更多的思路和技术把控。Spring Framewrok 代码由大佬精心打磨,可以从功能实现上学习和模仿。另外Spring Frame...

Mario1阅读 699

SpringBoot可以同时处理多少请求?
我们都知道,SpringBoot默认的内嵌容器是Tomcat,也就是我们的程序实际上是运行在Tomcat里的。所以与其说SpringBoot可以处理多少请求,倒不如说Tomcat可以处理多少请求。

码猿技术专栏1阅读 602

Java-微服务架构之认证服务
之前通过阅读《Spring微服务实战》写过关于spring-cloud+spring-security+oauth2的认证服务和资源服务文章,以及写过关于spring-gateway做token校验的文章,但是在实战过程中还是发现一些问题,于是通过跟朋友沟...

Awbeci阅读 1.1k

【奶奶看了都会】GPT3.5接入企业微信,可连续对话
小伙伴们,这周OpenAI放出大招,开放了GPT3.5的API。说简单点,就是提供了和GPT页面对话一样模型的接口。而之前接的GPT接口都是3.0,并不是真正的GPT。废话少说,先来看看效果,这次最大的不同是能连续对话了

卷福同学阅读 1k

封面图

为 API 生,为框架死,为 debug 奋斗一辈子;

889 声望
33 粉丝
宣传栏