写了一套优雅接口之后,领导让我给大家讲讲这背后的技术原理(下)

简介: Hello,各位小伙伴们,宣布一个好消息: 咱们的公号终于有留言功能了!!! 以后小伙们就可以在留言区留言跟阿粉一起交流咯~

这就解释了为什么实现 ResponseBodyAdvice接口的子类一定要与@ControllerAdvice一起使用的原因了。

接下来我们来看下 ResponseBodyAdvice 的执行流程。

这里教给大家一个代码调试的小技巧,当我们不知道一个类在源码中如何被调用的时候,我们可以使用 IDEA 代码调试功能,然后查看代码调用栈。

25.jpg如上面的所示,我们可以很清楚观察 ResponseBodyAdvice 调用关系。这里的类调用关系相对还是比较复杂,下面给大家简化一下。

26.jpg


前面的逻辑就不说了,就是 Spring MVC 通用流程。重点逻辑位于 RequestResponseBodyAdviceChain,我们具体看下源码:

27.jpg

嗯呐嗯呐,请忽略上图的 ③

其实逻辑非常简单,遍历所有的 ResponseBodyAdvice 的子类,首先调用其 supports判断是否支持,如果支持的调用的 beforeBodyWrite修改返回信息。

FilterInterceptorResponseBodyAdvice 区别

Filter属于 Servlet 组件,所有请求将会先进入 Filter ,判断通过之后才会在进入到真正的具体的请求中。

28.jpg

上图代表是用 Spring MVC 的一个 Web 项目,所有请求将会先进入到 Filter,通过之后才会进入到 SpringMVC 中最重要的组件 DispatchServlet

Interceptor 是 SpringMVC 的组件,它的作用实际上与 Filter类似, 只不过的它的作用是位于自定义的 Controller 前后。

29.jpg

不管是 Filter 还是 Interceptor,它们的作用方法域内只能拿到 ServletResponse 的参数,这个时候返回值已经被写入 ServletResponse,我们很难再去修改。

ResponseBodyAdvice作用时机位于写入之前,所以这个时候可以很容易拿到原值进行修改。30.jpg

总结

SpringMVC 初始化的过程中,将会扫描所有带有 @ControllerAdvice注解的类,将其生成为 ControllerAdviceBean。如果这类刚好为 ResponseBodyAdvice接口的子类,Spring 将会为其单独保存起来,后续将会封装到的 RequestResponseBodyAdviceChain,使用责任链的模式对请求、响应进行处理。

最后我们解释了一下 FilterInterceptorResponseBodyAdvice区别,从作用范围上来讲:

Filter>Interceptor>ResponseBodyAdvice

但是前两者没办法修改返回值(时机太晚),只有后者才可以真正在返回值返回之前做到修改。

好了,今天文章就到这里了,下次我们分享一下如何写出优雅的 Dubbo 接口,下次见。

相关文章
|
7月前
|
存储 缓存 NoSQL
作者推荐 | 企业级缓存技术解析,你必须知道的“9“大技术问题与常见误区
本文将深入剖析导致上述问题的九大根源,并提供相应的解决方案。请注意,本文以Java为例进行代码演示,但同样适用于其他技术平台的朋友。只需根据相应技术平台替换相关代码即可!
514 0
作者推荐 | 企业级缓存技术解析,你必须知道的“9“大技术问题与常见误区
|
6月前
|
人工智能 供应链 安全
万字讲透:军工企业数字化转型转什么,如何做?
随着国防现代化目标的提出,军工行业景气度加速上升,企业纷纷扩产以满足新型装备加速列装的需求。航天科工集团的航天云网和中国电科的“数字电科”等项目展示了数字化转型的成效,如缩短研发周期、提高生产效率和降低成本。数字化转型对军工企业至关重要,能提升生产关系、增强竞争力,并实现生产制造和供应链的智能化。然而,转型面临挑战,包括传统认知边界、商业模式创新、技术合作共享、人才短缺和观念体制障碍。企业需制定数字化战略规划,重构组织与流程,加强网络安全,并确保人才和技术保障。案例显示,低代码平台如织信Informat可助力企业实现国产化、灵活的战略部署和数字化转型。
|
前端开发 JavaScript 小程序
新来个技术总监,给公司项目引入了全新的业务架构,堪称最佳实践!
新来个技术总监,给公司项目引入了全新的业务架构,堪称最佳实践!
|
敏捷开发 架构师 项目管理
架构师才能看懂的大型网站架构面临的挑战:业务架构的基本思路
业务架构的基本思路 大型网站系统有很多功能,一次性明确所有的功能需求并设计出一个庞大的业务架构是一件费力不讨好的事情。因为在项目前期,难免会忽视一些琐碎功能,而随着开发的进行,也会有很多新的想法产生,基本上不会存在完全按照最初的业务架构设计完成的软件产品。因此,业务架构不仅要做到“规整功能模块,厘清产品业务逻辑”,更重要的是如何做到“有规划性地应对项目过程中的需求变更”。
|
监控 前端开发 JavaScript
重学前端 1 # 前端发展史以及学习痛点
重学前端 1 # 前端发展史以及学习痛点
170 0
|
安全 云栖大会
「技术人生」第6篇:技术同学应该如何理解业务?
本文以大量理论论述解析业务,并提供多种基于不同场景的实操方法,帮助技术同学以科学、合理的方式开展日常工作、指导团队开展业务建设,保障顶层设计的落地执行。
1118 2
「技术人生」第6篇:技术同学应该如何理解业务?
|
Java API Spring
写了一套优雅接口之后,领导让我给大家讲讲这背后的技术原理(上)
Hello,各位小伙伴们,宣布一个好消息: 咱们的公号终于有留言功能了!!! 以后小伙们就可以在留言区留言跟阿粉一起交流咯~
写了一套优雅接口之后,领导让我给大家讲讲这背后的技术原理(上)
|
边缘计算 安全 CDN
开发手机直播源码难点多,从技术层面入手是关键
开发手机直播源码难点多,从技术层面入手解决是关键
开发手机直播源码难点多,从技术层面入手是关键
|
机器人 5G 芯片
带你读《果壳中的5G:新网络时代的技术内涵与商业思维》第一章从 0 到 5 的演化与逻辑1.6
带你读《果壳中的5G:新网络时代的技术内涵与商业思维》第一章从 0 到 5 的演化与逻辑1.6
带你读《果壳中的5G:新网络时代的技术内涵与商业思维》第一章从 0 到 5 的演化与逻辑1.6
|
运维 5G 网络架构
带你读《果壳中的5G:新网络时代的技术内涵与商业思维》第一章从 0 到 5 的演化与逻辑1.5(二)
《果壳中的5G:新网络时代的技术内涵与商业思维》第一章从 0 到 5 的演化与逻辑1.5(二)
带你读《果壳中的5G:新网络时代的技术内涵与商业思维》第一章从 0 到 5 的演化与逻辑1.5(二)
下一篇
DataWorks