前言
本章详细介绍了 Spring 与第三方 web 框架的集成。
Spring 框架的核心价值主张之一是支持选择。在一般意义上,Spring 并不强迫您使用或购买任何特定的架构、技术或方法 (尽管它肯定推荐某些而非其他) 。可以自由选择与开发人员及其开发团队最相关的架构、技术或方法,这一点在 web 领域最为明显,Spring 提供了自己的 web 框架 (Spring MVC 和 Spring WebFlux) ,同时支持与一些流行的第三方 web 框架的集成。
通用配置
首先看一下常见的 Spring 配置,它并不特定于任何一个 web 框架。(同样适用于 Spring 自己的 web 框架变体)
Spring 的轻量级应用程序模型支持的一个概念是分层体系结构。请记住,在一个“经典”的分层架构中,web 层只是许多层中的一个。它充当服务器端应用程序的入口点之一,它委托服务层中定义的服务对象 (外观) 来满足业务特定 (和表示技术无关) 用例。在 Spring 中,这些服务对象、任何其他特定于业务的对象、数据访问对象以及其他对象存在于一个不同的“业务上下文”中,这个“业务上下文”不包含 web 或表示层对象 (表示对象,例如 Spring MVC 控制器,通常配置在一个不同的 “表示上下文” 中) 。本节详细说明如何配置应用程序中包含所有 “业务 bean” 的 Spring 容器 ( WebApplicationContext
)
接下来,您需要做的就是在 web 应用程序的标准 Java EE servlet web.xml
文件中声明一个 ContextLoaderListener
,并添加一个 contextConfigLocation
<context-param/>
部分 (在同一文件中) ,该部分定义要加载的一组 Spring XML 配置文件。
考虑下面的 <listener/>
配置:
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
考虑下面的 <context-param/>
配置:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/applicationContext*.xml</param-value>
</context-param>
如果不指定 contextConfigLocation
上下文参数,ContextLoaderListener
将查找要加载的名为 /WEB-INF/applicationContext.xml
的文件。一旦上下文文件被加载,Spring 将基于 bean 定义创建一个 WebApplicationContext
对象,并将其存储在 web 应用程序的 ServletContext
中。
所有 Java web 框架都构建在 Servlet API 之上,因此您可以使用下面的代码片段访问由 ContextLoaderListener
创建的这个 “业务上下文” ApplicationContext
。
如何获取 WebApplicationContext
:
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
WebApplicationContextUtils
类是为了方便,因此您不需要记住 ServletContext
属性的名称。如果在 WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
键下不存在对象,则其 getWebApplicationContext()
方法返回 null
。与其冒险在应用程序中获得 NullPointerExceptions
,不如使用 getRequiredWebApplicationContext()
方法。此方法在缺少 ApplicationContext
时引发异常。
一旦有了对 WebApplicationContext
的引用,就可以按照 bean 的名称或类型检索 bean。大多数开发人员按名称检索 bean ,然后将它们强制转换为其实现的接口之一。
幸运的是,本节中的大多数框架都有更简单的查找 bean 的方法。它们不仅使从 Spring 容器中获取 bean 变得容易,而且还允许您在其控制器上使用依赖注入。每个 web 框架部分都有更多关于其具体集成策略的细节。
JSF
略
Apache Struts 2.x
略
Apache Tapestry 5.x
略