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

开发 前端
Spring Boot 是由 Pivotal 团队提供的全新框架,其设计目的是用来简化新 Spring 应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。

[[416750]]

环境:springboot2.2.10.RELEASE

编写一个准备用来出来请求的方法

  1. @Service 
  2. public class UserHandler { 
  3.  
  4.   @ResponseBody 
  5.   public Object getUsers(@PathVariable("id") String id, HttpServletRequest request) { 
  6.     System.out.println(request) ; 
  7.     return "查询用户ID为: " + id ; 
  8.   } 
  9.      

你的处理程序可以不是受容器管理的Bean。这里还应用了SpringMVC相关的一些注解,这些注解都可以像Controller中使用一样。

注册接口处理程序

  1. @Configuration 
  2. public class MappingConfig { 
  3.      
  4.   @Autowired 
  5.   public void setHandlerMapping(RequestMappingHandlerMapping mapping, UserHandler handler) throws NoSuchMethodException { 
  6.     RequestMappingInfo info = RequestMappingInfo.paths("/users/{id}").methods(RequestMethod.GET).build(); 
  7.     Method method = UserHandler.class.getMethod("getUsers", String.class, HttpServletRequest.class); 
  8.     mapping.registerMapping(info, handler, method); 
  9.   } 
  1. 创建RequestMappingInfo对象,就是一些请求的基本元信息。
  2. 获取处理程序的方法对象。
  3. 通过RequestMappingHandlerMapping注册请求映射对象。

Spring容器在启动过程中会将所有的Controller处理接口方法都包装成RequestMappingInfo对象然后添加到

RequestMappingHandlerMapping对象的一个集合中。

注:容器默认有很多个HandlerMapping对象,具体该如何处理初始化那些类接口是通过

AbstractHandlerMethodMapping#isHandler决定,该方法是个抽象方法具体是由子类来实现的。

  1. public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping implements InitializingBean { 
  2.   protected abstract boolean isHandler(Class<?> beanType); 

RequestMappingHandlerMapping是AbstractHandlerMethodMapping的子类看看它的实现:

  1. public class RequestMappingHandlerMapping { 
  2.   @Override 
  3.   protected boolean isHandler(Class<?> beanType) { 
  4.     return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||  
  5.             AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class)); 
  6.   } 

这里判断了当前Bean对象上是否有@Controller注解或者@RequestMapping对象;也就是在容器启动后会将所有的Controller中的接口方法保证注册为RequstMappingInfo对象。

在SpringMVC处理一个请求的过程中,有一个流程是取得相应的HandlerMapping对象。

处理方法参数

处理程序能够接收那些参数?

JDK 8的java.util.Optional作为方法参数与注释相结合受到支持具有必需属性(例如@RequestParam、@RequestHeader和其他属性)且等效于required=false。

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

处理方法返回值

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

 

责任编辑:姜华 来源: 今日头条
相关推荐

2019-07-17 13:31:34

VLAN集中管理协议VCMP

2023-03-02 11:52:00

自定义自动配置

2019-11-25 21:46:12

数据湖云计算数据仓库

2024-02-26 08:19:00

WebSpring容器

2021-11-29 08:26:17

Android.OS线程

2020-03-27 08:43:20

Vueprops开发

2023-12-15 08:07:37

响应式布局官网

2019-02-20 14:16:43

2022-01-12 14:24:37

接口Callable程序

2020-08-24 15:25:27

Python 开发运维

2020-08-24 13:15:59

Python代码描述符

2018-08-08 09:30:29

服务器知识Linux系统

2021-07-06 14:56:20

深度学习编程人工智能

2023-05-09 08:25:26

Gaussdb数据库开源数据库

2014-08-19 14:12:47

Windows

2021-04-27 22:27:19

手机安卓苹果

2017-01-16 15:12:36

Linuxwatch命令命令

2020-12-24 10:20:43

文档工具语言

2019-12-09 16:18:08

程序员数据库技术

2020-10-20 14:12:54

B站开源弹幕
点赞
收藏

51CTO技术栈公众号