tomcat的servletContext、dispatcherServlet和web應用的ApplicationContext、webApplicationContext的區別

接觸Spring初期的時候,基本上是隻學會怎麼用Spring mvc或者Spring boot框架來搭建一個web應用,跟着寫一些配置,但是沒有太弄明白每個配置的意義,爲什麼要有這樣的配置,是否必須要有,特別是神祕的ApplicationContext,似乎是抓不着,但是又處處都要使用到它,那麼經常看到的servletContext、dispatcherServlet、ApplicationContext、webApplicationContext到底是什麼呢?

首先我們明確一個東西,那就是servlet(例如servletContext、dispatcherServlet)是一個與平臺無關的web組件,用於接收並響應請求,一般由web容器(例如tomcat)來管理servlet的生命週期,而ApplicationContext是web應用上下文環境,用於管理web應用中的bean對象的生命週期,servlet是ApplicationContext在web容器的宿主環境。

那麼什麼是tomcat?tomcat是一個web容器,當一個http請求到達web容器,它會將這個請求封裝成httpServletRequest發送給web應用,其實是轉發給對應的web Application Context,執行對應的controller對象中的方法,而web Application Context又可以調用Application Context中的bean,因爲Application Context(父上下文)是一個全局的bean容器。

那servletContext和dispatcherServlet又分別是什麼呢?servletContext是tomcat創建的一個全局的應用環境,是Application Context的宿主環境,而dispatcherServlet是Web Application Context的宿主環境。

在spring中,Application Context和Web Application Context是兩種不同的容器,他們的配置和初始化都是不同的。

Application Context是由 ContextLoaderListener或ContextLoaderServlet初始化的,他們在web.xml中由<listener/>標籤指定, ContextLoaderListener有兩個作用,一個是創建一個上下文(applicationContext,AC),並將它關聯到servletcontext中,另一個是根據<context-param/>標籤中的指定xml文件實例化其中的bean(實際上是controller一下層的所有bean),並把實例化的bean關聯到根上下文。一個應用只有一個Application Context。但是Application Context也不是必須有的(unnecessary),因爲Application Context主要管理的是所有web servlet可以公用的bean,如果只有一個web servlet且bean不是特別多的話可以不用Application Context。

Web Application Context是Application Context的子上下文,在web.xml文件中由<servlet/>標籤指定,一個DispatcherServlet關聯一個Web Application Context,該servlet創建一個Web Application Context,並根據<servelrt/>標籤的子標籤<init-param/>指定的文件實例化其中的bean(controller層的bean),這些bean關聯到Web Application Context中。一個應用可以有多個Web Application Context。

這樣分離開的好處是根Application Context不用管上層(controller)是怎麼實現的(不管是struct還是Spring mvc)。

那麼父子Application Context的關係是怎樣的呢?子上下文可以調用父上下文中定義的bean,但是反之則不行

 

ref:https://www.codesenior.com/en/tutorial/Spring-ContextLoaderListener-And-DispatcherServlet-Concepts

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章