ServletInvocableHandlerMethod类简介说明
下文讲述ServletInvocableHandlerMethod类的简介说明,如下所示:
ServletInvocableHandlerMethod类简介
HandlerAdapter在内部对于每个请求 都会实例化一个ServletInvocableHandlerMethod进行处理 ServletInvocableHandlerMethod在进行处理的时候 会分两部分别对请求跟响应进行处理
ServletInvocableHandlerMethod类继承关系
Object HandlerMethod InvocableHandlerMethod ServletInvocableHandlerMethod ConcurrentResultHandlerMethod
ServletInvocableHandlerMethod类构造函数
public ServletInvocableHandlerMethod(HandlerMethod handlerMethod) { //调用父类的构造函数 super(handlerMethod); //获取@ResponseStatus的注解赋值给成员变量 initResponseStatus(); }
invokeAndHandle() 调用HandlerMethod中控制器的指定方法
public void invokeAndHandle(ServletWebRequest webRequest,ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception { // 关键 -> 1.执行控制器指定方法 Object returnValue = invokeForRequest(webRequest, mavContainer, providedArgs); // 2.设置响应状态 setResponseStatus(webRequest); // 3.判断请求是否处理完毕,根据返回值来判断。 if (returnValue == null) { if (isRequestNotModified(webRequest) || hasResponseStatus() || mavContainer.isRequestHandled()) { // 为 true ,表示方法调用完毕 mavContainer.setRequestHandled(true); return; } }else if (StringUtils.hasText(this.responseReason)) { mavContainer.setRequestHandled(true); return; } // 存在返回值时,可能还需进行视图解析 mavContainer.setRequestHandled(false); try { // 处理返回值,在 MavContainer 中设置 ViewName // 并判断其是不是【重定向请求】 this.returnValueHandlers.handleReturnValue( returnValue, getReturnValueType(returnValue), mavContainer, webRequest); }catch (Exception ex) { // 抛出异常... } } //执行控制器指定方法 public Object invokeForRequest(NativeWebRequest request, ModelAndViewContainer mavContainer, Object... providedArgs) throws Exception { // 取得方法入参值 Object[] args = getMethodArgumentValues(request, mavContainer, providedArgs); // 利用反射执行该方法,并取得返回值 Object returnValue = doInvoke(args); return returnValue; } protected Object doInvoke(Object... args) throws Exception { // 设置方法的访问权限,BridgedMethod 表示控制器类的指定方法 ReflectionUtils.makeAccessible(getBridgedMethod()); try { // 关键 -> 利用反射执行该方法,Bean 表示控制器类名称 return getBridgedMethod().invoke(getBean(), args); }catch (IllegalArgumentException ex) { // 抛出异常... }catch (InvocationTargetException ex) { // 抛出异常... } }
ServletInvocableHandlerMethod对请求以及响应的处理 1. 处理请求的时候,会根据ServletInvocableHandlerMethod的属性argumentResolvers(这个属性是它的父类InvocableHandlerMethod中定义的)进行处理,其中argumentResolvers属性是一个HandlerMethodArgumentResolverComposite类 (这里使用了组合模式的一种变形) ,这个类是实现了HandlerMethodArgumentResolver接口的类,里面有各种实现了HandlerMethodArgumentResolver的list集合。 2. 处理响应的时候,会根据ServletInvocableHandlerMethod的属性returnValueHandlers(自身属性)进行处理,returnValueHandlers属性是一个HandlerMethodReturnValueHandlerComposite类 (这里使用了组合模式的一种变形),这个类是实现了HandlerMethodReturnValueHandler接口的类,里面有各种实现了HandlerMethodReturnValueHandler的List集合。 ServletInvocableHandlerMethod的returnValueHandlers和argumentResolvers这两个属性都是在ServletInvocableHandlerMethod进行实例化的时候被赋值的(使用RequestMappingHandlerAdapter的属性进行赋值);RequestMappingHandlerAdapter的argumentResolvers和returnValueHandlers这两个属性是在RequestMappingHandlerAdapter进行实例化的时候被Spring容器注入的
版权声明
本文仅代表作者观点,不代表本站立场。
本文系作者授权发表,未经许可,不得转载。