如何在 Spring Boot 中列出所有托管的@Component?
How to list all the managed @Component in Spring Boot?
我正在尝试使用 ListableBeanFactory 接口列出 Spring 引导应用程序中的所有托管组件,如 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
.[=20 的原因=]
要打印出由 Spring 管理的所有 beans,您可以使用来自 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);
}
};
}
}
我正在尝试使用 ListableBeanFactory 接口列出 Spring 引导应用程序中的所有托管组件,如 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
.[=20 的原因=]
要打印出由 Spring 管理的所有 beans,您可以使用来自 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);
}
};
}
}