背景
需求是这样的:对网关层指定接口(url)的调用情况做日志记录,日志需要根据 controller 层方法的入参和返回值动态生成。
如果只是记录 url 的调用情况可以直接使用 HandlerInterceptor
实现,但需求中需要能够访问入参和返回值,虽然通过拦截器提供的接口也可以解析到请求参数以及返回值,但都需要对这些参数进行一定的处理,因此直接在 Controller 层方法上处理是最直接的。
思路是找到 Spring MVC 中对 Controller 层方法最终调用的 API,然后看看能否接管调用过程,添加自己的业务逻辑。
从 DispatcherServlet#doDispatch
开始寻找扩展点
Spring MVC 的入口 servlet 是 DispatcherServlet,调用链是 doService -> doDispatch,servlet 和 controller 关联到一起的是 HandlerAdapter
接口,通过 DispatcherServlet#getHandlerAdater
方法遍历配置的 HandlerAdapter
集合,挨个检查其 HandlerAdapter#supports
方法,找到支持的 HandlerAdapter
,然后调用其 HandlerAdapter#handle
方法。