1, 首先我们都清楚一个接口的调用,
也就是说真正的匹配的还是handlerMapping, 这里我们主要看handlermapping 的抽象类,并且实现它的方法。 就能做自定义的handlerMapping。
2, 我们看一下源码,当存在Controller注解或者requestmapping 注解的时候,然后在根据方法和处理器类型来找到RequestMappingInfo

我们点击进去看一下controller 和requestmapping的注解源码

这里我们发现 @Controller 和@Component 是别名,他俩是是一样的。
@RequestMapping 的注解 value 和path 是一样的。

这里@Controller 上面是加入bean 容器里面。
这里我们仿写一下。
@Component
@Retention(RetentionPolicy.RUNTIME) // 运行的时候生效。
@Target(ElementType.TYPE) // 声明标注再类上面。
public @interface CustomController {
}@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface CustomMapping {
// 请求URL
@AliasFor("path")
String[] value() default {};
@AliasFor("value")
String[] path() default {};
// 请求的方法
RequestMethod[] method() default {};
}
public class CustomRequestHandlerMapping extends RequestMappingHandlerMapping {
@Override
protected boolean isHandler(Class<?> beanType) {
// 类上面有自定义的注解,才执行下面的。
return AnnotatedElementUtils.hasAnnotation(beanType, CustomController.class);
}
@Override
public void afterPropertiesSet() {
// 第一优先级
super.setOrder(0);
super.afterPropertiesSet();
}
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class<?> handlerType) {
RequestMappingInfo requestMappingInfo = createRequestMappingInfo(method) ;
return requestMappingInfo ;
}
private RequestMappingInfo createRequestMappingInfo(AnnotatedElement element) {
// 构造requestMappingInfo
CustomMapping customMapping = AnnotatedElementUtils.findMergedAnnotation(element, CustomMapping.class);
return (customMapping != null ? builderMapping(customMapping) : null);
}
private RequestMappingInfo builderMapping(CustomMapping customMapping) {
RequestMappingInfo.Builder builder = RequestMappingInfo
.paths(customMapping.value())
.methods(customMapping.method())
.params(new String[] {})
.headers(new String[] {})
.consumes(new String[] {})
.produces(new String[] {})
.mappingName("") ;
return builder.build() ;
}
}在把其加入spring容器了
@Configuration
public class CustomConfig {
@Bean
public CustomRequestHandlerMapping getRequestHandlerMapping(){
return new CustomRequestHandlerMapping();
}
}测试

