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

简介: 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 接口,下次见。

相关文章
|
存储 安全 编译器
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(下)
|
6月前
|
程序员 Python
类的设计奥秘:从代码到架构的科普全解
类的设计奥秘:从代码到架构的科普全解
93 2
2020考研公共课_基础精讲课_管理类联考综合能力 联考逻辑(读书笔记)
2020考研公共课_基础精讲课_管理类联考综合能力 联考逻辑(读书笔记)
|
安全 Java C++
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计(上)
[笔记]读书笔记 C++设计新思维《一》基于策略的类设计
|
编解码 iOS开发
一节微课诞生的全过程(无保留分享,望收藏)
本来是想以直播的方式把制作这节微课的过程分享出来,但考虑到大家的时间不统一,制作过程太长,这节微课录音之后制作动画就足足用了两天
195 0
|
架构师
《架构师修炼之道》第八章--建立模型,化繁为简
项目进入了开发阶段,我们发现团队成员描述同一架构元素时使用的词汇各不相同。我们的设计决策表面上取得了一致意见,但大家实际各有各的理解。
349 0
《架构师修炼之道》第八章--建立模型,化繁为简
|
架构师 算法 搜索推荐
直击架构本质:优秀架构师必须掌握的几种架构思维
直击架构本质:优秀架构师必须掌握的几种架构思维
258 0
直击架构本质:优秀架构师必须掌握的几种架构思维
|
安全 云栖大会
「技术人生」第6篇:技术同学应该如何理解业务?
本文以大量理论论述解析业务,并提供多种基于不同场景的实操方法,帮助技术同学以科学、合理的方式开展日常工作、指导团队开展业务建设,保障顶层设计的落地执行。
1110 3
「技术人生」第6篇:技术同学应该如何理解业务?
|
Java API Spring
写了一套优雅接口之后,领导让我给大家讲讲这背后的技术原理(上)
Hello,各位小伙伴们,宣布一个好消息: 咱们的公号终于有留言功能了!!! 以后小伙们就可以在留言区留言跟阿粉一起交流咯~
写了一套优雅接口之后,领导让我给大家讲讲这背后的技术原理(上)
|
边缘计算 安全 CDN
开发手机直播源码难点多,从技术层面入手是关键
开发手机直播源码难点多,从技术层面入手解决是关键
开发手机直播源码难点多,从技术层面入手是关键