DispatcherServlet 被加載順序

 

javax.servlet.Servlet#init 0
 -> javax.servlet.GenericServlet#init(javax.servlet.ServletConfig) 1
 -> javax.servlet.GenericServlet#init() 2
 -> org.springframework.web.servlet.HttpServletBean#init 3
 -> org.springframework.web.servlet.HttpServletBean#initServletBean 4
 -> org.springframework.web.servlet.FrameworkServlet#initServletBean 5
 -> org.springframework.web.servlet.FrameworkServlet#initWebApplicationContext 6
 -> org.springframework.web.servlet.FrameworkServlet#onRefresh 7
 -> org.springframework.web.servlet.DispatcherServlet#onRefresh 8
 
 org.springframework.web.servlet.DispatcherServlet實例化起始: 
    - org.springframework.web.servlet.HttpServletBean#init:148行開始 -> 174行結束
 
 2實現0中init方法接口
 1的有參init調用2的無參重寫0的init方法
 3重寫1的空參init方法
 3中會調用4的空參空方法體方法initServletBean
 5重寫4中的空參空方法體方法initServletBean
 5調用6的空參方法initWebApplicationContext
 
 6方法執行完553行後,ApplicationContext器會準備就緒
    * 此時會經過判斷 556行,[!this.refreshEventReceived] 判斷是否已經接收容器準備就緒事件,
        若是已經接收,則表示已經調用org.springframework.web.servlet.FrameworkServlet.ContextRefreshListener#onApplicationEvent監聽委託方法,
        說明已經調用7的onRefresh進行下一步初始化操做
    * 若是未接收容器準備就緒事件,則調用 7的onRefresh進行下一步初始化操做,以後會將ApplicationContext容器放入servletContext中
        String attrName = getServletContextAttributeName();
        getServletContext().setAttribute(attrName, wac);
    * 直接會調用org.springframework.web.servlet.FrameworkServlet#initFrameworkServlet方法
    * 至此完成初始化工做
    
說明:7的方法空參方法onRefresh,會被8中onRefresh方法重寫,實際調用爲8中方法

 
 
 另:
 對於7的onRefresh方法,在FrameworkServlet類中有兩個方法進行調用
 1個是7中的initWebApplicationContext方法
 2個是org.springframework.web.servlet.FrameworkServlet#onApplicationEvent方法,
    該方法被內部類的org.springframework.web.servlet.FrameworkServlet.ContextRefreshListener#onApplicationEvent方法調用,
    主要用於(ApplicationListener endpoint that receives events from this servlet's WebApplicationContext only, 
    delegating to onApplicationEvent on the FrameworkServlet instance.)
    【ApplicationListener類的監聽端點,僅接收這個servlet WebApplicationContext事件,
    並委託給FrameworkServlet.ContextRefreshListener內部類中的onApplicationEvent方法,該監聽器方法監聽ContextRefreshedEvent事件,
    觸發條件爲ApplicationContext 被初始化或刷新時,該事件被髮布。
    這也能夠在 ConfigurableApplicationContext接口中使用 refresh() 方法來發生。
    此處的初始化是指:全部的Bean被成功裝載,後處理Bean被檢測並激活,全部Singleton Bean 被預實例化,ApplicationContext容器已就緒可用】
 

 

2019-08-28 14:00java

新的理解:web

DispatcherServlet分爲兩步spring

1.初始化階段this

2.調用階段spa

 

1.初始化階段,該過程僅執行一次code

最終執行節點爲 org.springframework.web.servlet.DispatcherServlet#onRefreshblog

 

2.調用階段,該過程爲屢次執行接口

最終執行節點爲 org.springframework.web.servlet.DispatcherServlet#doService事件

相關文章
相關標籤/搜索