springBoot请求处理原理---HandlerAdapter

Spring框架中的HandlerAdapter接口用于配置请求处理适配器,可以根据需求实现自定义处理器。AbstractHandlerMethodAdapter是其实现之一,包含支持判断和支持执行两个关键步骤。在处理过程中,涉及了HandlerMethodArgumentResolver参数解析和HandlerMethodReturnValueHandler返回值处理。最后通过反射调用实际的方法执行。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

spring提供了HandlerAdapter接口,用于配置处理请求的适配器,根据自定义需要可以实现该接口,编写自己的handler处理器:
public interface HandlerAdapter {

	/**
	 *判断一个请求是否能被当前处理器处理,返回一个boolean值
	 */
	boolean supports(Object handler);

	/**
     * 如果一个请求能被当前处理器处理,则执行该处理逻辑
	 */
	@Nullable
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

}

示例:

AbstractHandlerMethodAdapter 实现了HandlerAdapter

①:是否支持

	@Override
	public final boolean supports(Object handler) {
                //判断当前handler是不是HandlerMethod类型
		return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
	}

②:执行handler:

	@Override
	@Nullable
	public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
			throws Exception {

		return handleInternal(request, response, (HandlerMethod) handler);
	}

核心:执行handler

ha.handle(processedRequest, response, mappedHandler.getHandler());

invokeHandler:

invokeHandlerMethod(request, response, handlerMethod);

参数解析器:HandlerMethodArgumentResolver

public interface HandlerMethodArgumentResolver {

	/**
	 * 是否支持当前参数解析器
	 */
	boolean supportsParameter(MethodParameter parameter);

	/**
	 * 解析当前参数
	 */
	@Nullable
	Object resolveArgument(MethodParameter parameter, @Nullable ModelAndViewContainer mavContainer,
			NativeWebRequest webRequest, @Nullable WebDataBinderFactory binderFactory) throws Exception;

}

返回值处理器:HandlerMethodReturnValueHandler

public interface HandlerMethodReturnValueHandler {

	/**
	 * 是否支持当前返回值处理器
	 */
	boolean supportsReturnType(MethodParameter returnType);

	/**
	 * 处理当前返回值
	 */
	void handleReturnValue(@Nullable Object returnValue, MethodParameter returnType,
			ModelAndViewContainer mavContainer, NativeWebRequest webRequest) throws Exception;

}

真正开始执行handler目标方法:

Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
	public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
			Object... providedArgs) throws Exception {

		Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
		if (logger.isTraceEnabled()) {
			logger.trace("Arguments: " + Arrays.toString(args));
		}
        //执行方法
		return doInvoke(args);
	}

通过反射执行方法:

	protected Object doInvoke(Object... args) throws Exception {
		Method method = getBridgedMethod();
		try {
			if (KotlinDetector.isSuspendingFunction(method)) {
				return CoroutinesUtils.invokeSuspendingFunction(method, getBean(), args);
			}
            //执行方法
			return method.invoke(getBean(), args);
		}

spring提供了以下几种handlerAdapter:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值