spring boot 从请求到加载页面的过程。

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
handlerMethodReturnValueHandlersHttpMessageConvertorsResponseBodyAdvices 等到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 剩下的代码。能够讲的就这么多,
接下来的不属于本次研究范围。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值