org.springframework.context.ApplicationContext 接口代表 Spring IoC
容器,负责实例化、配置和组装Bean。容器通过读取配置元数据来获取需要实例化、配置和组装的对象的指令。配置元数据以 XML、Java 注释或
Java 代码表示。它允许你表达组成应用程序的对象以及这些对象之间丰富的相互依赖关系。
Spring 提供了 ApplicationContext 接口的几个实现。在独立应用程序中,通常创建 ClassPathXmlApplicationContext或FileSystemXmlApplicationContext的实例。 虽然 XML 一直是定义配置元数据的传统格式,但你可以通过提供少量 XML 配置来指示容器使用 Java 注解或代码作为元数据格式,从而声明性地启用对这些附加元数据格式的支持。
在大多数应用场景中,无需显式用户代码即可实例化一个或多个 Spring IoC 容器实例。例如,在 Web 应用场景中,应用程序的 web.xml 文件中通常只需要简单(大约)八行样板 Web 描述符 XML 即可(参见 Web 应用的便捷 ApplicationContext 实例化)。如果你使用 Spring Tools for Eclipse(一个基于 Eclipse 的开发环境),可以通过几个鼠标点击或按键轻松创建此样板配置。
以下图表展示了 Spring 的工作原理的高级视图。你的应用程序类与配置元数据相结合,因此,在创建并初始化 ApplicationContext 之后,你将拥有一个完全配置和可执行的系统或应用程序。

