对于最新的稳定版本,请使用 Spring Framework 6.2.0! |
容器概述
该接口表示 Spring IoC
容器,并负责实例化、配置和组装
豆。容器获取有关要
通过读取配置元数据来实例化、配置和组装。这
配置元数据以 XML、Java 注释或 Java 代码表示。它让
您表达了组成应用程序的对象和丰富的相互依赖关系
在这些对象之间。org.springframework.context.ApplicationContext
提供了该接口的几种实现
与Spring。在独立应用程序中,通常会创建一个
ClassPathXmlApplicationContext
或 FileSystemXmlApplicationContext
的实例。
虽然 XML 是定义配置元数据的传统格式,但您可以
指示容器使用 Java 注释或代码作为元数据格式
提供少量的 XML 配置以声明方式启用对这些
其他元数据格式。ApplicationContext
在大多数应用程序场景中,不需要显式用户代码来实例化一个或
Spring IoC 容器的更多实例。例如,在 Web 应用程序场景中,
文件中简单的八行(左右)样板 Web 描述符 XML
通常就足够了(参见 Web 应用程序的便捷 ApplicationContext 实例化)。
如果您使用 Spring Tools for Eclipse(由 Eclipse 提供支持的
开发环境),您可以使用
很少的鼠标点击或击键。web.xml
下图显示了 Spring 工作原理的高级视图。您的应用程序类
与配置元数据结合使用,以便在
created 并初始化,则您拥有一个完全配置且可执行的系统,或者
应用。ApplicationContext
配置元数据
如上图所示, Spring IoC 容器使用一种形式的 配置元数据。此配置元数据表示您作为 application developer,告诉 Spring 容器实例化、配置和组装 应用程序中的对象。
传统上,配置元数据以简单直观的 XML 格式提供。 这是本章大部分用来传达 Spring IoC 容器。
基于 XML 的元数据并不是唯一允许的配置元数据形式。 Spring IoC 容器本身与此格式完全解耦 配置元数据实际上是写入的。如今,许多开发人员为其 Spring 应用程序选择基于 Java 的配置。 |
有关在 Spring 容器中使用其他形式的元数据的信息,请参阅:
-
基于注解的配置:使用 基于注释的配置元数据。
-
基于 Java 的配置:定义应用程序外部的 bean 类。要使用这些功能,请参阅
@Configuration
、@Bean
@Import
、 和@DependsOn
注释。
Spring 配置由至少一个 bean 组成,通常由多个 bean 组成
定义。基于 XML 的配置元数据配置这些
bean 作为顶级元素内的元素。Java
配置通常在类中使用 -annotated 方法。<bean/>
<beans/>
@Bean
@Configuration
这些 Bean 定义对应于组成应用程序的实际对象。
通常,您可以定义服务层对象、持久性层对象(如
存储库或数据访问对象 (DAO)、表示对象(如 Web 控制器)、
基础设施对象,例如 JPA、JMS 队列等。
通常,不会在容器中配置细粒度的域对象,因为
创建和加载通常是存储库和业务逻辑的责任
domain 对象。EntityManagerFactory
以下示例显示了基于 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
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 | 该属性是标识单个 Bean 定义的字符串。id |
2 | 该属性定义 bean 的类型,并使用完全限定的
类名。class |
该属性的值可用于引用协作对象。The XML
本例中未显示 for reference to collaborative objects。有关更多信息,请参阅依赖项。id
实例化容器
位置路径或路径
提供给构造函数的是资源字符串,这些字符串让
容器加载来自各种外部资源的配置元数据,例如
作为本地文件系统、Java 等。ApplicationContext
CLASSPATH
-
Java
-
Kotlin
ApplicationContext context = new ClassPathXmlApplicationContext("services.xml", "daos.xml");
val context = ClassPathXmlApplicationContext("services.xml", "daos.xml")
在了解了 Spring 的 IoC 容器之后,您可能希望了解有关 Spring 抽象的更多信息(如 参考资料 中所述)
它提供了一种方便的机制,用于从定义的位置读取 InputStream
在 URI 语法中。特别是,paths 用于构建应用程序上下文,
如应用程序上下文和资源路径中所述。 |
以下示例显示了服务层对象配置文件:(services.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
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
<?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>
在前面的示例中,服务层由类
以及两个数据类型为 和 (基于
在 JPA Object-Relational Mapping 标准上)。该元素引用
name,并且该元素引用另一个 bean 的名称
定义。和 元素之间的这种联系表达了
协作对象。有关配置对象依赖项的详细信息,请参阅依赖项。PetStoreServiceImpl
JpaAccountDao
JpaItemDao
property name
ref
id
ref
编写基于 XML 的配置元数据
让 Bean 定义跨多个 XML 文件可能很有用。通常,每个个体 XML 配置文件表示体系结构中的逻辑层或模块。
你可以使用应用程序上下文构造函数从所有这些 bean 中加载 bean 定义
XML 片段。此构造函数采用多个位置,如上一节所示。或者
使用元素的一个或多个匹配项从中加载 Bean 定义
另一个文件或文件。以下示例显示了如何执行此操作:Resource
<import/>
<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 定义是从三个文件加载的:、 、 和 。所有位置路径都是
相对于执行导入的定义文件,因此必须位于
与执行导入的文件相同的目录或 Classpath 位置,而 和 必须位于
导入文件的位置。如您所见,前导斜杠将被忽略。然而,鉴于
这些路径是相对的,最好根本不使用斜杠。这
正在导入的文件的内容(包括 top level 元素)必须
根据 Spring Schema 是有效的 XML bean 定义。services.xml
messageSource.xml
themeSource.xml
services.xml
messageSource.xml
themeSource.xml
resources
<beans/>
可以使用
相对 “../“ 路径。这样做会创建对当前
应用。特别是,不建议将此引用用于 URL(对于
example, ),其中运行时解析进程选择
“nearest” classpath 根目录,然后查看其父目录。类路径
配置更改可能会导致选择不同的错误目录。 您始终可以使用完全限定的资源位置而不是相对路径:对于
example 或 .但是,be
知道您正在将应用程序的配置耦合到特定的 absolute
地点。通常最好为这种绝对的
locations — 例如,通过针对 JVM 解析的 “${...}” 占位符
系统属性。 |
命名空间本身提供了 import 指令功能。进一步
除了普通 Bean 定义之外的配置功能在 SELECTION 中可用
Spring 提供的 XML 命名空间 — 例如,和 命名空间。context
util
Groovy Bean 定义 DSL
作为外部化配置元数据的另一个示例,bean 定义还可以 用 Spring 的 Groovy Bean 定义 DSL 表示,如 Grails 框架所示。 通常,此类配置位于“.groovy”文件中,其结构如 以下示例:
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
使用容器
这是能够维护
不同 bean 及其依赖项的注册表。通过使用 method ,您可以检索 bean 的实例。ApplicationContext
T getBean(String name, Class<T> requiredType)
允许您读取 bean 定义并访问它们,如下所示
示例显示:ApplicationContext
-
Java
-
Kotlin
// 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();
import org.springframework.beans.factory.getBean
// create and configure beans
val context = ClassPathXmlApplicationContext("services.xml", "daos.xml")
// retrieve configured instance
val service = context.getBean<PetStoreService>("petStore")
// use configured instance
var userList = service.getUsernameList()
使用 Groovy 配置,引导看起来非常相似。它有不同的背景 implementation 类,该类是 Groovy 感知的(但也理解 XML bean 定义)。 以下示例显示了 Groovy 配置:
-
Java
-
Kotlin
ApplicationContext context = new GenericGroovyApplicationContext("services.groovy", "daos.groovy");
val context = GenericGroovyApplicationContext("services.groovy", "daos.groovy")
最灵活的变体是与阅读器结合使用
delegates — 例如,对于 XML 文件,如下所示
示例显示:GenericApplicationContext
XmlBeanDefinitionReader
-
Java
-
Kotlin
GenericApplicationContext context = new GenericApplicationContext();
new XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml");
context.refresh();
val context = GenericApplicationContext()
XmlBeanDefinitionReader(context).loadBeanDefinitions("services.xml", "daos.xml")
context.refresh()
您还可以使用 for Groovy 文件,如下所示
示例显示:GroovyBeanDefinitionReader
-
Java
-
Kotlin
GenericApplicationContext context = new GenericApplicationContext();
new GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy");
context.refresh();
val context = GenericApplicationContext()
GroovyBeanDefinitionReader(context).loadBeanDefinitions("services.groovy", "daos.groovy")
context.refresh()
您可以在同一个 上混合和匹配此类 Reader 委托 。
从不同的配置源读取 bean 定义。ApplicationContext
然后,您可以使用 来检索 bean 的实例。该接口有一些其他方法用于检索 bean,但理想情况下,您的应用程序
代码永远不应该使用它们。事实上,你的应用程序代码应该根本不调用该方法,因此根本不依赖于 Spring API。例如
Spring 与 Web 框架的集成为各种 Web 提供了依赖注入
框架组件(例如控制器和 JSF 托管 Bean),允许您声明
通过元数据(例如自动装配 Comments)对特定 bean 的依赖。getBean
ApplicationContext
getBean()