Spring MVC 在启动的时候是怎么初始化其特有的类的

本文深入探讨了SpringMVC的初始化过程,从DispatcherServlet的启动到HandlerAdapter和HandlerMapping等核心组件的初始化细节,揭示了SpringMVC如何在启动阶段完成参数解析器和返回值解析器的设置。

昨天重新看了一遍Spring的源码,着重看了一下Spring MVC对请求参数的解析部分,但是发现如果要对这块有更好的理解首先要先明白SpringMVC所特有的一些类(比如)是怎么初始化的

这里我只是说一下初始化流程,具体的代码就不说了(太详细可能我也说不出来大笑),只是做个备注:

因为我们一般在web.xml中配置DispatcherServlet的时候load-on-startup设置为立即执行,那么在容器启动后(即Spring初始化完成后),那么执行servlet的init方法进入SpringMVC初始化入口:


这里的this直接指向HttpSerletBean.init方法

接着,调用子类FrameworkServlet的initServletBean()方法:

可以看到这里初始化了WebApplicationContext亦即SpringMVC的容器,我们看一下在容器初始化的时候做了哪些工作(FrameworkServlet.initWebApplicationContext());


接着进入createWebApplicationContext(rootContext);


可以看到这里初始化了一个XmlWebApplicationContext的实例,并通过configureAndRefreshWebApplicationContext(wac)方式对该实例进行一些设置:


注意标黄的那个Listener,后面再refresh的执行过程中会调用该listener的onApplicationEvent方法,接下来执行wac.refresh()方法:


可以看到这里做了一些列的操作,包括事件广播初始化、注册事件以及最后的发布事件

AbstractApplicationContext.publicEvent:


通过SimpleApplicationEventMulticaster发布事件


执行监听器:


这里执行的监听器包括所以在spring中声明的ApplicationListener实例(猜测),当然也包括刚才的那个SourceFilteringListener监听器:


在执行监听器SourceFilteringListener的过程中,该类通过一系列的delege模式最终执行到FrameworkServlet的内部类ContextRefreshListener的onApplicationEvent方法:






可以看到,在initStrategies方法中就出现了初始化HandlerAdapter和HandlerMapping的方法,而我们常用的RequestMappingHandlerAdapter和RequestMappingHandlerMapping都直接或者间接的实现了InitializingBean接口,而这个接口唯一的实现方法afterPropertiesSet是在所有bean初始化后执行,那么我们看一下这两个类中的afterPropertiesSet中各自实现了什么:

RequestMappingHandlerAdapter:


可以看到,HandlerAdapter的afterPropertiesSet初始化了参数及返回值的解析类

HanlderMapping


而HandlerMapping则是注册所有的HandlerMethod。

看了一遍代码才知道,原来Spring在初始化的时候做了这么多时期,也知道了原来参数解析器和返回值解析器实在监听器执行的过程中通过HandlerAdapter的afterPropertiesSet方法实现的。通过这么一次代码的阅读加深了我对springmvc的理解,以后还是要抽时间多看一下源码的。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值