在获取HandlerMethodAdapter适配器之后, 调用适配器的handle()方法执行处理器, 也就是Control类中我们编写的处理方法
AbstractHandlerMethodAdapter#handle()方法实现:
@Override
@Nullable
public final ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
/**
* Spring默认处理适配器为:RequestMappingHandlerAdapter(注解处理器适配器)
* {@link RequestMappingHandlerAdapter#handleInternal(HttpServletRequest,HttpServletResponse,HandlerMethod)}
*/
return handleInternal(request, response, (HandlerMethod) handler);
}
AbstractHandlerMethodAdapter为RequestMappingHandlerAdapter的父类
RequestMappingHandlerAdapter#handleInternal()方法实现:
@Override
protected ModelAndView handleInternal(HttpServletRequest request,
HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
ModelAndView mav;
checkRequest(request);
//如果需要,在同步块中执行invokeHandlerMethod。
if (this.synchronizeOnSession) {
HttpSession session = request.getSession(false);
if (session != null) {
Object mutex = WebUtils.getSessionMutex(session);
synchronized (mutex) {
mav = invokeHandlerMethod(request, response, handlerMethod);
}
}
else {
// No HttpSession available -> no mutex necessary
mav = invokeHandlerMethod(request, response, handlerMethod);
}
}
else {
//完全不需要会话同步。
/**
* {@link RequestMappingHandlerAdapter#invokeHandlerMethod(HttpServletRequest, HttpServletResponse, HandlerMethod)}
*/
mav = invokeHandlerMethod(request, response, handlerMethod);
}
if (!response.containsHeader(HEADER_CACHE_CONTROL)) {
if (getSessionAttributesHandler(handlerMethod).hasSessionAttributes()) {
applyCacheSeconds(response, this.cacheSecondsForSessionAttributeHandlers);
}
else {
prepareResponse(response);
}
}
return mav;
}
分析:
- 首先对请求进行检查, 对于不支持的请求直接抛出异常
- 根据是否需要进行会话同步执行相关激活HandlerMethod方法
- 返回执行HandlerMethod方法后返回的ModelAndView
RequestMappingHandlerAdapter#invokeHandlerMethod()方法实现:
@Nullable
protected ModelAndView invokeHandlerMethod(HttpServletRequest request,
HttpServletResponse response, HandlerMethod handlerMethod) throws Exception {
//将Request和Response进行封装
ServletWebRequest webRequest = new ServletWebRequest(request, response);
try {
WebDataBinderFactory binderFactory = getDataBinderFactory(handlerMethod);
ModelFactory modelFactory = getModelFactory(handlerMethod, binderFactory);
/**
* 创建InvocableHandlerMethod实例,以及各个组件的配置;
* 后面通过调用invokeAndHandle()方法执行处理器
*/
ServletInvocableHandlerMethod invocableMethod = createInvocableHandlerMethod(handlerMethod);
if (this.argumentResolvers != null) {
invocableMethod.setHandlerMethodArgumentResolvers(this.argumentResolvers);
}
if (this.returnValueHandlers != null) {
invocableMethod.setHandlerMethodReturnValueHandlers(this.returnValueHandlers);
}
invocableMethod.setDataBinderFactory(binderFactory);
invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
/**
* 创建视图容器, 用于封装视图, 数据模型, 处理状态等信息
*/
ModelAndViewContainer mavContainer = new ModelAndViewContainer();
mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
modelFactory.initModel(webRequest, mavContainer, invocableMethod);
mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
AsyncWebRequest asyncWebRequest = WebAsyncUtils.createAsyncWebRequest(request, response);
asyncWebRequest.setTimeout(this.asyncRequestTimeout);
WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
asyncManager.setTaskExecutor(this.taskExecutor);
asyncManager.setAsyncWebRequest(asyncWebRequest);
asyncManager.registerCallableInterceptors(this.callableInterceptors);
asyncManager.registerDeferredResultInterceptors(this.deferredResultInterceptors);
if (asyncManager.hasConcurrentResult()) {
Object result = asyncManager.getConcurrentResult();
mavContainer = (ModelAndViewContainer) asyncManager.getConcurrentResultContext()[0];
asyncManager.clearConcurrentResult();
if (logger.isDebugEnabled()) {
logger.debug("Found concurrent result value [" + result + "]");
}
invocableMethod = invocableMethod.wrapConcurrentResult(result);
}
/**
* 执行处理器
*/
invocableMethod.invokeAndHandle(webRequest, mavContainer);
if (asyncManager.isConcurrentHandlingStarted()) {
return null;
}
/**
* 返回ModelAndView实例, 后面进行视图解析
*/
return getModelAndView(mavContainer, modelFactory, webRequest);
}
finally {
webRequest.requestCompleted();
}
}
分析:
- 创建InvocableHandlerMethod实例,以及各个组件的配置, 后面通过调用invokeAndHandle()方法执行处理器
- 创建视图容器, 用于封装视图, 数据模型, 处理状态等信息
- 执行处理器方法
- 封装ModelAndView实例并返回, 后面进行视图解析
ServletInvocableHandlerMethod#invokeAndHandle()方法的实现:
public void invokeAndHandle(ServletWebRequest webRequest, ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
/**
* 处理请求
* returnValue为返回的ModelAndView实例或者ViewName
*/
Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs);
setResponseStatus(webRequest);
if (returnValue == null) {
if (isRequestNotModified(webRequest) || getResponseStatus() != null || mavContainer.isRequestHandled()) {
mavContainer.setRequestHandled(true);
return;
}
}
else if (StringUtils.hasText(getResponseStatusReason())) {
mavContainer.setRequestHandled(true);
return;
}
mavContainer.setRequestHandled(false);
Assert.state(this.returnValueHandlers != null, "No return value handlers");
try {
/**
* 封装返回的数据信息
*/
this.returnValueHandlers.handleReturnValue(
returnValue, getReturnValueType(returnValue), mavContainer, webRequest);
}
catch (Exception ex) {
if (logger.isTraceEnabled()) {
logger.trace(getReturnValueHandlingErrorMessage("Error handling return value", returnValue), ex);
}
throw ex;
}
}
分析:
- 处理请求
- 封装返回的数据信息
InvocableHandlerMethod#invokeForRequest()方法:
@Nullable
public Object invokeForRequest(NativeWebRequest request, @Nullable ModelAndViewContainer mavContainer,
Object... providedArgs) throws Exception {
Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs);
if (logger.isTraceEnabled()) {
logger.trace("Invoking '" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
"' with arguments " + Arrays.toString(args));
}
/**
* 执行Handler方法
*/
Object returnValue = doInvoke(args);
if (logger.isTraceEnabled()) {
logger.trace("Method [" + ClassUtils.getQualifiedMethodName(getMethod(), getBeanType()) +
"] returned [" + returnValue + "]");
}
return returnValue;
}
分析:
- 获取执行HandlerMethod方法需要的参数, 也就是请求中包含的需要处理的数据
- 执行HandlerMethod方法
InvocableHandlerMethod#doInvoke()方法实现:
/**
* 使用给定的参数值调用处理程序方法。
*/
protected Object doInvoke(Object... args) throws Exception {
ReflectionUtils.makeAccessible(getBridgedMethod());
try {
/**
* 获取桥接方法实例, 并执行该方法
* 执行Control类中编写的方法
*/
return getBridgedMethod().invoke(getBean(), args);
}
catch (IllegalArgumentException ex) {
. . . . . .
}
}
分析:
1. 这里就是获取到HandlerMethod实例中维护的我们编写的处理方法, 然后通过反射去执行该方法对象, 注意这里获取的是桥接方法, 为什么要使用桥接方法呢? 不懂的同学可以看这篇播客: Java中什么是bridge method(桥接方法);
2. 在invoke()方法中有一个getBean()的方法, 这个是因为我们在执行Method时需要传递一个该方法所属类的实例对象; Spring在解析Controller类时会实例化一个对象, 这里的getBean获取的就是这个对象; 在SpringMVC初始化时, 会获取该实例对象, 然后遍历该实例的所有方法, 并将该方法和该Controller对象封装到HandlerMethod实例中, 然后注册到mappingLookup这个容器中; 这些在解析三这篇博客中有详细说明;
3. getBridgedMethod().invoke(getBean(), args)实际上执行的是我们编写的处理器方法
至此, 通过适配器RequestMappingHandlerAdapter执行处理器的解析已完成;
相关文章:
SpringMVC源码解析一(在Spring源码项目中搭建SpringMVC源码模块)
SpringMVC源码解析三(处理映射器HandlerMapping的解析)
SpringMVC源码解析四(处理适配器HandlerAdapter的解析)
SpringMVC源码解析五(HandlerMethod执行过程解析)