spring boot 从请求到加载页面的过程。
1.过滤器
Tomcat thread 接受到请求调用 apache 中的 ApplicationFilterChain 执行 doFilter 方法 , doFilter 执行internalDoFilter, 此方法依次调用每个 Filter 中的doFilter 方法, 并将ApplicationFilterChain 实例传递给每一个Filter。
接着所有doFIlter 执行完毕, 控制权交回ApplicationFilterChain
2. servlet(DispatcherServlet)
开始调用Servlet, 类型是 DispatcherServlet(org.springframework.web.servlet 下面),
spring DispatcherServlet继承 FrameworkServlet,
FrameworkServlet 继承 HttpServletBean ,
HttpServletBean继承 httpServlet,
依次执行 httpServlet:
public service方法 ->
FrameworkServlet: protected service方法 ->
httpServlet: protected service方法 ->
FrameworkServlet: doGet(或者其他的doXX方法, 这些doXX 方法被 FrameworkServlet override 了,
所以实际调用的是FrameworkServlet) ->
DispatcherServlet: doService -> doDispatch
doDispatch中获取处理器和处理器适配器
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
// Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
```java
@Nullable
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
if (this.handlerMappings != null) {
for (HandlerMapping mapping : this.handlerMappings) {
HandlerExecutionChain handler = mapping.getHandler(request);
if (handler != null) {
return handler;
}
}
}
return null;
}
doDispatch 方法执行拦截器的preHandle, 然后开始调用spring 的核心类RequestMappingHandlerAdapter:
调用RequestMappingHandlerAdapter 的handle方法
handle创建ServletInvocableHandlerMethod实例,
然后向其中注入一些解释器Resolvers
handle-> 执行handleInternal 方法-> 创建 ServletInvocableHandlerMethod
实例(这个实例是方法级别, 即方法返回,实例会被垃圾回收)-> 注入全局的
的HandlerMethodArgumentResolvers ,
handlerMethodReturnValueHandlers, HttpMessageConvertors, ResponseBodyAdvices 等到ServletInvocableHandlerMethod 对象实例中。并调用ServletInvocableHandlerMethod: invokeAndHandle 方法, 该方法通过java 反射机制 动态调用目标API 方法 进入相对应具体的controller,并执行 具体的业务逻辑,
ResponseEntity 作为 controller 的返回值。
执行完毕 , 控制权返回 到 invokeAndHandle 方法, 接下来选择合适的
HandlerMethodReturnValueHandler 的实现类(HttpEntityMethodProcessor), 执行
handleReturnValue 方法, 首先会判断是否需要对response entity
进行二次处理(ResponseBodyAdvice: beforeBodyWrite), 处理完成后,
调用注册进来的MessageConvertor 对返回信息进行转换处理, 比如使用faster Jackson 把对象类型转成 json
字符串,并以application/json 的形式返回 http response。此时,控制权转会到 RequestMappingHandlerAdapter, 继续执行完毕, 控制权转回
DispatcherServlet: doDispatch, 执行对应的拦截器 postHandle 方法,
最后执行拦截器的afterCompletion 方法。控制权转回ApplicationFilterChain , 继续执行Filter 剩下的代码。能够讲的就这么多,
接下来的不属于本次研究范围。