工具類 :@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<String> patterns = condition.getPatterns();
Set<String> 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;
}
}
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69946337/viewspace-2773909/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 【SpringMVC】@RequestMapping註解SpringMVCAPP
- 2. RequestMapping註解APP
- gin 註解路由,自動引數繫結工具路由
- SpringMVC中@RequestMapping註解中的return “redirect:/“;跟return““的用法。SpringMVCAPP
- 胖哥學SpringMVC:RequestMapping註解之對映路徑 上卷SpringMVCAPP
- HTTP方法之@RequestMapping與Spring組合註解比較 - RahulHTTPAPPSpring
- 註解類
- Flutter 法法路由註解Flutter路由
- Flutter 法法註解路由 2.0Flutter路由
- Java註解-後設資料、註解分類、內建註解和自定義註解Java
- beego註解路由中各個引數解釋Go路由
- 註解與抽取基類
- Day69.註解&列舉類的複習 -Java註解&列舉類Java
- spring@RequestMappingSpringAPP
- Flutter利用註解生成可自定義的路由Flutter路由
- Spring Boot配置類的註解Spring Boot
- Java列舉類與註解詳解——一篇文章讀懂列舉類與註解詳Java
- Java列舉類、註解和反射Java反射
- Deno從零到架構級系列(二)——註解路由架構路由
- hyperf 路由註解 方法小駝峰 url 蛇形實現路由
- Eureka的InstanceInfoReplicator類(服務註冊輔助工具)
- Android 註解系列之APT工具(三)AndroidAPT
- @RequestMapping的三大特性APP
- 工具類-字串工具類字串
- 詳解成熟的資料標註工具—智慧標註平臺
- Springboot專案中 如何獲取@Configuration註解標註的配置類Spring Boot
- 基於註解的 PHP 列舉類實現PHP
- Java如何快速獲取類附帶的註解Java
- 最近編寫了一個給 gin 框架實現註解路由的工具,個人覺得挺有實際意義框架路由
- 併發工具類:Semaphore原始碼解讀原始碼
- 03-Java核心類庫_列舉、註解與反射Java反射
- Spring 系列(三):你真的懂@RequestMapping嗎?SpringAPP
- Spring Boot中用@RequestMapping 提供 Zip 檔案Spring BootAPP
- 註解專題(一)Java元註解,內建註解Java
- JAVA-註解(2)-自定義註解及反射註解Java反射
- 工具類
- iris 路由註冊和上下文context路由Context
- @angular/router 原始碼分析之註冊路由Angular原始碼路由