参考
https://my.oschina.net/u/3101282/blog/3022154
在RequestMappingHandlerMapping类中存在判断加载的类是否为转发控制
protected boolean isHandler(Class<?> beanType) {
return AnnotatedElementUtils.hasAnnotation(beanType, Controller.class) || AnnotatedElementUtils.hasAnnotation(beanType, RequestMapping.class);
}
在抽象类AbstractHandlerMethodMapping在processCandidateBean存在调用isHandler
通过detectHandlerMethods获取被注解的类的方法,并注册请求url与方法的映射
尝试自定义过程增加RequestMapping的请求映射
注意点
1,限制映射的方法范围,
a,只有public的方法才加入,其他作用域不加入,控制范围
b,针对重载的方法的同名,不允许出现,如重复启动直接异常结束
在后续继续参考
https://blog.csdn.net/philip502/article/details/98502246
真正实现相同requestMap下根据请求url中version参数控制交易版本
该注解适合运用在方法上
继续研究关于类controller的注解
在AbstractHandlerMethodMapping子类初始化后
会通过processCandidateBean方法调用
isHandler判断后,执行detectHandlerMethods
核心逻辑在于
methods.forEach((method, mapping) -> {
Method invocableMethod = AopUtils.selectInvocableMethod(method, userType);
this.registerHandlerMethod(handler, invocableMethod, mapping);
});
但同时需要实现子类RequestMappingHandlerMapping
中getMappingForMethod的类似逻辑,自定义请求过滤的控制交易分发逻辑
结果是可以的,
关键逻辑
private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
RequestMapping requestMapping = (RequestMapping) AnnotatedElementUtils.findMergedAnnotation(element, RequestMapping.class);
if (requestMapping != null) {
RequestCondition<?> condition = element instanceof Class ? this.getCustomTypeCondition((Class) element) : this.getCustomMethodCondition((Method) element);
return this.createRequestMappingInfo(requestMapping, condition);
}
if (element instanceof Method) {
Method cm = (Method) element;
if (Modifier.isPublic(cm.getModifiers())) {
return RequestMappingInfo.paths("/" + cm.getName()).build();
}
}
return null;
}
具体请参见
vic99/RestControllerWithRequestMapping – Gitee.com
后续参考补充,按照lombok的编译时优化,针对指定方法自动加RequestMaping