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事件