SpringBoot——启动服务时获取所有controller层的接口url列表
需求
在服务启动时,获取服务的所有controller层接口url列表,通过CommandLineRunner
实现服务启动时的操作。
CommandLineRunner
在SpringApplication.run
运行完成之后后才会运行自己创建的实现类。- 加入
@Component
注解后,就可以将对象交给spring
管理。 - 加入
@Order()
注解控制顺序,数字越小越靠前。
技术应用
- CommandLineRunner
- WebApplicationContext
- RequestMappingHandlerMapping
CommandLineRunner源码
package org.springframework.boot;
@FunctionalInterface
public interface CommandLineRunner {
void run(String... args) throws Exception;
}
CommandLineRunner
是一个接口,我们可以自定义实现该接口,并具体实现run方法。- 如果在上下文中,若有多个实现该接口的类,就需要通过
@Order
注解进行加载顺序的指定。
代码模板
@Slf4j
@Component
@Order(1)
@RequiredArgsConstructor
public class CommandLineInitResource implements CommandLineRunner {
/**
* 上下文
*/
@Autowired
WebApplicationContext applicationContext;
@Value("${route.prefix}")
private String routePrefix;
@Override
public void run(String... args) throws Exception {
//获取controller相关bean
RequestMappingHandlerMapping mapping = applicationContext.getBean(RequestMappingHandlerMapping.class);
//获取method
Map<RequestMappingInfo, HandlerMethod> methodMap = mapping.getHandlerMethods();
//构造url list
List<String> urlList = new ArrayList<>();
//获取methodMap的key集合
for (RequestMappingInfo info : methodMap.keySet()) {
//controller url集合
Set<String> urlSet = info.getPatternsCondition().getPatterns();
//controller url拼接路由前缀
urlList.addAll(urlSet.stream().map(url ->
//校验前缀
routePrefix.startsWith("/") ? (routePrefix + url) : ("/" + routePrefix + url)
).collect(Collectors.toList()));
//获取所有方法类型
//Set<RequestMethod> methodSet = info.getMethodsCondition().getMethods();
}
log.info("web controller urlList: {}", urlList);
}
}
烧不死的鸟就是凤凰
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET10 - 预览版1新功能体验(一)
2021-03-07 Linux—目录文件属性和权限管理详解
2021-03-07 JAVA—HTTP客户端警告:Going to buffer response body of large or unknown size.
2020-03-07 JVM—内存分配与回收策略
2020-03-07 JVM—垃圾回收GC算法
2020-03-07 JVM—引用计数和可达性分析算法(存活性判断)
2020-03-07 Kubernetes-命名空间token
2020-03-07 Kubernetes-命名空间ns