千家信息网

SpringBoot如何根据目录结构自动配置Url前缀

发表于:2025-11-09 作者:千家信息网编辑
千家信息网最后更新 2025年11月09日,这篇文章主要为大家展示了"SpringBoot如何根据目录结构自动配置Url前缀",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"SpringBoot如何根据
千家信息网最后更新 2025年11月09日SpringBoot如何根据目录结构自动配置Url前缀

这篇文章主要为大家展示了"SpringBoot如何根据目录结构自动配置Url前缀",内容简而易懂,条理清晰,希望能够帮助大家解决疑惑,下面让小编带领大家一起研究并学习一下"SpringBoot如何根据目录结构自动配置Url前缀"这篇文章吧。

在很多其他框架中,比如Python的Flask、node.js的KOA,Controller要想能够响应前端的请求都需要我们主动去注册到应用程序上。而Spring不需要我们自己去注册,由Spring通过扫描注解的方式去主动发现

自定义RequestMappingInfo

Spring中的RequestMappingHandlerMapping专门来负责处理标注了@RequestMapping的控制器。创建一个类继承并覆盖其中的方法,从而实现对默认机制的修改。

覆盖其中的getMappingForMethod方法,这个方法的返回值RequestMappingInfo就包含了请求的Url,修改RequestMappingInfo中的Url从而修改路由中的Url。

package com.lin.missyou.hack;import org.springframework.beans.factory.annotation.Value;import org.springframework.web.servlet.mvc.method.RequestMappingInfo;import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;import java.lang.reflect.Method;public class AutoPrefixUrlMapping extends RequestMappingHandlerMapping {    @Value("${missyou.api-package}")    private String apiPackagePath ;          //从配置文件中获取根包的路径    @Override    protected RequestMappingInfo getMappingForMethod(Method method, Class handlerType) {        RequestMappingInfo requestMappingInfo = super.getMappingForMethod(method, handlerType);        if(null != requestMappingInfo){                //获取url前缀            String prefix = getPrefix(handlerType);                      //根据url前缀生成RequestMappingInfo并与原有的RequestMappingInfo合并            RequestMappingInfo mappingInfo = RequestMappingInfo.paths(prefix).build().combine(requestMappingInfo);                       return mappingInfo;        }        return requestMappingInfo;    }    private String getPrefix(Class handlerType){        String packageName = handlerType.getPackage().getName(); //获取控制器所在包路径        String dotPath = packageName.replaceAll(this.apiPackagePath,"");       //将包路径中多于的部分截取掉        return dotPath.replace(".","/");               //将包路径中的.替换成/    }}

通过接口的形式发现类

创建一个配置类AutoPrefixConfiguration将AutoPrefixUrlMapping加入到容器。配置类AutoPrefixConfiguration实现接口WebMvcRegistrations并覆盖其中的getRequestMappingHandlerMapping方法

package com.lin.missyou.core.config;import com.lin.missyou.hack.AutoPrefixUrlMapping;import org.springframework.boot.autoconfigure.web.servlet.WebMvcRegistrations;import org.springframework.stereotype.Component;import org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping;@Componentpublic class AutoPrefixConfiguration implements WebMvcRegistrations {    @Override    public RequestMappingHandlerMapping getRequestMappingHandlerMapping() {        return new AutoPrefixUrlMapping();    }}

在配置文件中指定根包

missyou.api-package = com.lin.missyou.api

SprinBoot的 发现机制 有两种。一种是在控制器上标注特定注解,例如上一篇博文 SpringBoot全局异常处理中在GlobalExceptionAdvice 上标注@ControllerAdvice。另外一种是实现特定接口并覆盖其中的特定方法,例如上面的AutoPrefixConfiguration。

测试一下

访问结果,访问路径/v1/banner/test可以访问到该控制器

将访问路径改为/banner/test就访问不到了

将BannerController移动到sample文件夹下访问路径/v1/sample/banner/test可以访问到该控制器

这个方法存在一些争议。一方面认为根据目录结构自动生成url虽然比较简单,少写了一些代码,但是无法通过控制器上标注的@RequestMapping中的参数直接看出url,代码的可读性不是太好。

另一方面认为,这个方法大大的简化了我们代码的编写,同时更加易于维护,控制器随意调整所在目录都不需要去修改代码。

以上是"SpringBoot如何根据目录结构自动配置Url前缀"这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注行业资讯频道!

0