前言:
本章涵盖了反向控制(IoC)原理的Spring框架实现。IoC也称为依赖注入(DI)。
一、简介Spring IoC容器和bean:
IoC我们常说是控制反转,IoC也称为依赖注入(DI)。它是一个过程,对象定义它们的依赖关系,也就是他们工作的其他对象
,只有通过构造函数参数,工厂方法的参数,或者在从工厂方法构造或返回后在对象实例上设置的属性。然后,容器 在创建bean时
注入这些依赖项。这个过程基本上是反向的,因此命名控制反转(IoC),它通过使用直接构造类来控制其依赖关系的实例化或位置
,在org.springframework.beans
和org.springframework.context
包是Spring框架的IoC容器的基础。该 BeanFactory
接
口提供了能够管理任何类型的对象的高级配置机制。 ApplicationContext
是一个子界面BeanFactory
。它更容易与Spring的
AOP功能集成; 消息资源处理(用于国际化),事件发布; 以及应用层特定的上下文,例如WebApplicationContext
用于Web应用
程序。简而言之,它BeanFactory
提供了配置框架和基本功能,并ApplicationContext
增加了更多的企业特定功能。这
ApplicationContext
是一个完整的超集BeanFactory
,并且在本章中专门用于Spring的IoC容器的描述。有关使用BeanFactory
而不是ApplicationContext,
参考 官网第7.16节“BeanFactory”的更多信息。
在Spring中,构成应用程序主干并由Spring IoC 容器管理的对象称为bean。bean是由Spring IoC容器实例化,组装和以其他方
式管理的对象。否则,bean只是应用程序中的许多对象之一。Bean和 它们之间的依赖关系反映在容器使用的配置元数据中。
容器概述:
该接口org.springframework.context.ApplicationContext
代表Spring IoC容器,并负责实例化,配置和组装上述bean
。容器通过读取配置元数据获取有关实例化,配置和组合的对象的说明。配置元数据用XML,Java注释或Java代码表示。它允许您
表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。
ApplicationContext
接口的几个实现方式与Spring一起提供。在独立应用程序中,创建一个
ClassPathXmlApplicationContext
或多个实例是常见的FileSystemXmlApplicationContext
。虽然XML是用于定义配置
元数据的传统格式,但您可以通过提供少量XML配置来声明性地启用对这些附加元数据格式的支持,来指示容器将Java注释或代
码用作元数据格式。
在大多数应用场景中,显式用户代码不需要实例化一个或多个Spring IoC容器的实例。例如,在Web应用程序场景中,应用程序文
件中简单的八(或更多)样板Web描述符XML行web.xml
通常就足够了
(参见官网第7.15.4节“Web应用程序的方便的ApplicationContext实例化”)。如果您正在使用 Spring Tool Suite Eclipse驱动的开发
环境,则可以通过鼠标点击或击键轻松创建该样板设置。
下图是Spring如何工作的高级视图。您的应用程序类与配置元数据相结合,以便在ApplicationContext
创建和初始化后,您将具
有完全配置和可执行的系统或应用程序。
二、配置元数据
如上图所示,Spring IoC容器消耗一种配置元数据的形式 ; 此配置元数据表示应用程序开发人员如何告诉Spring容器来实例化,配置和组合应用程序中的对象。
配置元数据传统上以简单直观的XML格式提供,这是本章大部分用于传达Spring IoC容器的关键概念和功能。
基于XML的元数据 不是 唯一允许的配置元数据形式。Spring IoC容器本身与实际写入此配置元数据的格式 完全 分离。这些天,很多开发人员为他们的Spring应用程序选择 基于Java的配置 。有关使用Spring容器的其他形式的元数据的信息,请参阅:
<bean/>elements inside a top-level
<beans/>
元素中的元素。Java配置通常@Bean
在@Configuration
类中使用注释方法。 这些bean定义对应于构成应用程序的实际对象。通常,您定义服务层对象,数据访问对象(DAO),呈现对象(如Struts Action
实例),基础架构对象(如HibernateSessionFactories
,JMS Queues
等)。通常,在容器中不配置细粒度的域对象,因为通常由DAO和业务逻辑负责创建和加载域对象。但是,您可以使用Spring与AspectJ的集成来配置在IoC容器的控制之外创建的对象。请参阅使用AspectJ对Spring进行依赖注入域对象。
以下示例显示了基于XML的配置元数据的基本结构:
<?xml version =“1.0”encoding =“UTF-8”?> <beans xmlns = “http://www.springframework.org/schema/beans” xmlns:xsi = “http://www.w3.org / 2001 / XMLSchema-instance“ xsi:schemaLocation = ”http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd“ > <bean id = “......” 级 = “...” > <! -合作者和配置这个bean去这里- > </bean> <bean ID = “...” 级 = “...“ > <! - 这个bean的协作者和配置去这里 - > </ bean> <! - 更多的bean定义到这里 - > </ beans>
该id
属性是用于标识单个bean定义的字符串。该class
属性定义bean的类型,并使用完全限定的类名。id属性的值是指协作对象。用于引用协作对象的XML在此示例中未显示; 有关详细信息,请参阅 依赖关系。