doget或者doPost进入doService方法
org.springframework.web.servlet.FrameworkServlet#doGet
org.springframework.web.servlet.FrameworkServlet#doPost
org.springframework.web.servlet.FrameworkServlet#doService
//核心的分发逻辑
org.springframework.web.servlet.DispatcherServlet#doDispatch
//最关键的几行代码
// Determine handler for the current request. //根据请求获取处理器映射器 mappedHandler = getHandler(processedRequest); if (mappedHandler == null) { noHandlerFound(processedRequest, response); return; } // Determine handler adapter for the current request. //根据处理器映射器来获取处理器适配器 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
org.springframework.web.servlet.handler.AbstractHandlerMapping#getHandler
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#getHandlerInternal
protected HandlerMethod getHandlerInternal(HttpServletRequest request) throws Exception { String lookupPath = getUrlPathHelper().getLookupPathForRequest(request); request.setAttribute(LOOKUP_PATH, lookupPath); //注意这里加了一个读锁,作用:我猜测是防止高并发请求导致读到的请求url不一致,我也不肯定 this.mappingRegistry.acquireReadLock(); try { HandlerMethod handlerMethod = lookupHandlerMethod(lookupPath, request); return (handlerMethod != null ? handlerMethod.createWithResolvedBean() : null); } finally { this.mappingRegistry.releaseReadLock(); } }
org.springframework.web.servlet.handler.AbstractHandlerMethodMapping#lookupHandlerMethod
protected HandlerMethod lookupHandlerMethod(String lookupPath, HttpServletRequest request) throws Exception { List<Match> matches = new ArrayList<>(); //根据请求的url来获取对应的HandlerMethod,注意这个mappingRegistry是我们之前分析的如何收集 //controller过程,详见springmvc第二篇文章 List<T> directPathMatches = this.mappingRegistry.getMappingsByUrl(lookupPath); if (directPathMatches != null) { addMatchingMappings(directPathMatches, matches, request); }
如果第一个处理器映射器找不到的话,则去第二个处理器映射器寻找BeannameurlHandlerMapping
org.springframework.web.servlet.handler.AbstractUrlHandlerMapping#getHandlerInternal
如果都找不到的话则报404,找到的话则通过反射调用自己的业务逻辑
适配器流程分析
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
这里处理器适配器的初始化和处理器映射器的初始化过程一模一样,在初始化9大组件的时候进行初始化的
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException { if (this.handlerAdapters != null) { //这里初始化了3个值,进行一一匹配,匹配成功返回处理器适配器 for (HandlerAdapter adapter : this.handlerAdapters) { if (adapter.supports(handler)) { return adapter; } } } throw new ServletException("No adapter for handler [" + handler + "]: The DispatcherServlet configuration needs to include a HandlerAdapter that supports this handler"); }