工具类 :@RequestMapping 路由注解

// 自定义分发注解

@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 patterns = condition.getPatterns();

             Set routerPatterns = patterns.stream()

               // 拼接 请求路径。这里可以自定义处理策略

                     .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;

     }

}


请使用浏览器的分享功能分享到微信等