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

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

上周文章年轻人不讲武德,竟然重构出这么优雅后台 API 接口我们使用  @ControllerAdviceResponseBodyAdvice 重构后端的 API 接口,降低了复杂度,减少了重复代码,后续接口开发非常简洁优雅。

知其然而知其所以然,今天这篇文章来聊聊这个注解背后的原理,让我们彻底掌握这个注解,避免后续踩坑。

另外,有个小伙伴看完上篇文章,觉得这个注解的跟 Spring Interceptor 功能很类似,再加上之前还学习了 Servlet 体系 Filter 功能,不知道这几个有什么区别,感觉很混乱。

所以今天这篇文章下面两个部分出发,详细解释一下。

  1. @ControllerAdviceResponseBodyAdvice  注解原理
  2. FilterInterceptorResponseBodyAdvice 区别

从源码解析背后的原理

上篇文章中我们看到 ResponseBodyAdvice的子类使用  @ControllerAdvice注解,大家有没有好奇,如果我将@ControllerAdvice换成 @Controller 注解,还能达到上篇文章的效果吗?

感兴趣的小伙伴可以自己尝试下,这里阿粉自己告诉大家结果了,实际测试结果是不行的。

那为什么一定要与@ControllerAdvice 搭配才会生效?

首先我们先查看一下 @ControllerAdvice 的源码:

20.jpg

image-20201128152447563

可以看到这个注解上还存在一个我们非常熟悉的 @Component 注解。这里我们可以将 @ControllerAdvice  理解成@Component 子类,所以其修饰的类也会成为 Spring 中 Bean

ps:大家可以看下 @Controller/@Service/@Repository,其实也是这个原理。

Spring 容器初始化过程,如果扫描到 @ControllerAdvice 注解,将会将其生成一个 ControllerAdviceBean Bean。

这个过程代码主要位于 RequestMappingHandlerAdapter#initControllerAdviceCache:

21.jpg

这段代码主要分为两步:

第一步使用 ControllerAdviceBean#findAnnotatedBeans获取所有被 @ControllerAdvice修饰的类。

22.jpg

第二步将所有实现了ResponseBodyAdvice 接口的 Bean 放入到 requestResponseBodyAdviceBeans 集合中,后续将会使用该集合。

24.jpg


相关文章
|
8月前
|
人工智能 架构师 API
架构师之路:接口幂等性设计的艺术
架构师之路:接口幂等性设计的艺术
103 0
|
2月前
|
存储 设计模式 监控
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(二)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
28 0
|
2月前
|
存储 算法 Java
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)(一)
【底层服务/编程功底系列】「手把手教学系列」带你打造一个属于自己的规则引擎服务,打破任何业务难题(逻辑模型和API设计)
30 1
|
6月前
|
SQL 安全 Java
硬核,腾讯内部整理的面向开发人员代码安全指南,适合所有程序员
硬核,腾讯内部整理的面向开发人员代码安全指南,适合所有程序员
47 0
|
10月前
|
存储 机器学习/深度学习 人工智能
从云存储的角度浅显的聊一聊 AIGC
现在,你要是还没听过“通义千问”、“通义听悟”,出门都不好意思和别人打招呼。那么,以其为代表的 AIGC(AI Generated Content)又是如何凭实力屡屡破圈,其发展更是经历了怎样的烈火烹油、鲜花着锦呢?
4538 2
|
前端开发 Dubbo Java
写了一套优雅接口之后,领导让我给大家讲讲这背后的技术原理(下)
Hello,各位小伙伴们,宣布一个好消息: 咱们的公号终于有留言功能了!!! 以后小伙们就可以在留言区留言跟阿粉一起交流咯~
写了一套优雅接口之后,领导让我给大家讲讲这背后的技术原理(下)
|
边缘计算 安全 CDN
开发手机直播源码难点多,从技术层面入手是关键
开发手机直播源码难点多,从技术层面入手解决是关键
开发手机直播源码难点多,从技术层面入手是关键
|
安全 云栖大会
「技术人生」第6篇:技术同学应该如何理解业务?
本文以大量理论论述解析业务,并提供多种基于不同场景的实操方法,帮助技术同学以科学、合理的方式开展日常工作、指导团队开展业务建设,保障顶层设计的落地执行。
1019 0
「技术人生」第6篇:技术同学应该如何理解业务?
|
设计模式 分布式计算 算法
阿里面试官亲述:如何利用设计模式改善业务代码
在业务部门的开发中,大多数的我们在完成的业务的各种需求和提供解决方案,很多场景下的我们通过 CRUD 就能解决问题,但是这样的工作对技术人的提升并不多,如何让自己从业务中解脱出来找到写代码的乐趣呢,我做过一些尝试,使用设计模式改善自己的业务代码就是其中的一种。让代码变得更加简洁和提升健壮性,从代码中寻找一些欢乐。
阿里面试官亲述:如何利用设计模式改善业务代码
|
运维 前端开发 Cloud Native
想成为全栈工程师,要做到哪几点?
如何成为一名全栈工程师?需要具备哪些技术积累?成为全栈工程师有哪些好处?希望本文能为期望成为全栈工程师的同学提供一点帮助,和同学们一起分享交流。
想成为全栈工程师,要做到哪几点?