专栏名称: SegmentFault思否
SegmentFault (www.sf.gg)开发者社区,是中国年轻开发者喜爱的极客社区,我们为开发者提供最纯粹的技术交流和分享平台。
目录
相关文章推荐
程序员小灰  ·  3个令人惊艳的DeepSeek项目,诞生了! ·  8 小时前  
OSC开源社区  ·  2024: 大模型背景下知识图谱的理性回归 ·  2 天前  
OSC开源社区  ·  升级到Svelte ... ·  3 天前  
程序员的那些事  ·  惊!小偷“零元购”后竟向 DeepSeek ... ·  2 天前  
程序员的那些事  ·  成人玩偶 + ... ·  3 天前  
51好读  ›  专栏  ›  SegmentFault思否

Spring IOC 知识点总结

SegmentFault思否  · 公众号  · 程序员  · 2020-03-15 10:00

正文

本文转载于 SegmentFault 社区

社区专栏:我的人生成长之路

作者:潘佳琪




机广义的 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 就会想到 D I 依赖注入 (IOC 是通过 DI 来实现的), 那么:

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

·






请到「今天看啥」查看全文