当前位置: 首页 > 科技观察

Springboot如何动态注册处理请求接口?这个知识点你值得了解

时间:2023-03-13 05:31:06 科技观察

环境:springboot2.2.10.RELEASE写一个方法,准备用来发起请求@ServicepublicclassUserHandler{@ResponseBodypublicObjectgetUsers(@PathVariable("id")Stringid,HttpServletRequestrequest){System.out.println(请求);return"querytheuserIDis:"+id;}}您的处理程序可能不是容器管理的bean。这里也应用了一些SpringMVC相关的注解,这些注解可以像在Controller中一样使用。注册接口处理器@ConfigurationpublicclassMappingConfig{@AutowiredpublicvoidsetHandlerMapping(RequestMappingHandlerMappingmapping,UserHandlerhandler)throwsNoSuchMethodException{RequestMappingInfoinfo=RequestMappingInfo.paths("/users/{id}").methods(RequestMethodHandler.GET).classMethod=buildmethodler()("getUsers",String.class,HttpServletRequest.class);mapping.registerMapping(info,handler,method);}}创建一个RequestMappingInfo对象,它是一些请求的基本元信息。获取处理程序的方法对象。通过RequestMappingHandlerMapping注册请求映射对象。在启动过程中,Spring容器会将所有的Controller处理接口方法包装到RequestMappingInfo对象中,加入到一个RequestMappingHandlerMapping对象的集合中。注意:容器默认有很多HandlerMapping对象。如何处理和初始化这些类接口由AbstractHandlerMethodMapping#isHandler决定。该方法是一个抽象方法,由子类实现。publicabstractclassAbstractHandlerMethodMappingextendsAbstractHandlerMappingimplementsInitializingBean{protectedabstractbooleanisHandler(ClassbeanType);}RequestMappingHandlerMapping是AbstractHandlerMethodMapping的子类看看它的实现:publicclassRequestMappingHandlerMapping{@OverrideprotectedbooleanisHandler(ClassbeanType){return(AnnotatedElementUtils.hasAnnotation(beanType,Controller.class)||AnnotatedElementUtils.hasAnnotation(beanType,RequestMapping.class));}}这里判断当前Bean对象上是否有@Controller注解或@RequestMapping对象;即容器启动后,Controller中的所有接口方法都会保证注册为一个RequstMappingInfo对象。在SpringMVC处理一个请求的过程中,有一个过程去获取对应的HandlerMapping对象。处理方法参数处理程序可以接收哪些参数?JDK8的java.util.Optional支持作为方法参数与具有必需属性(例如@RequestParam、@RequestHeader等)的注释结合使用,等同于required=false。处理方法返回值