IoC 控制反转
IoC 概念
IoC (Inversion of Control)也称为依赖项注入(DI)。
控制反转是一个过程,在此过程中,对象仅通过 构造函数参数,工厂方法的参数或在构造或从工厂方法返回后在对象实例上设置的属性来定义其依赖项(即,与它们一起使用的其他对象) 。然后,容器在创建 Bean 时注入那些依赖项。此过程从根本上讲,是通过使用类的直接构造或诸如服务定位器模式之类的控件来控制其依赖项的实例化或位置的 bean 本身的逆过程(因此称为 Control Inversion)。
换言之:在使用对象时,原本由主动 new 产生对象 改为使用由外部提供对象,此过程中对象创建控制权由程序转移到外部,此思想称为控制反转。
org.springframework.beans
和 org.springframework.context
两个包是 Spring Framework 的 IoC 容器的基础。 BeanFactory接口提供了一种高级配置机制,能够管理任何类型的对象。
ApplicationContext 是 BeanFactory的子接口。它增加了:
- 更容易与 Spring 的 AOP 功能集成
- 消息资源处理(用于国际化)
- 事件发布:Event publication
- 特定于应用程序层的上下文,例如用于 Web 应用程序的
WebApplicationContext
。
简而言之,BeanFactory
提供了配置框架和基本功能,而 ApplicationContext
添加了更多企业特定的功能。 ApplicationContext
是 BeanFactory
的完整超集。
在 Spring 中,构成应用程序主干并由 Spring IoC 容器管理的对象称为 Bean。 Bean 是由 Spring IoC 容器实例化,组装和以其他方式管理的对象。否则,bean 仅仅是应用程序中许多对象之一。 Bean 及其之间的依赖关系反映在容器使用的配置元数据中。
IoC 容器
org.springframework.context.ApplicationContext
接口代表 Spring IoC 容器,并负责实例化,配置和组装 Bean。容器通过读取配置元数据来获取有关要实例化,配置和组装哪些对象的指令。配置元数据以 XML,Java 注解或 Java 代码表示。它使您能够表达组成应用程序的对象以及这些对象之间的丰富相互依赖关系。
Spring 提供了ApplicationContext
接口的几种实现。在独立应用程序中,通常创建ClassPathXmlApplicationContext
或FileSystemXmlApplicationContext
的实例。尽管 XML 是定义配置元数据的传统格式,但是您可以通过提供少量 XML 配置来声明性地启用对这些其他元数据格式的支持,从而指示容器将 Java 注解或代码用作元数据格式。
在大多数应用场景中,不需要实例化用户代码即可实例化一个 Spring IoC 容器的一个或多个实例。例如,在 Web 应用程序场景中,应用程序 web.xml
文件中的大约简单的八行模板 WebDescriptorsXML
通常就足够了。如果使用Spring 工具套件(如基于 Eclipse、IDEA 的开发环境),则只需单击几次鼠标或击键即可创建此配置。
下图显示了 Spring 的工作原理的高级视图。项目中的应用程序类与配置元数据结合在一起,以便在创建和初始化ApplicationContext
之后,获取完全配置且可执行的系统或应用程序。