如何在SpringBoot中获取所有@RestController注解类的列表?
获取SpringBoot中所有@RestController类的解决方案
方法一:通过ApplicationContext获取已实例化的@RestController Bean
Spring容器的ApplicationContext提供了getBeansWithAnnotation方法,可以直接检索所有被容器管理、带有指定注解的Bean实例,无论这些Bean来自自定义代码还是第三方库。
import org.springframework.context.ApplicationContext; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RestController; import javax.annotation.PostConstruct; import java.util.List; import java.util.Map; import java.util.stream.Collectors; @Component public class RestControllerCollector { private final ApplicationContext applicationContext; private List<Object> allRestControllers; public RestControllerCollector(ApplicationContext applicationContext) { this.applicationContext = applicationContext; } @PostConstruct public void collectRestControllers() { // 获取所有标注了@RestController的Bean,key为Bean名称,value为实例 Map<String, Object> restControllerBeans = applicationContext.getBeansWithAnnotation(RestController.class); allRestControllers = restControllerBeans.values().stream().collect(Collectors.toList()); // 可添加验证逻辑,比如打印所有控制器类名 allRestControllers.forEach(bean -> System.out.println("检测到RestController:" + bean.getClass().getName())); } public List<Object> getAllRestControllers() { return allRestControllers; } }
使用时,直接注入RestControllerCollector调用getAllRestControllers方法即可获取所有控制器实例列表。
方法二:通过BeanDefinitionRegistryPostProcessor获取控制器类信息(无需实例)
如果只需要获取@RestController标注的类对象而非实例,可以在Bean实例化前通过BeanDefinitionRegistryPostProcessor扫描所有Bean定义:
import org.springframework.beans.BeansException; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.beans.factory.config.ConfigurableListableBeanFactory; import org.springframework.beans.factory.support.BeanDefinitionRegistry; import org.springframework.beans.factory.support.BeanDefinitionRegistryPostProcessor; import org.springframework.core.type.AnnotationMetadata; import org.springframework.stereotype.Component; import org.springframework.web.bind.annotation.RestController; import java.util.ArrayList; import java.util.List; @Component public class RestControllerClassCollector implements BeanDefinitionRegistryPostProcessor { private List<Class<?>> restControllerClasses = new ArrayList<>(); @Override public void postProcessBeanDefinitionRegistry(BeanDefinitionRegistry registry) throws BeansException { String[] beanNames = registry.getBeanDefinitionNames(); for (String beanName : beanNames) { BeanDefinition definition = registry.getBeanDefinition(beanName); AnnotationMetadata metadata = definition.getMetadata(); // 检查当前Bean定义是否标注了@RestController if (metadata.hasAnnotation(RestController.class.getName())) { try { Class<?> clazz = Class.forName(metadata.getClassName()); restControllerClasses.add(clazz); } catch (ClassNotFoundException e) { e.printStackTrace(); } } } // 验证输出 restControllerClasses.forEach(clazz -> System.out.println("检测到RestController类:" + clazz.getName())); } @Override public void postProcessBeanFactory(ConfigurableListableBeanFactory beanFactory) throws BeansException { // 无需额外处理 } public List<Class<?>> getRestControllerClasses() { return restControllerClasses; } }
关键注意事项
- 确保第三方控制器被Spring扫描:如果第三方库的
@RestController未被自动扫描,需要在启动类中手动指定扫描包路径:
@SpringBootApplication(scanBasePackages = {"com.your.custom.package", "com.thirdparty.controller.package"}) public class YourApplication { public static void main(String[] args) { SpringApplication.run(YourApplication.class, args); } }
- 第三方自动配置类的兼容性:如果第三方库通过自动配置类注册控制器,上述两种方法依然有效,因为Bean定义会被正常注册到Spring容器中。
内容的提问来源于stack exchange,提问作者PatPanda
相关产品推荐
相关产品推荐

