Spring MVC的完全可配置的映射

正如我写了几个星期早些时候 ,我试图实现在非引导的Spring MVC应用系统的Spring引导驱动器的功能。 自行开发端点非常简单。 然而,更具挑战性的是能够在属性文件中(例如在执行器中)配置映射。 这使我可以更仔细地检查当前代码中的处理方式。 这篇文章总结了我围绕该主题进行的“逆向工程”尝试。

标准MVC

用法

在Spring MVC中,在带有@Controller注释的类中,方法可以依次由@RequestMapping注释。 该批注接受一个value属性(或一个path )来定义可以从哪个路径调用它。

该路径可以是固定的, 例如 /user但也可以接受在运行时填充的变量, 例如 /user/{id} 。 在这种情况下,应该可以通过@PathVariable将参数映射到方法参数:

@RequestMapping(path="/user/{id}",method=arrayOf(RequestMethod.GET))
fungetUser(@PathVariable("id")id:String)=repository.findUserById(id)

在适应REST API的同时,在配置方面存在一些重要限制:

  • 模式是在开发期间设置的,此后不会更改
  • 参数的填充在运行时发生

实作

有了上述内容, @Controller注释类中的映射将在上下文启动期间通过DefaultAnnotationHandlerMapping类进行注册。 注意,在上下文中注册了这种类型的默认bean。 下图总结了这一点:

默认注释处理程序映射

本质上,魔术只适用于@Controller注释的类。 或者,更严格地说,引用`DefaultAnnotationHandlerMapping的Javadoc:

带注释的控制器通常在类型级别用Controller构造型标记。 当在类型级别应用RequestMapping时,这并不是绝对必要的(因为这样的处理程序通常实现org.springframework.web.servlet.mvc.Controller接口)。 但是,如果在类型级别不存在RequestMapping,则需要Controller在方法级别检测RequestMapping注释。

执行器

用法

Spring Boot执行器允许在application.properties文件中配置与每个端点关联的路径(或使用其他方法进行Boot配置)。

例如,默认情况下可通过metrics路径使用度量端点。 但是可以配置一个完全不同的路径:

endpoints.metrics.id=mymetrics

另外,默认情况下,执行器端点可以直接在根目录下访问,但是可以在专用子上下文中对它们进行分组:

management.context-path=/manage

通过以上配置,指标端点现在在/manage/mymetrics下可用。

实作

其他执行器端点应实现MvcEndpoint接口。 用@RequestMapping注释的方法将与上述标准控制器完全相同 。 这是通过Spring上下文中的专用处理程序映射EndpointHandlerMapping实现的。

HandlerMapping通过Endpoint.getId()将端点映射到URL。 @RequestMapping的语义应与普通的@Controller相同,但不应将端点注释为@Controller (否则,它们将通过普通的MVC机制进行映射)。

类层次结构如下:

端点

该图显示了Spring Boot的组成部分,而没有。

结论

执行器端点重用了现有Spring MVC代码中的某些内容来处理@RequestMapping 。 它是在专用映射类中完成的,以便将标准MVC控制器和Spring Boot的执行器端点类层次结构分开。 为了在Spring MVC中实现完全可配置的映射,这是代码研究的一部分,旨在复制和适应需要完全可配置的映射的情况。

翻译自: https://blog.frankel.ch/fully-configurable-mappings-spring-mvc/

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值