您现在的位置是:首页 > Javascript
当前栏目
Springboot如何动态注册处理请求接口?这个知识点你值得了解一下
2023-03-07 09:48:24 时间
环境:springboot2.2.10.RELEASE
编写一个准备用来出来请求的方法
- @Service
- public class UserHandler {
- @ResponseBody
- public Object getUsers(@PathVariable("id") String id, HttpServletRequest request) {
- System.out.println(request) ;
- return "查询用户ID为: " + id ;
- }
- }
你的处理程序可以不是受容器管理的Bean。这里还应用了SpringMVC相关的一些注解,这些注解都可以像Controller中使用一样。
注册接口处理程序
- @Configuration
- public class MappingConfig {
- @Autowired
- public void setHandlerMapping(RequestMappingHandlerMapping mapping, UserHandler handler) throws NoSuchMethodException {
- RequestMappingInfo info = RequestMappingInfo.paths("/users/{id}").methods(RequestMethod.GET).build();
- Method method = UserHandler.class.getMethod("getUsers", String.class, HttpServletRequest.class);
- mapping.registerMapping(info, handler, method);
- }
- }
- 创建RequestMappingInfo对象,就是一些请求的基本元信息。
- 获取处理程序的方法对象。
- 通过RequestMappingHandlerMapping注册请求映射对象。
Spring容器在启动过程中会将所有的Controller处理接口方法都包装成RequestMappingInfo对象然后添加到
RequestMappingHandlerMapping对象的一个集合中。
注:容器默认有很多个HandlerMapping对象,具体该如何处理初始化那些类接口是通过
AbstractHandlerMethodMapping#isHandler决定,该方法是个抽象方法具体是由子类来实现的。
- public abstract class AbstractHandlerMethodMapping<T> extends AbstractHandlerMapping implements InitializingBean {
- protected abstract boolean isHandler(Class<?> beanType);
- }
RequestMappingHandlerMapping是AbstractHandlerMethodMapping的子类看看它的实现:
- public class RequestMappingHandlerMapping {
- @Override
- protected boolean isHandler(Class<?> beanType) {
- return (AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) ||
- AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class));
- }
- }
这里判断了当前Bean对象上是否有@Controller注解或者@RequestMapping对象;也就是在容器启动后会将所有的Controller中的接口方法保证注册为RequstMappingInfo对象。
在SpringMVC处理一个请求的过程中,有一个流程是取得相应的HandlerMapping对象。
处理方法参数
处理程序能够接收那些参数?
JDK 8的java.util.Optional作为方法参数与注释相结合受到支持具有必需属性(例如@RequestParam、@RequestHeader和其他属性)且等效于required=false。
![Springboot如何动态注册处理请求接口?这个知识点你值得了解一下](https://s3.51cto.com/oss/202108/11/555291dd61d768515dee40f125c303ad.jpg)
处理方法返回值
![Springboot如何动态注册处理请求接口?这个知识点你值得了解一下](https://s6.51cto.com/oss/202108/11/3905ae7113f21a5dec9930980582b8be.jpg)
相关文章
- 精读《磁贴布局 - 功能分析》
- 精读《磁贴布局 - 功能实现》
- 精读《磁贴布局 - 性能优化》
- 精读《如何抽象可视化搭建》
- 组件注册与画布渲染
- 画布与组件元信息数据流
- 小游戏与H5游戏的前世今生
- Flutter 组件集录 | 3.7 新增 - ContextMenu 菜单
- Flutter 组件集录 | 师于源码 - 与 TapRegion 的相遇
- IntelliJ IDEA 2022.3 发布,全新 UI 太震撼了!
- Javascript的private属性
- Flutter的入门
- 对于移动端跨平台(双端)开发的一些构思
- 理解javascript异步编程中promise可以很简单
- 微信小程序推出的小程序游戏,是如何做到的❓
- 9个提升办公效率的免费网站!
- 【前端23校招面经】瓜子二手车一面
- 【Rust日报】2023-01-07 shura-一个安全的2D 游戏引擎,易于创建易于管理的游戏
- 【Rust日报】2023-01-13 Chromium 正式开始支持 Rust
- 真正“搞”懂HTTP协议14之HTTP3