如前面的图所示,Spring IoC 容器使用一种配置元数据。这种配置元数据表示你作为应用程序开发人员如何告诉 Spring 容器实例化、配置和组装应用程序中的对象。 配置元数据传统上以简单直观的XML格式提供,这是本章的大部分内容用来传达SpringIoC容器的关键概念和特性。
基于 XML 的元数据不是唯一允许的配置元数据形式。Spring IoC 容器本身与实际编写此配置元数据的格式完全解耦。如今,许多开发者选择为他们的 Spring 应用程序使用基于 Java 的配置。
关于使用 Spring 容器中的其他形式元数据的信息,请参阅:
基于注解的配置:Spring 2.5 引入了基于注解的配置元数据支持。
基于 Java 的配置: 从 Spring 3.0 开始,Spring JavaConfig 项目提供的许多功能已成为 Spring 核心框架的一部分。因此,你可以通过 Java 而不是 XML 文件来定义应用程序类之外的字节。要使用这些新功能,请参阅 @Configuration 、 @Bean 、 @Import 和 @DependsOn注解。
Spring 配置至少包含一个,通常包含多个需要容器管理的 bean 定义。基于 XML 的配置元数据将这些 bean 配置为顶级元素内的 <bean/> 元素。Java 配置通常在 @Configuration 类中使用 @Bean 注解的方法。
这些 Bean 定义对应于构成你的应用程序的实际对象。通常,你会定义服务层对象、数据访问对象(DAOs)、如 Struts Action 实例这样的表示层对象、如 Hibernate SessionFactories 、JMS Queues 等基础设施对象等。通常,人们不会在容器中配置细粒度的领域对象,因为这通常是 DAO 和业务逻辑创建和加载领域对象的责任。然而,你可以使用 Spring 与 AspectJ 的集成来配置在 IoC容器控制之外的创建的对象。请参阅使用 AspectJ 通过 Spring 依赖注入领域对象。
以下示例展示了基于 XML 的配置元数据的基本结构:
id 属性是一个字符串,用于标识单个 bean 定义。class 属性定义了 bean 的类型,并使用完全限定的 classname.id 属性的值指的是协作对象。引用协作对象的 XML 在此示例中未显示。有关更多信息,请参阅依赖关系。
提供给 ApplicationContext 构造函数的一个或多个位置路径是资源字符串,它允许容器从各种外部资源(如本地文件系统、Java CLASSPATH 等)加载配置元数据。
在你了解 Spring 的 IoC 容器之后,你可能还想了解更多关于 Spring 的 Resources 抽象(如资源中所述),它提供了一个方便的机制来从 URI 语法定义的位置读取 InputStream。特别是, Resource 路径用于构建应用程序上下文,如应用程序上下文和资源路径中所述。
以下示例显示了服务层对象 (services.xml) 配置文件:
以下示例显示了数据访问对象 daos.xml 文件:
在先前的示例中,服务层由 PetStoreServiceImpl 类和两种类型的数据访问对象 JpaAccountDao 和 JpaItemDao (基于 JPA 对象关系映射标准)组成。 property name 元素指代 JavaBean 属性的名称, ref 元素指代另一个 bean 定义的名称。 id 和 ref 元素之间的这种联系表达了协作对象之间的依赖关系。有关配置对象依赖项的详细信息,请参阅依赖项。
让Bean的定义跨越多个XML文件可能很有用。通常情况下,每个单独的XML配置文件代表了你架构中的一个逻辑层或模块
你可以使用应用程序上下文构造函数从所有这些 XML 片段中加载 bean 定义。此构造函数接受多个 Resource 位置,如前节所示。或者,使用一个或多个<import/> 元素的出现来从另一个文件或文件中加载 bean 定义。以下示例显示了如何这样做:
在前面示例中,外部 bean 定义从三个文件加载: services.xml 、 messageSource.xml 和 themeSource.xml。所有位置路径相对于导入定义的文件,因此 services.xml 必须在与导入文件相同的目录或类路径位置,而 messageSource.xml 和themeSource.xml 必须在导入文件位置下的 resources 位置。正如你所看到的,开头的斜杠被忽略。然而,鉴于这些路径是相对的,最好不使用斜杠。被导入的文件内容,包括顶级 <beans/> 元素,必须根据 Spring Schema 为有效的 XML bean 定义。
可以但不建议使用相对路径"../"引用父目录中的文件。这样做会创建对当前应用程序外部的文件的依赖。特别是,不建议对 classpath: URL(例如, classpath:../services.xml )使用此引用,因为运行时解析过程会选择“最近的”类路径根,然后查看其父目录。类路径配置更改可能导致选择不同的、错误的目录。
file:C:/config/services.xml 或 classpath:/config/services.xml。然而,请注意,你正在将应用程序的配置耦合到特定的绝对位置。通常最好为这样的绝对位置保留一个间接引用——例如,通过在运行时与 JVM 系统属性进行解析的 ${…}占位符。
命名空间本身提供了导入指令功能。Spring 提供的 XML 命名空间中,除了简单的 bean 定义之外,还提供了进一步的配置功能——例如,context 和 util 命名空间。
作为一个外部化配置元数据的进一步示例,Bean 定义也可以用 Spring 的 Groovy Bean 定义 DSL 表达,正如 Grails 框架所知。通常,此类配置位于一个".groovy"文件中,其结构如下例所示:
这种配置风格在很大程度上等同于 XML Bean 定义,甚至支持 Spring 的 XML 配置命名空间。它还允许通过 importBeans 指令导入 XML Bean 定义文件。
ApplicationContext 是一个用于维护不同 Bean 及其依赖关系的先进工厂的接口。通过使用方法T getBean(String name, Class<T> requiredType) ,你可以检索你的 Bean 实例。
ApplicationContext 允许你读取 bean 定义并访问它们,如下例所示:
使用 Groovy 配置,引导过程看起来非常相似。它有一个不同的上下文实现类,该类支持 Groovy(但也理解 XML bean 定义)。以下示例显示了 Groovy 配置:
最灵活的变体是 GenericApplicationContext 与 reader delegates 结合使用——例如,与 XmlBeanDefinitionReader 结合用于 XML 文件,如下例所示:
你还可以对 Groovy 文件使用 GroovyBeanDefinitionReader ,如下例所示:
你可以在同一个 ApplicationContext (应用上下文)中混合搭配此类 reader delegates,从不同的配置源读取 Bean 定义。
然后,你可以使用 getBean 方法来获取你的Bean实例。ApplicationContext 接口还有一些其他用于获取 Bean 的方法,不过,理想情况下,你的应用程序代码绝不应该使用它们。实际上,你的应用程序代码根本就不应该调用 getBean() 方法,这样一来也就完全不会依赖 Spring 的应用程序编程接口(API)了。
例如,Spring 与 Web 框架的集成可为各种 Web 框架组件(比如控制器和受 JSF 管理的 Bean )提供依赖注入,让你能够通过元数据(例如自动装配注解)声明对特定 Bean 的依赖关系。