spring mvc 下 applicationContext 和webApplicationContext

Spring中的ApplicationContexts可以被限制在不同的作用域。在web框架中,每個DispatcherServlet有它自己的WebApplicationContext,它包含了DispatcherServlet配置所需要的bean。DispatcherServlet 使用的缺省BeanFactory是XmlBeanFactory,並且DispatcherServlet在初始化時會在你的web應用的WEB-INF目錄下尋找[servlet-name]-servlet.xml文件。DispatcherServlet使用的缺省值可以使用servlet初始化參數修改,

WebApplicationContext僅僅是一個擁有web應用必要功能的普通ApplicationContext。它和一個標準的ApplicationContext的不同之處在於它能夠解析主題,並且它知道和那個servlet關聯(通過到ServletContext的連接)。WebApplicationContext被綁定在ServletContext上,當你需要的時候,可以使用RequestContextUtils找到WebApplicationContext。

Spring的DispatcherServlet有一組特殊的bean,用來處理請求和顯示相應的視圖。這些bean包含在Spring的框架裏,(可選擇)可以在WebApplicationContext中配置,配置方式就象配置其它bean的方式一樣。這些bean中的每一個都在下面被詳細描述。待一會兒,我們就會提到它們,但這裏僅僅是讓你知道它們的存在以便我們繼續討論DispatcherServlet。對大多數bean,都提供了缺省值,所有你不必要擔心它們的值。



// 一下來源於網絡


servletContext 是web應用程序的大環境,用於存儲整個web應用程序級別的對象,不知道這樣說法是否對.

ApplicationContext,WebApplicationContext 是Spring的BeanFactory,從名字中就可以知道區別拉,一個是支持web特性的BeanFactory。

Spring獲取WebApplicationContext與ApplicationContext的幾種方法:

方法一:在初始化時保存ApplicationContext對象
代碼:
ApplicationContext ac = new FileSystemXmlApplicationContext("applicationContext.xml");
ac.getBean("beanId");
說明:這種方式適用於採用Spring框架的獨立應用程序,需要程序通過配置文件手工初始化Spring的情況。

方法二:通過Spring提供的工具類獲取ApplicationContext對象
代碼:
import org.springframework.web.context.support.WebApplicationContextUtils;
ApplicationContext ac1 = WebApplicationContextUtils.getRequiredWebApplicationContext(ServletContext sc);
ApplicationContext ac2 = WebApplicationContextUtils.getWebApplicationContext(ServletContext sc);
ac1.getBean("beanId");
ac2.getBean("beanId");
說明:
這種方式適合於採用Spring框架的B/S系統,通過ServletContext對象獲取ApplicationContext對象,然後在通過它獲取需要的類實例。

上面兩個工具方式的區別是,前者在獲取失敗時拋出異常,後者返回null。

其中 servletContext sc 可以具體 換成 servlet.getServletContext()或者 this.getServletContext() 或者 request.getSession().getServletContext(); 另外,由於spring是注入的對象放在ServletContext中的,所以可以直接在ServletContext取出 WebApplicationContext 對象: WebApplicationContext webApplicationContext = (WebApplicationContext) servletContext.getAttribute(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

方法三:繼承自抽象類ApplicationObjectSupport
說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取到ApplicationContext。
Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。

方法四:繼承自抽象類WebApplicationObjectSupport
說明:類似上面方法,調用getWebApplicationContext()獲取WebApplicationContext

方法五:實現接口ApplicationContextAware
說明:實現該接口的setApplicationContext(ApplicationContext context)方法,並保存ApplicationContext 對象。
Spring初始化時,會通過該方法將ApplicationContext對象注入。


在web應用中一般用ContextLoaderListener加載webapplication,如果需要在action之外或者control類之外獲取webapplication思路之一是,單獨寫個類放在static變量中,
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章