IoC即控制反转(Inversion of Control,缩写为 IoC)。IoC又称为依赖倒置原则(设计模式六大原则之一)。
IoC意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。这样对象的控制权就反转了,你无需关心对象的各种创建,只需关注业务的本身,大大降低了程序的耦合性。
它的要点在于:程序要依赖于抽象接口,不要依赖于具体实现。它的作用就是用于降低代码间的耦合度。
IoC 的实现方式有两种:
理解 Ioc 的关键是要明确两个要点:
谁控制谁,控制什么:传统 Java SE 程序设计,我们直接在对象内部通过 new 进行创建对象,是程序主动去创建依赖对象;而 IoC 是有专门一个容器来创建这些对象,即由 Ioc 容器来控制对象的创建;谁控制谁?当然是 IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。
为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。
本质是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以 2004 年大师级人物 Martin Fowler 又给出了一个新的名字:“依赖注入”,相对 IoC 而言,“依赖注入”明确描述了“被注入对象依赖 IoC 容器配置依赖对象”。
注:如果想要更加深入的了解 IoC 和 DI,请参考 Martin Fowler 的一篇经典文章 。
Inversion of ControlContainers and the Dependency Injection pattern (opens new window)
JavaBean是一种 JAVA 语言写成的可重用组件。为写成JavaBean,类必须是具体的和公共的,并且具有无参数的构造器。JavaBean 对外部通过提供 getter / setter方法来访问其成员。
由 IoC 容器管理的那些组成你应用程序的对象我们就叫它 Bean。Bean 就是由 Spring 容器初始化、装配及管理的对象,除此之外,bean 就与应用程序中的其他对象没有什么区别了。那 IoC 怎样确定如何实例化 Bean、管理 Bean 之间的依赖关系以及管理 Bean 呢?这就需要配置元数据,在 Spring 中由 BeanDefinition 代表。
IoC 顾名思义就是有依赖注入能力的容器。它负责负责实例化、配置和组装 bean。容器通过读取配置元数据获取有关要实例化、配置和组装哪些对象的指令。配置元数据以 XML、Java 注释或 Java 代码表示。
IoC 容器中的对象仅通过构造函数参数、工厂方法的参数或在对象实例被构造或从工厂方法返回后设置的属性来定义它们的依赖关系(即它们使用的其他对象) .然后容器在创建 bean 时注入这些依赖项。这个过程基本上是 bean 本身的逆过程(因此得名,控制反转),它通过使用类的直接构造或服务定位器模式等机制来控制其依赖项的实例化或位置。
org.springframework.beans
和org.springframework
.是 IoC 容器的基础。
在 Spring 中,有两种 IoC 容器:BeanFactory
和 ApplicationContext
。
BeanFactory
:BeanFactory
是 Spring 基础 IoC 容器。BeanFactory
提供了 Spring 容器的配置框架和基本功能。ApplicationContext
:ApplicationContext
是具备应用特性的 BeanFactory
的子接口。它还扩展了其他一些接口,以支持更丰富的功能,如:国际化、访问资源、事件机制、更方便的支持 AOP、在 web 应用中指定应用层上下文等。 实际开发中,更推荐使用 ApplicationContext
作为 IoC 容器,因为它的功能远多于 BeanFactory
。
org.springframework.context.ApplicationContext
接口代表 Spring IoC 容器,负责实例化、配置和组装 bean。容器通过读取配置元数据来获取关于要实例化、配置和组装哪些对象的指令。配置元数据以 XML、Java 注释或 Java 代码表示。它允许您表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。
共分为三步 :
配置元数据 :Spring IoC 容器使用一种形式的配置元数据。此配置元数据表示您作为应用程序开发人员如何告诉 Spring 容器在您的应用程序中实例化、配置和组装对象。配置元数据传统上以简单直观的 XML 格式提供。
实例化容器:由 IoC 容器解析配置的元数据。IoC 容器的 Bean Reader 读取并解析配置文件,根据定义生成 BeanDefinition 配置元数据对象,IoC 容器根据BeanDefinition
进行实例化、配置及组装 Bean。
使用容器:由客户端实例化容器,获取需要的 Bean。
如果喜欢的话,欢迎 关注 点赞 评论 收藏 一起讨论 你的评价就是我✍️创作的动力!
参考:
spring官方文档