?
本文檔使用 PHP中文網(wǎng)手冊(cè) 發(fā)布
在深入研究如何集成受支持的 Web 框架之前,讓我們先看看對(duì)所有 Web 框架都適用的 Spring 配置。(這一節(jié)同樣適用于 Spring 自己的 Web 框架,SpringMVC)。
在 Spring 所支持的輕量級(jí)應(yīng)用模型中,有一個(gè)概念叫“分層架構(gòu)”。在經(jīng)典的分層架構(gòu)中,
Web 層只是很多層中的一層...它是服務(wù)器端應(yīng)用的一個(gè)入口,它將請(qǐng)求委派給定義在服務(wù)層的服務(wù)對(duì)象
(門(mén)面)以滿(mǎn)足業(yè)務(wù)用例需求(這些是表現(xiàn)層技術(shù)觸及不到的)。在 Spring 中,這些服務(wù)對(duì)象,以及其他的業(yè)務(wù)對(duì)象,
數(shù)據(jù)訪(fǎng)問(wèn)對(duì)象等等,都存在于一個(gè)獨(dú)立的“businnes context”中,這個(gè)context不含有任何 Web
或者表現(xiàn)層的對(duì)象(表現(xiàn)層對(duì)象諸如 Spring MVC 控制器通常被配置于一個(gè)獨(dú)立的“presentation context”中)。
這一節(jié)詳細(xì)介紹在一個(gè)應(yīng)用中如何配置一個(gè) Spring 容器(WebApplicationContext
)來(lái)容納所有的“business beans”。
現(xiàn)在進(jìn)入細(xì)節(jié)部分...所有你需要做的就是在 Web 應(yīng)用的 web.xml
文件中聲明一個(gè)
ContextLoaderListener
,
并且在同一文件里增加一個(gè) contextConfigLocation
<context-param/> ,
這個(gè)聲明決定了哪些 Spring XML 配置文件會(huì)被加載。
以下是 <listener/> 的配置:
<listener> <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class> </listener>
Listeners 是在 Servlet API 2.3 版本中才加入的;而 listener 的啟動(dòng)順序在 Servlet 2.4 版本終于明確。
如果你使用只支持 Servlet 2.2 版本的容器,你可以通過(guò)純嵌入方式使用
ContextLoaderServlet
完成相同的功能(就啟動(dòng)順序而言)。
以下是 <context-param/> 的配置:
<context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext*.xml</param-value> </context-param>
如果沒(méi)有指定 contextConfigLocation
的context參數(shù),
ContextLoaderListener
將會(huì)查找一個(gè)名為 /WEB-INF/applicationContext.xml
的文件加載。
一旦context文件被加載,Spring 通過(guò)文件中 bean 的定義創(chuàng)建一個(gè)
WebApplicationContext
對(duì)象并且將它儲(chǔ)存在 Web 應(yīng)用的 ServletContext 中。
所有Java Web框架都構(gòu)建在Servlet API之上,所以,可以使用下面的代碼片斷訪(fǎng)問(wèn)這個(gè)
由 ContextLoaderListener
創(chuàng)建的ApplicationContext。
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(servletContext);
WebApplicationContextUtils
這個(gè)類(lèi)提供了方便的功能,這樣你就不必去記 ServletContext 中屬性的名字。
它的 getWebApplicationContext() 方法在
WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE
這個(gè)鍵值不對(duì)應(yīng)任何對(duì)象的時(shí)候?qū)⒎祷?null
。
不過(guò),為了避免在應(yīng)用中得到 NullPointerExceptions
,我們推薦你使用 getRequiredWebApplicationContext()
方法。
這個(gè)方法在ApplicationContext 缺失的時(shí)候會(huì)拋出一個(gè)異常。
一旦你獲得了一個(gè) WebApplicationContext
的引用,
就可以通過(guò) bean 的名字或類(lèi)型來(lái)獲得它們。大多數(shù)開(kāi)發(fā)人員通過(guò)名字獲得 bean,然后將它們轉(zhuǎn)換成相應(yīng)的接口類(lèi)型。
幸運(yùn)的是,這一節(jié)中的大多數(shù)框架都有更簡(jiǎn)單的方法來(lái)查詢(xún) bean。我們不僅僅可以更簡(jiǎn)單地從 Spring 容器中 得到 bean,我們還可以在控制器中使用 Spring 依賴(lài)注入的特性。下面的幾個(gè)小節(jié)是每種框架集成策略的詳細(xì)描述。