对于最新的稳定版本,请使用 Spring Framework 6.2.0spring-doc.cadn.net.cn

容器概述

org.springframework.context.ApplicationContextinterface 表示 Spring IoC 容器,并负责实例化、配置和组装 豆。容器获取有关要 通过读取配置元数据来实例化、配置和组装。这 配置元数据以 XML、Java 注释或 Java 代码表示。它让 您表达了组成应用程序的对象和丰富的相互依赖关系 在这些对象之间。spring-doc.cadn.net.cn

ApplicationContext接口 与Spring。在独立应用程序中,通常会创建一个 实例ClassPathXmlApplicationContextFileSystemXmlApplicationContext. 虽然 XML 是定义配置元数据的传统格式,但您可以 指示容器使用 Java 注释或代码作为元数据格式 提供少量 XML 配置以声明方式启用对这些 其他元数据格式。spring-doc.cadn.net.cn

在大多数应用程序场景中,不需要显式用户代码来实例化一个或 Spring IoC 容器的更多实例。例如,在 Web 应用程序场景中, 简单的八行(左右)样板 Web 描述符 XML,位于web.xml文件 通常就足够了(参见 Web 应用程序的便捷 ApplicationContext 实例化)。 如果您使用 Spring Tools for Eclipse(由 Eclipse 提供支持的 开发环境),您可以使用 很少的鼠标点击或击键。spring-doc.cadn.net.cn

下图显示了 Spring 工作原理的高级视图。您的应用程序类 与配置元数据结合使用,以便在ApplicationContext是 created 并初始化,则您拥有一个完全配置且可执行的系统,或者 应用。spring-doc.cadn.net.cn

容器魔术
图 1.Spring IoC 容器

配置元数据

如上图所示, Spring IoC 容器使用一种形式的 配置元数据。此配置元数据表示您作为 application developer,告诉 Spring 容器实例化、配置和组装 应用程序中的对象。spring-doc.cadn.net.cn

传统上,配置元数据以简单直观的 XML 格式提供。 这是本章大部分用来传达 Spring IoC 容器。spring-doc.cadn.net.cn

基于 XML 的元数据并不是唯一允许的配置元数据形式。 Spring IoC 容器本身与此格式完全解耦 配置元数据实际上是写入的。如今,许多开发人员为其 Spring 应用程序选择基于 Java 的配置

有关在 Spring 容器中使用其他形式的元数据的信息,请参阅:spring-doc.cadn.net.cn

Spring 配置由至少一个 bean 组成,通常由多个 bean 组成 定义。基于 XML 的配置元数据配置这些 beans 设置为<bean/>元素<beans/>元素。Java 配置通常使用@Bean-annotated 方法中的@Configuration类。spring-doc.cadn.net.cn

