1. 概述
在开发 REST API 时,我们经常需要获取应用中所有暴露的接口信息。例如,将这些接口信息存入数据库用于权限控制或文档生成。本文将介绍几种在 Spring Boot 应用中获取所有 REST 接口的方式。
2. 获取接口的几种方式
在 Spring Boot 中,我们通过 @RequestMapping
注解来暴露 REST 接口。要获取这些接口信息,主要有以下三种方式:
- ✅ 事件监听器(Event Listener)
- ✅ Spring Boot Actuator
- ✅ SpringDoc(OpenAPI)
接下来我们逐个来看。
3. 使用事件监听器方式
在 Spring 中,所有被 @RestController
和 @RequestMapping
注解标记的类都会注册为 Spring Bean。我们可以在应用上下文初始化完成后,通过监听事件来获取这些接口信息。
3.1. 实现 ApplicationListener 接口
实现 ApplicationListener<ContextRefreshedEvent>
接口,并重写 onApplicationEvent
方法:
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext
.getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping
.getHandlerMethods();
map.forEach((key, value) -> LOGGER.info("{} {}", key, value));
}
这里使用了 ContextRefreshedEvent
事件,它在 Spring 上下文初始化或刷新时触发。我们从中获取 RequestMappingHandlerMapping
Bean,然后拿到所有接口映射。
3.2. 使用 @EventListener 注解
更简洁的方式是直接在方法上使用 @EventListener
注解监听 ContextRefreshedEvent
:
@EventListener
public void handleContextRefresh(ContextRefreshedEvent event) {
ApplicationContext applicationContext = event.getApplicationContext();
RequestMappingHandlerMapping requestMappingHandlerMapping = applicationContext
.getBean("requestMappingHandlerMapping", RequestMappingHandlerMapping.class);
Map<RequestMappingInfo, HandlerMethod> map = requestMappingHandlerMapping
.getHandlerMethods();
map.forEach((key, value) -> LOGGER.info("{} {}", key, value));
}
两种方式本质一样,推荐使用注解方式,更简洁直观。
4. 使用 Spring Boot Actuator 方式
Actuator 是 Spring Boot 提供的监控和管理功能模块,也可以用来获取接口信息。
4.1. 添加依赖
首先在 pom.xml
中添加 Actuator 依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
4.2. 配置暴露接口
默认只暴露 /health
和 /info
,我们需要在 application.properties
中配置暴露 /mappings
接口:
management.endpoints.web.exposure.include=mappings
或者直接暴露所有接口(生产环境慎用):
management.endpoints.web.exposure.include=*
配置完成后,访问以下地址即可获取所有接口信息:
http://localhost:8080/actuator/mappings
⚠️ 注意:这种方式更适合用于监控和调试,不适合直接用于业务逻辑中。
5. 使用 SpringDoc(OpenAPI)
如果你项目中使用了 SpringDoc 来生成 API 文档,那么也可以通过它来获取接口信息。
5.1. 添加依赖
在 pom.xml
中添加:
<dependency>
<groupId>org.springdoc</groupId>
<artifactId>springdoc-openapi-ui</artifactId>
<version>1.7.0</version>
</dependency>
5.2. 配置 OpenAPI Bean
创建配置类,定义 OpenAPI
Bean:
@Bean
public OpenAPI openAPI() {
return new OpenAPI().info(new Info().title("SpringDoc example")
.description("SpringDoc application")
.version("v0.0.1"));
}
然后访问以下地址即可查看所有接口文档:
http://localhost:8080/swagger-ui/index.html
✅ 这种方式适合用于文档展示和前端对接,同时也能间接获取接口信息。
6. 总结
本文介绍了三种在 Spring Boot 中获取 REST 接口的方法:
方式 | 适用场景 | 说明 |
---|---|---|
事件监听器 | 应用启动时自动获取接口信息 | 灵活、可控 |
Actuator | 监控、调试 | 适合运维 |
SpringDoc/OpenAPI | 文档展示、接口管理 | 适合前端对接 |
📌 建议:如果只是用于内部记录或初始化数据,推荐使用事件监听器;如果是用于监控或调试,使用 Actuator;如果是用于对外文档展示,使用 SpringDoc。
所有示例代码均可在 GitHub 获取:GitHub 示例代码