面试题答案
一键面试Spring处理网络请求底层流程
- 请求进入DispatcherServlet
- 当一个网络请求到达Spring应用,首先会进入DispatcherServlet。DispatcherServlet是Spring Web MVC的核心,它就像一个中央控制器,负责协调和管理整个请求处理流程。它继承自HttpServlet,在Web容器(如Tomcat)中,它接收来自容器的HTTP请求。
- HandlerMapping工作原理
- DispatcherServlet接收到请求后,会将请求交给HandlerMapping组件。HandlerMapping的作用是根据请求的URL等信息查找对应的Handler(通常是Controller方法)。
- 常见的HandlerMapping实现类有
RequestMappingHandlerMapping
,它在应用启动时会扫描所有带有@RequestMapping
注解的Controller及其方法,并将URL与Handler的映射关系注册到一个映射表中。当接收到请求时,它会根据请求的URL在这个映射表中查找匹配的Handler。
- HandlerAdapter工作原理
- 找到Handler后,DispatcherServlet会通过HandlerAdapter来调用Handler。HandlerAdapter的主要职责是适配不同类型的Handler,因为Spring支持多种类型的Handler(如基于注解的Controller、实现特定接口的Controller等)。
- 例如,
RequestMappingHandlerAdapter
用于处理基于@RequestMapping
注解的Controller方法。它会解析请求参数,将其绑定到Controller方法的形参上,然后调用Controller方法,并处理方法的返回值。
- 后续流程
- Handler方法执行完成后,会返回一个
ModelAndView
对象(或其他类型,具体取决于HandlerAdapter的处理)。DispatcherServlet会将这个ModelAndView
交给ViewResolver来解析为实际的View。 - ViewResolver根据
ModelAndView
中的视图名称查找对应的View实现(如JSP、Thymeleaf等视图技术对应的View),并将模型数据填充到View中,最终将渲染后的结果返回给客户端。
- Handler方法执行完成后,会返回一个
自定义扩展Spring请求处理机制以支持特定协议请求处理的设计思路和实现步骤
- 设计思路
- 协议解析层:创建一个新的组件用于解析特定协议的请求数据,将其转换为Spring能够理解的通用格式(如类似HTTP请求的参数、头信息等形式)。
- HandlerMapping扩展:扩展现有的HandlerMapping或创建新的HandlerMapping,使其能够识别基于特定协议请求的URL模式,并映射到对应的Handler。
- HandlerAdapter扩展:创建新的HandlerAdapter,用于处理特定协议请求转换后的通用数据,调用相应的Handler,并处理返回结果,将其转换为特定协议所需的响应格式。
- 实现步骤
- 协议解析组件:
- 创建一个类,例如
CustomProtocolRequestParser
,实现对特定协议请求数据的解析。它可能需要读取网络流,按照特定协议的格式解析出请求参数、请求头等信息,并封装成自定义的请求对象,如CustomProtocolRequest
。
- 创建一个类,例如
- HandlerMapping扩展:
- 继承
AbstractHandlerMapping
或其他合适的HandlerMapping类,创建CustomProtocolHandlerMapping
。 - 在
CustomProtocolHandlerMapping
的getHandlerInternal
方法中,根据CustomProtocolRequest
中的URL信息查找对应的Handler。可以维护一个自定义的URL - Handler映射表,在应用启动时注册特定协议的URL与Handler的映射关系。
- 继承
- HandlerAdapter扩展:
- 实现
HandlerAdapter
接口,创建CustomProtocolHandlerAdapter
。 - 在
supports
方法中判断当前Handler是否是该Adapter支持的类型。 - 在
handle
方法中,从CustomProtocolRequest
中提取参数并绑定到Handler方法的形参上,调用Handler方法,然后将Handler的返回值转换为特定协议的响应格式,如构建CustomProtocolResponse
对象并返回。
- 实现
- 注册组件:
- 在Spring配置文件(或通过Java配置类)中注册
CustomProtocolRequestParser
、CustomProtocolHandlerMapping
和CustomProtocolHandlerAdapter
,确保它们在Spring容器中被正确管理,从而使Spring能够使用这些自定义组件来处理特定协议的请求。
- 在Spring配置文件(或通过Java配置类)中注册
- 协议解析组件: