生活随笔
收集整理的這篇文章主要介紹了
java上下文
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
1.context就是“容器”,放的就是應用程序的所有資源,要用時候就訪問它,所以context里面的東西,在同一個應用程序里面是全局的;web上下文可以看成web應用的運行環境,一般用context名字來修飾,里面保存了web應用相關的一些設置和全局變量
2.ServletContext,是一個全局的儲存信息的空間,服務器開始,其就存在,服務器關閉,其才釋放。request,一個用戶可有多個;session,一個用戶一個;而servletContext,所有用戶共用一個。所以,為了節省空間,提高效率,ServletContext中,要放必須的、重要的、所有用戶需要共享的線程又是安全的一些信息;
HttpSession session =request.getSession();session.getServletContext(); 3.avaWeb中的上下文環境概念就是:一個web服務啟動后的整個服務中的所有內存對象和他們之間的關系組成的一種環境
spring 上下文和spring mvc上下文和web應用上下文servletContext之間的關系
要想很好理解這三個上下文的關系,需要先熟悉spring是怎樣在web容器中啟動起來的。spring的啟動過程其實就是其IoC容器的啟動過程,對于web程序,IoC容器啟動過程即是建立上下文的過程。
spring的啟動過程:
首先,對于一個web應用,其部署在web容器中,web容器提供其一個全局的上下文環境,這個上下文就是ServletContext,其為后面的spring IoC容器提供宿主環境;
其次,在web.xml中會提供有contextLoaderListener。在web容器啟動時,會觸發容器初始化事件,此時contextLoaderListener會監聽到這個事件,其contextInitialized方法會被調用,在這個方法中,spring會初始化一個啟動上下文,這個上下文被稱為根上下文,即WebApplicationContext,這是一個接口類,確切的說,其實際的實現類是XmlWebApplicationContext。這個就是spring的IoC容器,其對應的Bean定義的配置由web.xml中的context-param標簽指定。在這個IoC容器初始化完畢后,spring以WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE為屬性Key,將其存儲到ServletContext中,便于獲取;
再次,contextLoaderListener監聽器初始化完畢后,開始初始化web.xml中配置的Servlet,這個servlet可以配置多個,以最常見的DispatcherServlet為例,這個servlet實際上是一個標準的前端控制器,用以轉發、匹配、處理每個servlet請求。DispatcherServlet上下文在初始化的時候會建立自己的IoC上下文,用以持有spring mvc相關的bean。在建立DispatcherServlet自己的IoC上下文時,會利用WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE先從ServletContext中獲取之前的根上下文(即WebApplicationContext)作為自己上下文的parent上下文。有了這個parent上下文之后,再初始化自己持有的上下文。這個DispatcherServlet初始化自己上下文的工作在其initStrategies方法中可以看到,大概的工作就是初始化處理器映射、視圖解析等。這個servlet自己持有的上下文默認實現類也是mlWebApplicationContext。初始化完畢后,spring以與servlet的名字相關(此處不是簡單的以servlet名為Key,而是通過一些轉換,具體可自行查看源碼)的屬性為屬性Key,也將其存到ServletContext中,以便后續使用。這樣每個servlet就持有自己的上下文,即擁有自己獨立的bean空間,同時各個servlet共享相同的bean,即根上下文(第2步中初始化的上下文)定義的那些bean。
servletContext 是web應用程序的大環境,用于存儲整個web應用程序級別的對象.
Spring上下文(ApplicationContext)方法一:ClassPathXmlApplicationContext --從classpath路徑加載配置文件,創建Bean對象ApplicationContext ctx = new ClassPathXmlApplicationContext("classpath:applicationContext.xml");ClassName clazz =(ClassName)ctx.getBean("beanName"); 方法二:FileSystemXmlApplicationContext --從指定的目錄中加載ApplicationContext ctx = new FileSystemXmlApplicationContext("src/applicationContext.xml");ClassName clazz =(ClassName)ctx.getBean("beanName"); 方法三:Spring提供的工具類WebApplicationContextUtils獲取ApplicationContext對象(通過ServletContext對象獲得ApplicationContext對象,然后根據它獲得需要的類實例)HttpSession session =request.getSession();ServletContext context = session.getServletContext(); //arg0.getSession().getServletContext();ApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(context);ClassName clazz =(ClassName)ctx.getBean("beanName"); 上面兩個工具方式的區別是,前者在獲取失敗時拋出異常,后者返回null。 方法四:繼承自抽象類ApplicationObjectSupport說明:抽象類ApplicationObjectSupport提供getApplicationContext()方法,可以方便的獲取到ApplicationContext。Spring初始化時,會通過該抽象類的setApplicationContext(ApplicationContext context)方法將ApplicationContext 對象注入。 例如:import org.springframework.context.support.ApplicationObjectSupport; public class ContextOne extends ApplicationObjectSupport{......}........ContextOne one = new ContextOne();one.getApplicationContext(); 方法五:繼承自抽象類WebApplicationObjectSupport說明:類似上面方法,調用getWebApplicationContext()獲取WebApplicationContext 例如:import org.springframework.web.context.support.WebApplicationObjectSupport;public class ContextOne extends WebApplicationObjectSupport {.......}........ContextOne one = new ContextOne();one.getApplicationContext(); 方法六:實現接口ApplicationContextAwarehttp://blog.csdn.net/kaiwii/article/details/6872642當一個類實現了ApplicationContextAware接口后,這個類就可以獲得Spring配置文件中的所引用到的bean對象。說明:實現該接口的setApplicationContext(ApplicationContext context)方法,并保存ApplicationContext 對象。Spring初始化時,會通過該方法將ApplicationContext對象注入。 例如:package com.auth.util;import org.springframework.beans.BeansException;import org.springframework.context.ApplicationContext;import org.springframework.context.ApplicationContextAware;//通過接口ApplicationContextAware獲得spring上下文public class Context implements ApplicationContextAware {private static ApplicationContext ctx;//設置ApplicationContext對象public void setApplicationContext(ApplicationContext context)throws BeansException {// TODO Auto-generated method stubctx=context;}//通過beanName獲得實例public static Object getBean(String beanName){return ctx.getBean(beanName);}}
總結
以上是生活随笔為你收集整理的java上下文的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。