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:00
新的理解:
DispatcherServlet分为两步
1.初始化阶段
2.调用阶段
1.初始化阶段,该过程仅执行一次
最终执行节点为 org.springframework.web.servlet.DispatcherServlet#onRefresh
2.调用阶段,该过程为多次执行
最终执行节点为 org.springframework.web.servlet.DispatcherServlet#doService