正如我写了几个星期早些时候 ,我试图实现在非引导的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/