前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >源码分析之spring中的Handler,HandlerMapping,HandlerAdapter

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

作者头像
九转成圣
发布2024-04-10 16:30:23
770
发布2024-04-10 16:30:23
举报
文章被收录于专栏:csdncsdn

什么是Handler

能够处理请求的方法或类

四种Handler

  1. 标有@RequestMapping注解的方法
代码语言:javascript
复制
@RestController
public class HelloController {
    @RequestMapping("/hello")
    public Object hello(){
        return "success";
    }
}
  1. 实现了Controller的类
代码语言:javascript
复制
@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接口的类
代码语言:javascript
复制
@Component("/helloHttpRequestHandler")
public class HelloHttpRequestHandler implements HttpRequestHandler {
    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        System.out.println("HelloHttpRequestHandler");
    }
}
  1. HandlerFunction的对象
代码语言:javascript
复制
@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;
    }
}
代码语言:javascript
复制
Builder GET(String pattern, RequestPredicate predicate, HandlerFunction<ServerResponse> handlerFunction);
代码语言:javascript
复制
@FunctionalInterface
public interface HandlerFunction<T extends ServerResponse> {

	T handle(ServerRequest request) throws Exception;

}

HandlerMapping

代码语言:javascript
复制
public interface HandlerMapping {
    // ...
    @Nullable
	HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception;
}

三种HandlerMapping

在DispatcherServlet.properties中定义

代码语言:javascript
复制
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

代码语言:javascript
复制
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

RequestMappingHandlerAdapter 对应@RequestMapping的方法

代码语言:javascript
复制
public class RequestMappingHandlerAdapter extends AbstractHandlerMethodAdapter
		implements BeanFactoryAware, InitializingBean {
    
}
代码语言:javascript
复制
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的类

代码语言:javascript
复制
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接口的类

代码语言:javascript
复制
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的对象

代码语言:javascript
复制
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));
	}

	// ...
}
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2024-03-06,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是Handler
  • 四种Handler
  • HandlerMapping
    • 三种HandlerMapping
    • HandlerAdapter
      • 四种HandlerAdapter
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档