DispatcherServlet
FrameworkServlet
HttpServletBean
HttpServlet
接口 ApplicationContextAware
DispatcherServlet 就是一个servlet
1.FrameworkServlet.doGet()或者FrameworkServlet.doPost() 调用processRequest(request, response);
2.DispatcherServlet.doService(request, response);
所以我们就知道DispatcherServlet 为什么是前端控制器了
1、DispatcherServlet 初始化流程
1、因为DispatcherServlet是servlet。所以调用init()初始化
2、initServletBean();->initWebApplicationContext() 初始化上下文
若webApplicationContext不为空的时候从SerlvetContext去出根上下文作为它的双亲上下文
1、这里通过调用子类DispatcherServlet实现的onRefresh方法 onRefresh()
1、initStrategies(context);启动了整个SpringMVC框架
1、initHandlerMappings() 初始化所有的HandlerMapping
1、从导入所有的HandlerMappingBean,这些Bean有可能存在与双亲容器中,也可能在DispathcerServlet持有的容器的,这里detectAllHandlerMappings默认为true,默认从所有容器中导入
2、detectAllHandlerMappings默认为FALSE ,从当前的IOC容器中通过getBean方法获取handlerMapping
3、如果还是没有找到hadlerMapping就需要设定默认的handlerMappings了
2、把当前建立好的上下文存到ServletContext里面去
2、HTTP请求是如何与对应Handler的对应method映射的
例如:RequestMappingHandlerMapping
1、 spring 实例化RequestMappingHandlerMapping(Bean)的时候,调用AbstractHandlerMethodMapping.afterPropertiesSet();
2、initHandlerMethods()
1、String[] beanNames 获取容器中所有bean的名字
2、遍历 判断 是不是handler ,isHandler(beanType)->判断是否有Controller或者RequestMapping注解
3、如果是handler,就执行detectHandlerMethods(beanName); 检测发现对应的HandlerMethod
1、通过handlerType 得到一个叫methods的Map,Map的类型是key为Method,value为RequestMappingInfo(key是方法名,value是uri),
2、循环注册registerHandlerMethod
HandlerMethod handlerMethod = createHandlerMethod(handler, method);
1、根据handler和method,创建一个包含handler和method信息的HandlerMethod,
2、注册requestMapping与HandlerMethodInfo的关系
3、detectHandlerMethods(Object handler)
Map<Method, T> methods = MethodIntrospector.selectMethods()
1、获取这个handler中有requestMapping的方法,放到map中,key为方法信息(public ModelAndView handle01()),value为方法注解信息({[/demo/handle01]})
3、SpingMVC处理Http请求原理
1、http请求先经过DispatcherServlet控制器,调用doService方法,最终调用到doDispatch(request, response);
2、doDispatch(request, response)
1、mappedHandler = getHandler(processedRequest);
HandlerExecutionChain executionChain = getHandlerExecutionChain(handler, request);
1、返回了一个包含了HandlerMethod和拦截器链的这么一个对象,
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
2、根据handler返回一个支持当前handler的HandlerAdapter
3、mappedHandler.applyPreHandle(processedRequest, response) 执行前置拦截器
4、ha.handle(processedRequest, response, mappedHandler.getHandler()); 执行handler方法
5、mappedHandler.applyPostHandle(processedRequest, response, mv); 执行后置拦截器