关于我们“顺利逃脱/通关”的真实原因?

来源:2-13 【源码品读】深入了解FeignContract协议解析过程

Mr_Raymond

2020-08-13 21:10:34


1.关于Feign的processAnnotationOnClass的疑问

    在视频中11:30左右时,老师说我们为什么顺利通关? 因为咱们没有用RequestMapping,咱用的是GetMappings。

    疑问点在于,这里GetMapping是在接口方法中的注解,和这里的接口类级注解不是一回事,没有用RequestMapping是因为接口类没有使用RequestMapping,如果在接口类使用RequestMapping,需要拼接接口类的URL和方法的URL,到最终的URL里面,这是这里检查类级注解的原因。

2.关于Feign的processAnnotationOnMethod的疑问

在视频12:10左右时,老师说因为我们的方法没有RequestMapping注解,所以我们也顺利逃脱了。

这里我就产生了疑问?如果老师说的是对的, 那么方法设置了RequestMapping注解,直接就return了。就无法注册到Metadata里面,这个请求调用应该会404或者其他的异常。

带着这个疑问,我测试了一下,发现方法上使用@RequestMapping注解没有任何问题,然后调试跟踪了这里面涉及到的两个校验:

if (!RequestMapping.class.isInstance(methodAnnotation) && !methodAnnotation

    .annotationType().isAnnotationPresent(RequestMapping.class)) {

    return;

}

这里是我调试后的理解:

RequestMapping.class.isInstance(methodAnnotation)  

    这里检查方法的注解是否是@RequestMapping的实例

    -> 当方法直接使用RequestMapping注解的时候,这里会返回True

methodAnnotation.annotationType().isAnnotationPresent(RequestMapping.class)

    这里检查方法的注解是否是@RequestMapping的子类

-> 当方法使用@GetMapping、@PostMapping等等@RequetsMapping的子类注解时,这里会返回True

所以,当且仅当这两个条件都不满足时,才会直接return不作处理,这样的方法Feign就不做代理了。


请老师指正。

写回答

1回答

姚半仙

2020-08-13

第一个地方传入的是class,没错那是验的class上面的注解,看走眼了以为传入的是method对象

第二个地方,两个判断条件中,第二个条件前面有个取反符号,因此用postmapping相当于true取反,还是false,用了requestmapping会return true

0
hr_Raymond
h 这两个判断条件都是取反符号的,使用RequestMapping 也是不会return的 只有两个条件都不满足: 既没有使用RequesMapping注解,也没有使用GetMapping等子类注解的方法,才会直接被return 测试的结果也验证了使用@RequestMapping注解的方法,和使用@GetMapping注解的方法,流程上是一致的
h020-08-14
共1条回复

Java架构师-技术专家

千万级电商项目从0到100全过程,覆盖Java程序员不同成长阶段的核心问题与解决方案

2672 学习 · 5839 问题

查看课程