能够处理请求的方法或类
@RestController
public class HelloController {
@RequestMapping("/hello")
public Object hello(){
return "success";
}
}
@Component("/helloHandler")
public class HelloHandler implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception {
System.out.println("Controller handleRequest...");
return null;
}
}
@Component("/helloHttpRequestHandler")
public class HelloHttpRequestHandler implements HttpRequestHandler {
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("HelloHttpRequestHandler");
}
}
@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;
}
public interface HandlerMapping {
// ...
@Nullable
HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}
在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相关的映射规则
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);
}
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));
}
// ...
}
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);
}
// ...
}
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;
}
}
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));
}
// ...
}