// 自定义分发注解
@Target({ElementType.TYPE, ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface RequestRouter {
String[] value() default "";
}
package com.kingfish.springjdbcdemo.config;
import lombok.SneakyThrows;
import org.springframework.stereotype.Component;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.mvc.condition.PatternsRequestCondition;
import org.springframework.web.servlet.mvc.method.RequestMappingInfo;
import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;
import javax.servlet.http.HttpServletRequest;
import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Arrays;
import java.util.Set;
import java.util.stream.Collectors;
/**
* @Author : kingfish
* @Email : kingfishx@163.com
* @Data : 2021/4/21 16:47
* @Desc : 路由 HandlerMapping 的实现
*/
@Component("handlerMapping")
public class RouterRequestMappingHandlerMapping extends RequestMappingHandlerMapping {
// 在将 方法封装成 HandlerMethod 时会调用此方法
@SneakyThrows
@Override
protected RequestMappingInfo getMappingForMethod(Method method, Class> handlerType) {
// 获取 RequestRouter 注解
RequestRouter requestRouter = method.getAnnotation(RequestRouter.class);
if (requestRouter == null) {
requestRouter = handlerType.getAnnotation(RequestRouter.class);
if (requestRouter == null) {
for (Class> handlerTypeInterface : handlerType.getInterfaces()) {
if ((requestRouter = handlerTypeInterface.getAnnotation(RequestRouter.class)) != null) {
break;
}
}
}
}
// 调用父类,生成 RequestMappingInfo
RequestMappingInfo mappingForMethod = super.getMappingForMethod(method, handlerType);
if (requestRouter != null) {
// 如果 requestRouter 不为空,则进行路径处理
String[] requestRouterValue = requestRouter.value();
PatternsRequestCondition condition = mappingForMethod.getPatternsCondition();
// 获取当前方法匹配的路径,外汇跟单gendan5.com随即进行添加处理。
Set
Set
// 拼接 请求路径。这里可以自定义处理策略
.flatMap(pattern -> Arrays.stream(requestRouterValue).map(val -> "/" + val + pattern))
.collect(Collectors.toSet());
// 将拼接后的路径添加到 RequestMappingInfo 中
patterns.addAll(routerPatterns);
}
return mappingForMethod;
}
}
@Configuration
public class SpringConfig {
@Bean
public DispatcherServlet dispatcherServlet(){
DispatcherServlet dispatcherServlet = new DispatcherServlet();
// 禁止加载所有的 handlerMapper ,而只加载 beanName 为 handlerMapper 的 bean
dispatcherServlet.setDetectAllHandlerMappings(false);
return dispatcherServlet;
}
}