这些 Bean 定义对应于组成应用程序的实际对象。 通常,您可以定义服务层对象、持久性层对象(如 存储库或数据访问对象 (DAO)、表示对象(如 Web 控制器)、 基础设施对象,例如 JPAEntityManagerFactory、JMS 队列等。 通常,不会在容器中配置细粒度的域对象,因为 创建和加载通常是存储库和业务逻辑的责任 domain 对象。spring-doc.cadn.net.cn

以下示例显示了基于 XML 的配置元数据的基本结构:spring-doc.cadn.net.cn

<?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
		https://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="..." class="..."> (1) (2)
		<!-- collaborators and configuration for this bean go here -->
	</bean>

	<bean id="..." class="...">
		<!-- collaborators and configuration for this bean go here -->
	</bean>

	<!-- more bean definitions go here -->

</beans>
1 idattribute 是标识各个 bean 定义的字符串。
2 classattribute 定义 bean 的类型,并使用完全限定的 类名。

idattribute 可用于引用协作对象。The XML 本例中未显示 for reference to collaborative objects。有关更多信息,请参阅依赖项spring-doc.cadn.net.cn

实例化容器

位置路径或路径 提供给ApplicationContextconstructor 是资源字符串,它们让 容器加载来自各种外部资源的配置元数据,例如 作为本地文件系统,JavaCLASSPATH等。spring-doc.cadn.net.cn

ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

在了解 Spring 的 IoC 容器之后,您可能希望了解有关 Spring 的Resourceabstraction (如 参考资料 中所述) 它提供了一种方便的机制,用于从定义的位置读取 InputStream 在 URI 语法中。特别Resourcepaths 用于构建应用程序上下文, 如应用程序上下文和资源路径中所述。spring-doc.cadn.net.cn

以下示例显示了服务层对象(services.xml)配置文件:spring-doc.cadn.net.cn

<?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
		https://www.springframework.org/schema/beans/spring-beans.xsd">

	<!-- services -->

	<bean id="petStore" class="org.springframework.samples.jpetstore.services.PetStoreServiceImpl">
		<property name="accountDao" ref="accountDao"/>
		<property name="itemDao" ref="itemDao"/>
		<!-- additional collaborators and configuration for this bean go here -->
	</bean>

	<!-- more bean definitions for services go here -->

</beans>

以下示例显示了数据访问对象daos.xml文件:spring-doc.cadn.net.cn

<?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
		https://www.springframework.org/schema/beans/spring-beans.xsd">

	<bean id="accountDao"
		class="org.springframework.samples.jpetstore.dao.jpa.JpaAccountDao">
		<!-- additional collaborators and configuration for this bean go here -->
	</bean>

	<bean id="itemDao" class="org.springframework.samples.jpetstore.dao.jpa.JpaItemDao">
		<!-- additional collaborators and configuration for this bean go here -->
	</bean>

	<!-- more bean definitions for data access objects go here -->

</beans>

在前面的示例中,服务层由PetStoreServiceImpl类 和两个数据类型为JpaAccountDaoJpaItemDao(基于 在 JPA Object-Relational Mapping 标准上)。这property name元素引用 name,以及ref元素引用另一个 bean 的名称 定义。这种idref元素表示 协作对象。有关配置对象依赖项的详细信息,请参阅依赖项spring-doc.cadn.net.cn

编写基于 XML 的配置元数据

让 Bean 定义跨多个 XML 文件可能很有用。通常,每个个体 XML 配置文件表示体系结构中的逻辑层或模块。spring-doc.cadn.net.cn

你可以使用应用程序上下文构造函数从所有这些 bean 中加载 bean 定义 XML 片段。此构造函数采用多个Resourcelocations 的 LOCATIONS 中,如上一节所示。或者 使用<import/>元素来加载 bean 定义 另一个文件或文件。以下示例显示了如何执行此作:spring-doc.cadn.net.cn

<beans>
	<import resource="services.xml"/>
	<import resource="resources/messageSource.xml"/>
	<import resource="/resources/themeSource.xml"/>

	<bean id="bean1" class="..."/>
	<bean id="bean2" class="..."/>
</beans>

在前面的示例中,外部 bean 定义是从三个文件加载的:services.xml,messageSource.xmlthemeSource.xml.所有位置路径都是 相对于执行导入的定义文件,因此services.xml必须在 与执行导入的文件相同的目录或 Classpath 位置,而messageSource.xmlthemeSource.xml必须位于resources位置位于 导入文件的位置。如您所见,前导斜杠将被忽略。然而,鉴于 这些路径是相对的,最好根本不使用斜杠。这 正在导入的文件的内容,包括 Top Level<beans/>元素,必须 根据 Spring Schema 是有效的 XML bean 定义。spring-doc.cadn.net.cn

可以使用 相对 “../“ 路径。这样做会创建对当前 应用。具体而言,不建议将此引用用于classpath:URL(对于 例classpath:../services.xml),其中运行时解析进程选择 “nearest” classpath 根目录,然后查看其父目录。类路径 配置更改可能会导致选择不同的错误目录。spring-doc.cadn.net.cn

您始终可以使用完全限定的资源位置而不是相对路径:对于 例file:C:/config/services.xmlclasspath:/config/services.xml.但是,be 知道您正在将应用程序的配置耦合到特定的 absolute 地点。通常最好为这种绝对的 locations — 例如,通过针对 JVM 解析的 “${...}” 占位符 系统属性。spring-doc.cadn.net.cn

命名空间本身提供了 import 指令功能。进一步 除了普通 Bean 定义之外的配置功能在 SELECTION 中可用 的 XML 命名空间中 — 例如,contextutil命名空间。spring-doc.cadn.net.cn

Groovy Bean 定义 DSL

作为外部化配置元数据的另一个示例,bean 定义还可以 用 Spring 的 Groovy Bean 定义 DSL 表示,如 Grails 框架所示。 通常,此类配置位于“.groovy”文件中,其结构如 以下示例:spring-doc.cadn.net.cn

beans {
	dataSource(BasicDataSource) {
		driverClassName = "org.hsqldb.jdbcDriver"
		url = "jdbc:hsqldb:mem:grailsDB"
		username = "sa"
		password = ""
		settings = [mynew:"setting"]
	}
	sessionFactory(SessionFactory) {
		dataSource = dataSource
	}
	myService(MyService) {
		nestedBean = { AnotherBean bean ->
			dataSource = dataSource
		}
	}
}

这种配置样式在很大程度上等同于 XML bean 定义,甚至 支持 Spring 的 XML 配置命名空间。它还允许导入 XML Bean 定义文件通过importBeans命令。spring-doc.cadn.net.cn

使用容器

ApplicationContext是能够维护 不同 bean 及其依赖项的注册表。通过使用方法T getBean(String name, Class<T> requiredType)中,您可以检索 bean 的实例。spring-doc.cadn.net.cn

ApplicationContext允许您读取 Bean 定义并访问它们,如下所示 示例显示:spring-doc.cadn.net.cn

// create and configure beans
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");

// retrieve configured instance
PetStoreService service = context.getBean("petStore", PetStoreService.class);

// use configured instance
List<String> userList = service.getUsernameList();

使用 Groovy 配置,引导看起来非常相似。它有不同的背景 implementation 类,该类是 Groovy 感知的(但也理解 XML bean 定义)。 以下示例显示了 Groovy 配置:spring-doc.cadn.net.cn

ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");

最灵活的变体是GenericApplicationContext与 Reader 结合使用 delegates — 例如,使用XmlBeanDefinitionReader对于 XML 文件,如下所示 示例显示:spring-doc.cadn.net.cn

GenericApplicationContext context = new GenericApplicationContext();
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");
context.refresh();

您还可以使用GroovyBeanDefinitionReader对于 Groovy 文件,如下所示 示例显示:spring-doc.cadn.net.cn

GenericApplicationContext context = new GenericApplicationContext();
new GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy");
context.refresh();

您可以在同一ApplicationContext, 从不同的配置源读取 bean 定义。spring-doc.cadn.net.cn

然后,您可以使用getBean检索 bean 的实例。这ApplicationContextinterface 有一些其他方法来检索 bean,但理想情况下,您的应用程序 代码永远不应该使用它们。事实上,您的应用程序代码不应调用getBean()方法,因此根本不依赖于 Spring API。例如 Spring 与 Web 框架的集成为各种 Web 提供了依赖注入 框架组件(例如控制器和 JSF 托管 Bean),允许您声明 通过元数据(例如自动装配 Comments)对特定 bean 的依赖。spring-doc.cadn.net.cn


APP信息