You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在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;
    }
}

关键注意事项

  1. 确保第三方控制器被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);
    }
}
  1. 第三方自动配置类的兼容性:如果第三方库通过自动配置类注册控制器,上述两种方法依然有效,因为Bean定义会被正常注册到Spring容器中。

内容的提问来源于stack exchange,提问作者PatPanda

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.08 13:20:26