什么是 Spring IOC?
IOC 全称:Inversion of Control,翻译为中文就是控制反转,IOC 是一种设计思想,IOC 容器是 Spring 框架的核心,它通过控制和管理对象之间的依赖关系来实现依赖注入(Dependency Injection),依赖注入是 IOC 的具体实现方式,它通过将对象的依赖关系通过构造函数、setter 方法或字段注入到对象中,从而实现了对象之间的解耦和灵活性,所谓 IOC ,其实就是由 Spring IOC 容器来负责对象的生命周期和对象之间的关系。
控制反转之灵魂拷问
- 谁控制谁:在传统开发模式下,我们需要什么对象就 new 什么对象,也就是说需要依赖的对象自己来创建,而使用了 Spring IOC 容器之后,对象的创建销毁则有 IOC 容器来控制 ,也就是说 IOC 容器控制了对象。
- 控制了什么:IOC 容器控制了对象及生命周期。
- 何为反转:反转就是由开发者去创建维护对象,反转为交给 Spring IOC 容器去维护对象,开发者维护对象是主动的,Spring IOC 容器去维护对象之后,再获取对象就是被动的了,由主动获取变为被动获取,也就是反转的由来。
- 反转了什么:对象的获取反转了,依赖的对象由主动获取变为被动获取,IOC 容器来帮对象找相应的依赖对象并注入,而不是由对象主动去找。
方便更好的理解 IOC,用图例简单说明一下
传统开发模式,所需要的对象都是自己主动创建,然后自己代码显式注入的,如图所示:
使用了 Spring IOC 模式,不在需要主动去创建这些对象了,也不需要自己代码显式注入直接从容器中获取即可,如图所示:
什么是依赖注入(DI,Dependency Injection)?
Dependency Injection 翻译为中文就是依赖注入,前面我们说了依赖注入是 IOC 的具体实现方式,依赖注入用于实现类之间的解耦和依赖关系的管理,通过依赖关系将对象的创建和维护转移到 IOC 容器中进行,使得对象的使用者不需要关心对象的创建和维护,依赖注入并没有给系统带来更多的功能,只是为系统搭建了一个灵活和扩展的平台,有了依赖注入,我们只需要进行简单配置,就可以完成业务实现,提高了开发效率。
依赖注入(DI,Dependency Injection)之灵魂拷问
- 谁依赖谁:因为应用程序不在关心对象的创建和维护,直接从 IOC 容器中获取对象,显然是应用程序依赖 IOC 容器。
- 为什么要依赖:知道了谁依赖谁,也就知道了为什么要依赖,因为应用程序不在关注对象的创建和维护,而又要使用对象,IOC 容器中有维护好的对象,自然要依赖 IOC 容器来获取对象。
- 谁注入谁:IOC 容器注入应用程序需要的对象。
依赖注入(DI,Dependency Injection)的方式?
- 属性注入:一个注解搞定,写法简单,但是不能注入 final 修饰的属性,违反单一职责原则,也不能在其他容器中使用,只能用于 IOC 容器。
- setter 注入:setter注入就是使用 Java 的 set 方法配合注解将 Bean 注入到当前类中,不能注入final修饰的对象,注入的对象可能会被修改(因为 set 方法可以被多次调用,有修改的风险,所以注入的对象就可能被修改),,,,,,,,。
- 构造方法注入:利用构造方法将 Bean 注入到当前类中,构造方法注入如果类只有一个构造方法,可不不用加注解,是因为 Spring 在设计的时候,使用构造方法注入且只有一个构造方法,Spring 就会将对象注入到当前类中,给这个属性进行赋值,因此可以省略注解 @AutoWired。
- 接口方式注入:接口方式注入不是太友好,因为它需要被依赖的对象实现不必要的接口,有很大的侵入性,一般不建议使用。
IOC容器的优点和缺点?
优点:
- 解耦:通过 IOC 容器,我们可以不同组件之间的解耦,提高了应用程序的加灵活、可维护和可扩展。
- 可配置:IOC 容器提供了一种统一的配置方式,可以更加方便地管理和配置应用程序中的各个组件。
- 依赖注入:IOC 容器自动完成依赖注入,帮我们管理了对象的创建和维护及依赖关系,不需要应用程序去关心这些,简化了开发工作。
- 延迟加载:IOC 容器可以根据需要延迟加载组件,减少应用程序的启动时间和内存消耗。
缺点:
- 对象创建不可见:IOC 容器帮我们完成了对象的创建和维护,使的整个过程不可见。
- 效率相对较低:IOC 底层是使用反射去创建对象的,在效率上会有所消耗。
总结:本文对 Srping IOC 的概念有了深入理解,知道了Srping IOC 到底帮我们做了什么,但是对 Srping IOC 的底层实现逻辑还没有进行剖析,后面会继续分析 Srping IOC 的底层实现机制,欢迎持续关注。
欢迎提出建议及对错误的地方指出纠正。