在这一章 SpringMVC原理(2)-目标方法是怎么被找到的 我们拿到了HandlerExecutionChain
对象,也就是目标方法。那现在怎么执行目标方法呢?就需要一个处理器适配器来执行,所以现在需要找到目标方法合适的处理器适配器
我们是在@Controller
标注的类中声明标注@xxxMapping
注解的接口方法,所以拿到的HandlerExecutionChain
对象中的Handler
其实是HandlerMethod
对象,也就是目标方法。所以下面我写Handler
或目标方法都指的是一个意思。
getHandlerAdapter()
核心方法:
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
:为处理器返回一个支持处理它的处理器适配器
protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException {
if (this.handlerAdapters != null) {
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");
}
遍历所有的HandlerAdapter
调用其supports()
方法来判断当前处理器适配器是否支持处理此Handler
其实就是判断当前的这个Handler
是不是某一个类。
我们这里RequestMappingHandlerAdapter
就能处理,因为我们之前拿到的就是一个HandlerMethod
:
// 我们默认在controller里声明的接口方法就是用的这个适配器来处理
public final boolean supports(Object handler) {
return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
}
protected boolean supportsInternal(HandlerMethod handlerMethod) {
return true;
}
至此我们就拿到了对应的HandlerAdapter
,这一步还是比较简单的。后续就会通过HandlerAdapter
来执行目标方法
总结
HandlerAdapter
HandlerAdapter
public interface HandlerAdapter {
// 判断是否支持处理此Handler
boolean supports(Object handler);
// 调用目标方法来处理此请求
@Nullable
ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;
long getLastModified(HttpServletRequest request, Object handler);
}
RequestMappingHandlerAdapter
它专门用于处理带有@xxxMapping
注解的控制器方法。(最常用)一个一个的接口方法会被封装为HandlerMethod
对象
public final boolean supports(Object handler) {
return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
}
protected boolean supportsInternal(HandlerMethod handlerMethod) {
return true;
}
HttpRequestHandlerAdapter
用来处理实现了HttpRequestHandler
接口的类。我们跨域的时候就用到了这个处理器适配器和这个HttpRequestHandler
。
public boolean supports(Object handler) {
return (handler instanceof HttpRequestHandler);
}
SimpleControllerHandlerAdapter
用来处理实现了Controller
接口的类。
public boolean supports(Object handler) {
return (handler instanceof Controller);
}
HandlerFunctionAdapter
用来处理函数式编程风格的接口。
public boolean supports(Object handler) {
return handler instanceof HandlerFunction;
}