关于我们“顺利逃脱/通关”的真实原因?
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积分~
来为老师/同学的回答评分吧
0 星