javascript
springmvc项目在启动完成之后执行一次方法_SpringMVC运行原理
springMVC主要有四大控件,其中有DispatcherServlet,hadlerMapping,HanlerAdapter,ModelAndView。 springMVC的運行步驟大致是當客服端發送請求,DispatcherServlet主控制器接收到請求,交由hadlerMapping根據uri找到相應的HanlerAdapter,由HanlerAdapter交由具體的controller處理業務,處理業務之后返回給ModelAndView,由這個控件去返回處理結果,并經過視圖映射,處理視圖返回給客戶端解析,至此可以完成一個請求。
首先我們看它的dispatcherservlet
它的繼承的結構,HttpServletBean:
HttpServletBean 覆寫了 init 方法,主要做一些初始化的工作,將 web.xml 中配置的參數設置到 Servlet 中。比如 servlet 標簽的子標簽 init-param 標簽中配置的參數。我們進入到HttpServletBean 類中,它有一個Init方法,在這個方法中,會進行springMVC啟動時的一些的配置的信息。
它有一個 ServletConfigPropertyValues的一個靜態內部類。在其構造方法中通過傳遞的 ServletConfig 對象對 web.xml 文件中的 DispatcherServlet 節點中的參數進行解析處理。在這個方法中會首先創建一個Set集合然后調用config.getInitParameterNames()方法獲取到一個配置的詳細的枚舉集合,然后去除枚舉中的配置信息放到springmvc的配置中去,
然后我們看BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);,將 HttpServletBean 類型轉換為 BeanWrapper 類型,從而能對 init-parameter 的值進行注入。進入這個方法:
繼續下看bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));這個步驟是進行注冊自定義屬性編輯器,遇到 Resource 類型的屬性將會使用 ResourceEditor 進行解析。
然后 initBeanWrapper(bw):該方法并未做什么,為了留給子類覆蓋。該方法中什么內容都沒有
bw.setPropertyValues(pvs, true):設置 DispatcherServlet 屬性
initServletBean():調用在 FrameworkServlet 中覆蓋的該方法
FrameworkServlet 將 Servlet 上下文與 Spring 容器上下文關聯。其實也就是初始化 FrameworkServlet 的屬性 webApplicationContext ,這個屬性代表 SpringMVC 上下文對象,實際類型ConfigurableWebApplicationContext。如果項目中用到 spring 了那么它有個父容器,既 web.xml 中配置的 ContextLoaderListener 監聽器初始化的容器上下文
接著來看FrameworkServlet 中的方法,進去:
this.webApplicationContext = initWebApplicationContext():
可以看到,最重要的就是 this.webApplicationContext = initWebApplicationContext();這段代碼,這個方法的作用是創建或刷新 WebApplicationContext 實例。如果項目中使用到了 spring,則進行父子容器關聯。進去這個方法:
我們會反倒這樣的方法,在這個方法中,
獲取 spring 框架的根容器,如果項目中使用 spring 框架,并且在 web.xml 文件中配置了 Listener 來啟動 spring。那么在監聽器中 spring 會創建 WebApplicationContext 容器。此時會將該容器轉換為ConfigurableWebApplicationContext 即 SpringMVC 容器。那么他會繼續執行cwac.setParent(rootContext);方法,會將springMVC的容器的父容器設置為spring的容器,這樣就形成了父子容器的關系,如果沒有在 web.mxl 文件中配置 Listener 那么此時 webApplicationContext為空則去 ServletContext 中根據 attrname 查找。如果為找到,執行 createWebApplicationContext 方法來創建 SpringMVC 的容器。
會調用這個方法來創建springMVC的容器。我們進入到這個方法中:
繼續進入:
首先它會通過這個Class<?> contextClass = getContextClass();方法獲取到XmlWebApplicationContext類型。
接著會創建出springMVC容器,但是這個時候并未對springMVC的容器進行配置,而只是創建出來后,對他的環境等先做了設置,在執行:
這個方法的時候才會對spring MVC的具體內容進行設置。
進到這個方法中,對springMVC的配置屬性的注入,在refresh方法中,進入這個方法:
你會很神奇的發現這個就是spring啟動的方法,這個是一樣的,如果你讀過spring啟動的源代碼這個你就不陌生,你可以看上一篇文章,這個進去之后,你會找到:
這個方法中的,processBeanDefinition(ele, delegate);就是去解析bean的內容的方法,進入:
再進這個方法中,
它會先對一些屬性進行設置,然后進入到AbstractBeanDefinition beanDefinition = parseBeanDefinitionElement(ele, beanName, containingBean);這一步的方法中,才會對bean進行具體的解析,進入:
在這個方法中它就會對bean進行注冊。
bean注冊完成后它是怎么對命令空間進行注冊解析,這個時候就要回到
這個地方,這里的doRegisterBeanDefinitions(ele);會對命名空間進行解析,進入到這個方法中去:
找到這個方法進入:
它會先獲取到url,然后調用this.readerContext.getNamespaceHandlerResolver().resolve(namespaceUri);進行解析進入:
在這個方法中會對命名空間進行解析,解析完成后他會將相對應得bean給實例化出來。也會將你的配置得屬性全部解析出來,包括你配置文件中得與你注解注入得。
這些完成之后,他會調用DispatcherServlet下面得onRefresh方法去初始化我們springMVC之中得基礎得組件,比如文件上傳,視圖處理等得組件。也就將剩余得幾個組件全部給初始化創建出來,那這個方法是什么時候調用得:還得回到SpringMVC容器得創建中。
它是在這個時候被調用得:
在創建webApplicationContex方法中:
在這里他會找到創建一個監聽器,初始化一個new ContextRefreshListener(),我們進入這個對象中,
進入:
在這里調用了onRefresh得方法,這就是dispatcher得一個初始化配置得過程,后面得幾個組件得源碼步驟下一篇見。
總結
以上是生活随笔為你收集整理的springmvc项目在启动完成之后执行一次方法_SpringMVC运行原理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python 编译器重构_Python之
- 下一篇: 32时间片轮转_系统时间