1、對於一個web 應用,其部署在web 容器中,web 容器提供其一個全局的上下文環境,這個上下文就是 ServletContext ,其后面的spring IoC 容器提供宿主環境
2、在web.xml 中會提供有 contextLoaderListener。在web 容器啟動時,會觸發容器初始化事件,此時 contextLoaderListener 會監聽到這個事件,其 contextInitialized 方法會被調用,在這個方法中,spring 會初始化一個啟動上下文,這個上下文就被稱為根上下文,即 WebApplicationContext ,這是一個借口類,確切的說,其實際實現類是 XmlWebApplicaitonContext 。這個就是Spring 的Ioc 容器,其對應的Bean 定義的配置由web.xml 中的 context-param 標簽指定。在這個Ioc 容器初始化完畢后,spring 以WebApplicationContext.ROOTWEBAPPLICATIONEXTATTRIBUTE 為屬性key,將其存儲到 servletContext 中,便於獲取
3、contextLoaderListener 監聽器初始化完畢后,開始初始化web.xml 中配置的servlet ,這個servlet 可以配置多個,以最常見的DispatcherServlet 為例,這個servlet 實際上是一個標准的前端控制器,用以轉發、匹配、處理每個servlet 請求。DispatcherServlet 上下文在初始化的時候會建立自己的Ioc 上下文,用以持有springmvc 相關的bean。在建立DispatherSrvlet 自己的Ioc 上下文時,會利用 WebApplicationContext.ROOTWEBAPPLICATIONCONTEXTATTRIBUTE 先從ServletContext 中獲取之前的根上下文(即 WebApplicationContext)作為自己上下文的parent 上下文,有了這個parent 上下文之后,再初始化自己持有的上下文。這個DispatcherServlet 初始化自己上下的工作在其 initStrategies 方法中可以看到,大概的工作就是初始化處理器映射、視圖解析等,這個servlet 自己持有的上下文默認實現類也是 XmlWebApplicationContext。初始化完畢后,spring以與Servlet 的名字相關的屬性為屬性key,將其存到servletcontext 中,以便后續使用。這樣每個Servlet 都持有自己的上下文,即擁有自己獨立的bean 空間,同事各個servlet 共享相同的bean,即根上下文定義的那些bean
