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: