我正在构建一个具有多个 Maven 工件的应用程序。由于设计限制,其中一个工件本质上是后端,无法访问请求(因此不允许使用@RequestMapping)。但现实情况是,有些请求需要直接连接到其中一些类方法。
我在 Spring 进行了一些深入研究,发现了让它发挥作用所需的一半内容。最简单的部分是自己编写一个 HandlerMapping 并正确配置它。该映射器将了解后端实体以手动映射必要的 URL。
我找不到的部分是 Spring 中的何处(什么)管理调用?例如,当您有:
@Component
@RequestMapping("/mypath")
public class MyStuff
{
@RequestMapping(value = "/dothis", method = RequestMethod.GET)
public ResponseEntity<String> doThis(HttpServletRequest request)
{
}
}
当向/mypath/dothis 发出请求时,哪个对象拦截该请求并调用正确 bean 中的正确方法?据我所知,映射器仅返回映射到特定 bean 的所有 url 的字符串数组。
最佳答案
从高层次来看,这是流程 - Spring 的 DispatcherServlet 首先处理请求 - 这是 web.xml 文件中具有条目的请求。
DispatcherServlet
维护一个 HandlerAdapters 和 HandlerMappings 的列表,对于请求,它向每个 handlerMapping 询问一个处理程序
在 Spring 3.1 中,主要的 handlerMapping 实现之一是 RequestMappingHandlerMapping
它维护请求 uri 到处理程序的映射(这是一个 HandlerMethod
最终指向 @RequestMapping 映射方法)。
从 HandlerMapping 获取处理程序后,DispatcherServlet 会询问每个 handlerAdapter 是否可以处理该请求(HandlerAdapter.supports api),如果可以,则将请求分派(dispatch)到适当的 HandlerAdapter,最终调用 handlerMethod。在 Spring 3.1 中,主 HandlerAdapter 注册为 <mvc:annotation-driven/>
是 RequestMappingHandlerAdapter
我认为这应该足以开始更深入的调查。跟踪流程的一个好方法是在 DispatcherServlet 中放置一个断点并通过堆栈跟踪流程。
关于java - Spring 的 @RequestMapping 内部结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11977750/