在Spring mvc中,一个url路径和一个函数配对,你访问这个url,就会直接调用这个函数
对于java的面向对象来说,就要分两步走。
第一步首先要找到是哪个对象,即handler;
第二步要找到访问的函数,
而对于Spring mvc的两个组件HandlerMapping和HandlerAdapter来说:
HandlerMapping是负责找到控制器的对象(也就是handler),
而HandlerAdapter则是负责找到要访问的函数的;
不知这样的理解对不对
在处理器映射器上跟你理解的大体差不多,稍微有点出入;
spingmvc 执行流程中请求访问时处理器映射器会返回具体的执行链(就是一条符合映射规则的所有拦截器和映射器的列表,你的请求的处理流程就是围绕着这条执行链走的,列表的最后一个元素就是你的处理器对象,执行顺序:先正向---后反向---再反向,详细的你可以查一下springmvc的拦截器执行流程),所以说我个人认为适配器认为是设计模式上的一种规范,可以简单理解为是用来调用目标方法的。
handlerMapping有很多种:AbstractDetectingUrlHandlerMapping, AbstractHandlerMapping, AbstractHandlerMethodMapping, AbstractUrlHandlerMapping, BeanNameUrlHandlerMapping, RequestMappingHandlerMapping, RequestMappingInfoHandlerMapping, SimpleUrlHandlerMapping, WebSocketHandlerMapping
常用的几个: BeanNameUrlHandlerMapping, RequestMappingHandlerMapping, SimpleUrlHandlerMapping,当然你不注册,框架也会有默认加载映射器,具体配置在自带的某个配置文件里,可以找到的
处理器映射器作用:先说个场景,当你在写一个处理器的时候,框架提供给你了很多种方式(1.可以通过RequestMappingHandlerMapping使扫描指定目录,使用注解的的方式创建处理器,@Contraller 标记一个处理器,@requestMapping关联url与具体的调用方法。2.你也可以通SimpleUrlHandlerMapping在xml中配置的的方式注册一个处理器,里面写上url与具体的处理器的具体映射关系。3,你还可以通过BeanNameUrlHandlerMapping,将请求的url与BeanNameUrlHandlerMapping的节点的name值加上处理器的name值比对的方式找到具体的某个处理器,。。。。。。),所以面对这些情况,你具体用的哪一种方式核心控制器是不知道的,即使知道它也是处理不了的(因为它没有处理这些情况的代码功能)这时就需要你告诉他了,假如当你在springmvc.xml中注册了一个映射器,例如注解的映射器,当框架加载xml生成子容器的时候,发现这个映射器的时候框架就会明白原来你在项目中用了注解,它就会调用扫描器去扫描你告诉它的目录地址,将注解解析成对象放到容器中,同时保存url与具体的方法的映射关系。假如你注册的是BeanNameUrlHandlerMapping它就知道该去配置文件中去解析你的处理器,并使用拼接的方式保存与url进行匹对的规则。。。。。。。。
至于适配器本质上其实就是一接口,主要作用就是提供框架调用你的具体的处理器和传递数据用的,跟设计模式里的适配器的作用是一个道理(但又不完全相同,因为只要你能自定义方法名,就说明不是简单的通过接口方法直接调用目标类方法的,应该是反射方式实现的)。因为在框架中是不可能写死的,简单的认为通过接口调用你的实现类中的方法(注解除外,注解大概应该是通过方法对象的反射实现的);