邮轮哪个网站是可以做特价胃肠的,个人养老保险缴费档次,网站建立的,亿玛酷网站建设简介 在springmvc的处理流程中#xff0c;第一步就是查询请求对应的映射器#xff0c;然后组装成处理器链处理请求#xff0c;本文意在梳理该过程
重要实现 HandlerMapping是一个接口#xff0c;该接口用于通过HttpServletRequest寻找对应的处理器#xff0c;接口介绍如下…简介 在springmvc的处理流程中第一步就是查询请求对应的映射器然后组装成处理器链处理请求本文意在梳理该过程
重要实现 HandlerMapping是一个接口该接口用于通过HttpServletRequest寻找对应的处理器接口介绍如下 该接口只有一个抽象方法 该接口的几个重要子类和关系图如下 在HandlerMapping的直接子类AbstractHandlerMapping中有定义核心方法 后续的各种HandlerMapping均是扩展该接口实现自身逻辑以下以最常用的关于注解RestControllerControllerRequestMapping使用的处理器映射关系为例做源码分析 RequestMappingHandlerMapping
类的UML图如下 由类的UML图可知RequestMappingHandlerMapping集成了AbstractHandlerMethodMapping
而AbstractHandlerMethodMapping类定义如下 所以RequestMappingHandlerMapping类也实现了InitializingBean在类的初始化创建完成之后会做相应的初始化操作具体的代码如下 方法initHandlerMethods()即是初始化handler方法调用processCandidateBean完成ioc的bean对象处理 其中IsHandler方法用于检测该bean对象是否符合条件实现交RequestMappingHandlerMapping实现 判断标准就是该类是否有标注Controller(RestController注解有标注Controller)注解或者RequestMapping注解
符合条件的类继续往下对方法做探测 对该类的每个方法均做检测看看是否符合条件,而符合条件的方法检测标准即是是否有标注RequestMapping注解(GetMapping等注解均被RequestMapping注解标注)这里具体的实现逻辑在org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping#getMappingForMethod 当所有符合条件的方法检测完成之后需要对对应的方法和组装的RequestMappingInfo(可以是其他对象)完成注册操作 MappingRegistry 该类是AbstractHandlerMethodMapping的内部类该类中定义多个缓存对象用于存放各种映射关系如下图所示 其中有两个重要的缓存对象
mappingLookup用于存放RequestMappingInfo(可以是其他对象)和HandlerMethod的映射关系
urlLookup:用于存放请求路径和RequestMappInfo(可以是其他对象)的映射关系
至此RequestMappingHandlerMapping的启动流程分析完毕总结如下
RequestMappingHandlerMapping在初始化完成之后调用父类AbstractHandlerMethodMapping的initHandlerMethods方法该方法会检测ioc中所有符合条件的(ControllerRequestMapping的类)然后依次检测该类中标注了RequestMapping的方法然后组装成RequestMappingInfo对象将方法和RequestMappingInfo的映射关系注册到MappingRegistry的两个缓存对象
mappingLookup、urlLookup中完成注册操作而在实际请求中则是以上过程的逆过程相关源码感兴趣的同学可以自行调试分析 自定义端点源码分析
在springboot actuator中有很多的监控信息可以通过暴露端点的方法让外部获取应用的信息而端点的暴露即和以上过程大体相当
在图3所示的springboot actuator的自定义端点是通过WebMvcEndpointHandlerMapping暴露的
从图3的类继承图可知WebMvcEndpointHandlerMapping继承子AbstractHandlerMethodMapping
在类初始化完成之后一样会调用afterPropertiesSetAbstractWebMvcEndpointHandlerMapping重写了initHandlerMethods方法具体的逻辑如下 在这里是通过构建WebOperation暴露端点同样的将相关信息(RequestMappingInfo)和HandlerMethod的映射关系注册到AbstractHanderMethodMapping的内部类MappingRegistry中完成初始化过程
以下简单的梳理一下Actuator暴露端点的过程
1 spring-boot-starter-actuator依赖引入了依赖spring-boot-actuator-autoconfigure通过springboot的自动装配原理会读取spring.factories的类 2 WebMvcEndpointManagementContextConfiguration配置类中通过条件配置引入了WebMvcEndpointHandlerMapping对象 3 WebMvcEndpointHandlerMapping执行初始化流程完成RequestMappingInfo和HandlerMethod的映射注册 以下是引入springboot-actuator的能暴露的Endpoint类实现 具体的信息获取逻辑感兴趣的可以自行调试