源码分析之spring中的Handler,HandlerMapping,HandlerAdapter

72 阅读2分钟

什么是Handler

能够处理请求的方法或类

四种Handler

  1. 标有@RequestMapping注解的方法
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public Object hello(){
        return "success";
    }
}
  1. 实现了Controller的类
@Component("/helloHandler")
public class HelloHandler implements Controller {
    @Override
    public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
        System.out.println("Controller handleRequest...");
        return null;
    }
}
  1. 实现了HttpRequestHandler接口的类
@Component("/helloHttpRequestHandler")
public class HelloHttpRequestHandler implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloHttpRequestHandler");
    }
}
  1. HandlerFunction的对象
@Configuration
public class HandlerConfig {
    @Bean
    public  RouterFunction<ServerResponse> routerFunction(){
        RouterFunction<ServerResponse> route = route()
                .GET("/app/person", accept(APPLICATION_JSON), request->ServerResponse.ok().body("get hello router function"))
                .POST("/app/person", request->ServerResponse.ok().body("post hello router function"))
                .build();
        return route;
    }
}
Builder GET(String pattern, RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction);
@FunctionalInterface
public interface HandlerFunction<T extends ServerResponse> {

	T handle(ServerRequest request) throws Exception;

}

HandlerMapping

public interface HandlerMapping {
    // ...
    @Nullable
	HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}

三种HandlerMapping

在DispatcherServlet.properties中定义

org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
	org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping,\
	org.springframework.web.servlet.function.support.RouterFunctionMapping

其中BeanNameUrlHandlerMapping内部存有实现了Controller的类和实现了HttpRequestHandler接口的类的映射规则,RequestMappingHandlerMapping内存存储了标有@RequestMapping注解的方法相关的映射,RouterFunctionMapping内部存储了HandlerFunction相关的映射规则

HandlerAdapter

public interface HandlerAdapter {

	// 支不支持传入的handler
	boolean supports(Object handler);

	// 处理传入的handler
	@Nullable
	ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception;

	
	long getLastModified(HttpServletRequest request, Object handler);

}

四种HandlerAdapter

  1. RequestMappingHandlerAdapter 对应@RequestMapping的方法

    public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
    		implements BeanFactoryAware, InitializingBean {
        
    }
    
    public abstract class AbstractHandlerMethodAdapter extends WebContentGenerator implements HandlerAdapter, Ordered {
        // ...
        @Override
    	public final boolean supports(Object handler) {
            // HandlerMethod 对@RequestMapping标注的方法的封装
    		return (handler instanceof HandlerMethod && supportsInternal((HandlerMethod) handler));
    	}
        // ...
    }
    
  2. SimpleControllerHandlerAdapter 对应实现了Controller的类

    public class SimpleControllerHandlerAdapter implements HandlerAdapter {
    
    	@Override
    	public boolean supports(Object handler) {
    		return (handler instanceof Controller);
    	}
    
    	@Override
    	@Nullable
    	public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
    			throws Exception {
    
    		return ((Controller) handler).handleRequest(request, response);
    	}
    
    	// ... 
    }
    
  3. HttpRequestHandlerAdapter 对应实现了HttpRequestHandler接口的类

    public class HttpRequestHandlerAdapter implements HandlerAdapter {
    
    	@Override
    	public boolean supports(Object handler) {
    		return (handler instanceof HttpRequestHandler);
    	}
    
    	@Override
    	@Nullable
    	public ModelAndView handle(HttpServletRequest request, HttpServletResponse response, Object handler)
    			throws Exception {
    
    		((HttpRequestHandler) handler).handleRequest(request, response);
    		return null;
    	}
    
    	@Override
    	public long getLastModified(HttpServletRequest request, Object handler) {
    		if (handler instanceof LastModified) {
    			return ((LastModified) handler).getLastModified(request);
    		}
    		return -1L;
    	}
    
    }
    
  4. HandlerFunctionAdapter 对应HandlerFunction的对象

    public class HandlerFunctionAdapter implements HandlerAdapter, Ordered {
    
    	//...
        
    	@Override
    	public boolean supports(Object handler) {
            // HandlerFunction对象
    		return handler instanceof HandlerFunction;
    	}
    
    	@Nullable
    	@Override
    	public ModelAndView handle(HttpServletRequest servletRequest,
    			HttpServletResponse servletResponse,
    			Object handler) throws Exception {
    
    
    		HandlerFunction<?> handlerFunction = (HandlerFunction<?>) handler;
    
    		ServerRequest serverRequest = getServerRequest(servletRequest);
    		ServerResponse serverResponse = handlerFunction.handle(serverRequest);
    
    		return serverResponse.writeTo(servletRequest, servletResponse,
    				new ServerRequestContext(serverRequest));
    	}
    
    	// ...
    }