java - 如何列出Spring Boot中所有托管的@Component?

标签 java spring spring-boot inversion-of-control autowired

我正在尝试使用 ListableBeanFactory 接口(interface)列出 Spring Boot 应用程序中的所有托管组件,如 How to Get All Spring-Managed Beans? 中所示。

@SpringBootApplication
public class Application {
    private static ApplicationContext applicationContext;

    public static void main(String[] args) {
        applicationContext = SpringApplication.run(Application.class, args);
        displayAllBeans();
    }

    public static void displayAllBeans() {
        String[] allBeanNames = applicationContext.getBeanDefinitionNames();
        for(String beanName : allBeanNames) {
            System.out.println(beanName);
        }
    }
}

运行应用程序时,出现以下异常,表明 applicationContext 对象为 null

Exception in thread "restartedMain" java.lang.reflect.InvocationTargetException
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.springframework.boot.devtools.restart.RestartLauncher.run(RestartLauncher.java:49)
Caused by: java.lang.NullPointerException
    at mygroup.myapp.displayAllBeans(myapp.java:18)
    at mygroup.myapp.main(myapp.java:14)
    ... 5 more

我错过了什么?提前致谢

更新:

示例中的代码按预期工作。我的代码中存在一个错误,导致 applicationContext 变量无法正确设置。

最佳答案

我认为问题在于 ApplicationContext 实例是由 main 线程创建的,但随后,无论出于何种原因,它被restartedMain 线程。

由于applicationContext属性不是synchronized,也不是 volatile restartedMain线程访问了过时的数据 - 这就是为什么java.lang.NullPointerException

要打印 Spring 管理的所有 bean,您可以使用 offical sources 中的示例.

@SpringBootApplication
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }

    @Bean
    public CommandLineRunner commandLineRunner(ApplicationContext ctx) {
        return args -> {
            System.out.println("Let's inspect the beans provided by Spring Boot:");
            String[] beanNames = ctx.getBeanDefinitionNames();
            Arrays.sort(beanNames);
            for (String beanName : beanNames) {
                System.out.println(beanName);
            }

        };
    }
}

关于java - 如何列出Spring Boot中所有托管的@Component?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57837880/

相关文章:

java - 从 Java 中的一系列日期中获取所有连续间隔的列表

java - JOptionPane 中的排列

Java 创建损坏的 ZIP 文件

spring - 如何在 Spring 中注入(inject)基于类型安全限定符的 bean 类型映射?

spring - 构建 Spring MVC 应用程序, Controller "Cannot find symbol"模型

java - robocode 中的线性定位

java - Spring 5 MVC JSON ser/deser 不尊重属性(但适用于 XML)

java - 如何在springframework中查找注解的文档

java - 在 Spring 中进行 Junit 测试自定义过滤器

spring-boot - Spring Boot 测试似乎正在创建与我预期不同的 H2 测试数据库