SpringMVC是对servlet的一种封装,所以执行流程需要遵守servlet的声明周期,init、serivce、destory
1、当请求到达时首先要进入到frameworkServlet的service方法中,随后会通过tomcat的源码的解析执行对应的doGet、doPost、doPut等 *** 作。
2、最终都会调用一个processRequest的方法,这个方法中有一些列的设置 *** 作。
3、随后调用doService方法,此方法在DispatcherServlet中,为request对象设置一些springmvc的内置组件。
4、随后调用核心方法doDispatch此方法在DispatcherServlet中。
4-1:首先校验是否是上传的请求,主要判断请求中是否有multipart/开头的属性。如果是解析文件等信息放入request中。
4-2:调用getHanler方法,获取处理器,这里面主要两个默认的类中的变量进行识别。
4-2-1:RequestMappingHandlerMapping,最终会将所有的@RequestMapping修饰的方法放入到MappingLookUp变量中,此变量中的值是在doCreateBean方法中的InitializeBean方法中的实现了initialztionBean类重写了afterProperiesSet方法中进行赋值的。
4-2-2:BeanNameUrlHandlerMapping,最终会将配置文件中以/开头的bean加入到handlerMap变量中,此变量中的值是在doCreateBean方法中的InitializeBean方法中的BeanPostProcessorBefore方法中的通过实现了ApplicationContextAware接口从而调用setApplicationContext方法经过一系列 *** 作进行赋值的。
此方法还会获取的我们系统定义的拦截器,如果没有定义会初始化两个默认的拦截,最后封装到一个HandlerExecutionChain的类中进行返回。
4-3:调用getHandlerAdapter方法获取合适的适配器,这里有三个默认的适配器来对我们的handler进行匹配。
4-3-1:RequestMappingHandlerAdapter:适配@controller注解修饰的类,最经常用的。因为方法名是我们自定义的所以会发生一些列很复杂的 *** 作,下面会说。
4-3-2:HttpRequestHandlerAdapter:适配实现了HttpRequestHandler接口的方法,直接重写其中的handlerRequest方法即可调用。
4-3-3:SimpleControllerHandlerAdapter:适配实现了Controller接口的方法,直接重写其中的handlerRequest方法即可调用。
4-4:进行拦截器的前置处理方法,这块有一个好玩的地方,就是拦截器前置处理方法如果发生了异常,那么会把已经执行过拦截器前置处理方法的拦截器反向执行器后置处理方法。
4-5:如果是get请求,调用getLastModified方法,静态资源缓存作用。
4-6:核心方法来了奥,调用ha.hanler方法,是通过4-3获取的适配器进行调用,如果是4-3-2和4-3-3的是配置直接调用重写的handlerRequest方法即可。如果是RequestMappingHandlerAdapter方法那么好玩的就来了。这块会有很大的篇幅来说这个里面的处理逻辑。
4-6-1:调用handlerInternal方法。
4-6-2:随后调用invokeHandlerMethod方法。此方法中有一些获取封装 *** 作。
4-6-2-1:首先封装request和response到一个ServletWebRequest的对象中。
4-6-2-2:获取当前类中@InitBinder修饰的方法,以及通过@ControllerAdvice修饰的类中@InitBinder修饰的方法封装到WebDataBinderFactory对象中。
4-6-2-3:获取被@ModalAttribute修饰并且没被@RequestMapping修饰的方法放到ModelFactory对象中。
4-6-2-4:实例化ServletInvocableHandlerMethod类将handlerMethod放入,此类是调用后续真正方法的类。实例化后开始进行赋值,默认的26个参数处理器,默认的15个返回值处理器,2-6-2-2的对象,默认的2个参数名称发现器。
4-6-2-5:实例化ModelAndViewContainer对象进行赋值flashMap等。
4-6-2-6:初始化异步处理器并且赋值WebAsyncManager。
4-6-2-7:调用invokeAndHandler方法准备处理请求。
4-7-2-7-1:调用inokeForRequest方法。
4-7-2-7-1-1:调用getMethodArgementValues解析请求参数。次数用到了默认的26个参数值处理器循环进行匹配验证
4-7-2-7-1-2:doInvoke方法,获取桥接调用我们的方法。
4-7-2-7-2:成功调用后设置响应状态,使用默认的15个返回值处理器进行返回值匹配,通过mavContainer渲染视图或返回json等。
注:如果发生异常需要调用默认的3个异常处理器,ExceptionHandlerExceptionResolver:处理被@ExceptionHandler修饰的方法进行匹配、DefaultExceptionHandlerResolver:处理定了了一堆默认的异常进行匹配、ResponseStatusExceptionResolver:处理了被@ResponseStatus注解修的方法进行匹配。寻找到对应的方法继续调用InvokeHandlerMethod方法同前面调用。
以上为基于个人理解进行纯手敲,每一个字母都是背下来手敲的,附上一张自己画的图。
springmvc执行流程图
理解之上,写出想要说的话!
以上仅为个人拙见,写出来加深记忆,错误之处欢迎大神指正!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)