Spring IOC 知识点总结,写得太好了!

点击上方 "程序员小乐"关注, 星标或置顶一起成长

每天凌晨00点00分, 第一时间与你相约

每日英文

I may not be perfect, but I’m always me. Be yourself, don't change for anyone. If they don't like me at my worst, then they don't deserve me at my best.

我也许不完美,但我一直在做自己。如果他们不能接受最差的我,也就不配拥有最好的我。

每日掏心

随和,是一种能力、素质、文化和心态。随和,是淡泊名利时的超然,是曾经沧海后的井然,是狂风 暴雨中的坦然。

来自:潘佳琪 | 责编:乐乐

链接:segmentfault.com/a/1190000022015914

程序员小乐(ID:study_tech) 第 888 次推文  图源:百度

往日回顾:用漫画了解 Linux 内核到底长啥样!

     

   正文   

广义的 IOC

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

控制反转(Inversion of Control,简称 IoC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度。其中最常见的方式叫做依赖注入(Dependency Injection,简称 DI),还有一种方式叫“依赖查找”(Dependency Lookup)。

通过控制反转,对象在被创建的时候,由一个调控系统内所有对象的外界实体,将其所依赖的对象的引用传递(注入)给它。

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

IOC 和 DI 、DL 的关系:

  • 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 的具体实现。程序把依赖交给容器,容器帮你管理依赖。

欢迎在留言区留下你的观点,一起讨论提高。如果今天的文章让你有新的启发,学习能力的提升上有新的认识,欢迎转发分享给更多人。

欢迎各位读者加入订阅号程序员小乐技术群,在后台回复“加群”或者“学习”即可。

猜你还想看

阿里、腾讯、百度、华为、京东最新面试题汇集

基础原理系列:服务端 TCP 连接的 TIME_WAIT 问题

JAVA 泛型中的通配符 T,E,K,V,?

SpringBoot 源码分析之 SpringBoot 可执行文件解析

关注订阅号「程序员小乐」,收看更多精彩内容

嘿,你在看吗

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值