SpringMVC DispatcherServlet 启动和加载过程(源码调试) (2)

注意,这里方法入参处的 ApplicationListener degegate = FrameworkServlet$ContextRefreshListener,且成员变量中的 GenericApplicationListener degegate = GenericApplicationListenerAdapter;同时方法入参中的 degegate 会被 GenericApplicationListenerAdapter 包装后赋值给成员变量的 delegate(有点绕,所以用了三种颜色以示区分)

可以这样来记忆或理解:

一、对于 SourceFilteringListener 来说,其成员变量 degegate 的类型是 GenericApplicationListenerAdapter 

二、对于 GenericApplicationListenerAdapter  来说,它也有个叫做 delegate 的成员变量,且这个 delegate 的类型是 FrameworkServlet$ContextRefreshListener

(虽然这两个同名叫做 delegate 的成员变量有点绕,但它们比较重要,后面会用到)

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

SourceFilteringListener 构造完成后,回到上一层方法调用处;

接下来,代码走到 Line667 行进行刷新

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

 

这个 refresh() 方法是 Spring 中非常重要的一个方法,会调用多个方法执行多个动作,包括初始化BeanFactory、容器后处理器处理、初始化MessageSource、注册监听器等动作;

refresh() 方法非常重要!!!

refresh() 方法非常重要!!!

refresh() 方法非常重要!!!

这里,暂时关心的是,它会读取我们为 SpringMVC 所编写的配置文件中的内容(如 annotation-driven & default-servlet-handler 等,这属于上一篇文章的内容,具体可参见 这里);

之后,它会调用 Line541 行的方法,完成刷新

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

经过几个方法的调用,代码走到 Line136 ,并且此处的 listener=SourceFilteringListener(通过 Line125 获取到之前添加进来的Listener,且这个 listener=SourceFilteringListener)

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

 然后调用 SourceFilteringListener 的 onApplicationEvent() 方法

 

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

继续调用

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

继续调用,注意当前类是 SourceFilteringListener,且这个 delegate=GenericApplicationListenerAdapter(就是之前设置进来的

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

现在来到 GenericApplicationListenerAdapter 类中,注意此处的 delegate=FrameworkServlet$ContextRefreshListener(之前设置进来的),所以,实际上会调到 ContextRefreshListener 的 onApplicationEvent() 方法

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

调用到 FrameworkServlet 中内部类 ContextRefreshListener  的 onApplicationEvent() 方法,而它又是直接调用到 FrameworkServlet  的 onApplicationEvent() 方法

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

 这个方法会调用到 onRefresh() 方法;而 FrameworkServlet 的 onRefresh() 方法默认实现为空(让子类扩展)

SpringMVC DispatcherServlet 启动和加载过程(源码调试)

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zyyxwj.html