有没有办法打印启动时加载的所有spring bean?我使用的是Spring 2.0。
答案 0 :(得分:76)
是的,得到ApplicationContext
并致电.getBeanDefinitionNames()
您可以通过以下方式获取上下文:
ApplicationContextAware
@Inject
/ @Autowired
(2.5之后)注入WebApplicationContextUtils.getRequiredWebApplicationContext(..)
相关:您还可以通过注册BeanPostprocessor
bean来检测每个bean的注册。每个bean都会收到通知。
答案 1 :(得分:59)
public class PrintBeans {
@Autowired
ApplicationContext applicationContext;
public void printBeans() {
System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));
}
}
答案 2 :(得分:19)
打印所有bean名称及其类:
package com.javahash.spring.controller;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.ApplicationContext;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
@Controller
public class HelloWorldController {
@Autowired
private ApplicationContext applicationContext;
@RequestMapping("/hello")
public String hello(@RequestParam(value="key", required=false, defaultValue="World") String name, Model model) {
String[] beanNames = applicationContext.getBeanDefinitionNames();
for (String beanName : beanNames) {
System.out.println(beanName + " : " + applicationContext.getBean(beanName).getClass().toString());
}
model.addAttribute("name", name);
return "helloworld";
}
}
答案 3 :(得分:15)
使用Spring Boot和执行器启动器
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-actuator</artifactId>
</dependency>
您可以检查端点/beans
答案 4 :(得分:6)
您可以尝试拨打
org.springframework.beans.factory.ListableBeanFactory.getBeansOfType(Object.class)
或打开org.springframework
的调试日志记录。 (在春季启动时,使用参数--logging.level.org.springframework=DEBUG
)
答案 5 :(得分:4)
applicationContext.getBeanDefinitionNames()不会不显示在没有 BeanDefinition实例的情况下注册的Bean。
package io.velu.core;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
@Configuration
@ComponentScan
public class Core {
public static void main(String[] args) {
AnnotationConfigApplicationContext context = new AnnotationConfigApplicationContext(Core.class);
String[] singletonNames = context.getDefaultListableBeanFactory().getSingletonNames();
for (String singleton : singletonNames) {
System.out.println(singleton);
}
}
}
environment
systemProperties
systemEnvironment
org.springframework.context.annotation.internalConfigurationAnnotationProcessor
org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry
org.springframework.context.event.internalEventListenerProcessor
org.springframework.context.event.internalEventListenerFactory
org.springframework.context.annotation.internalAutowiredAnnotationProcessor
org.springframework.context.annotation.internalCommonAnnotationProcessor
messageSource
applicationEventMulticaster
lifecycleProcessor
如您在输出中看到的,将使用 context.getBeanDefinitionNames()方法不显示环境,systemProperties,systemEnvironment Bean。
对于Spring Boot Web应用程序,可以使用以下端点列出所有bean。
@RestController
@RequestMapping("/list")
class ExportController {
@Autowired
private ApplicationContext applicationContext;
@GetMapping("/beans")
@ResponseStatus(value = HttpStatus.OK)
String[] registeredBeans() {
return printBeans();
}
private String[] printBeans() {
AutowireCapableBeanFactory autowireCapableBeanFactory = applicationContext.getAutowireCapableBeanFactory();
if (autowireCapableBeanFactory instanceof SingletonBeanRegistry) {
String[] singletonNames = ((SingletonBeanRegistry) autowireCapableBeanFactory).getSingletonNames();
for (String singleton : singletonNames) {
System.out.println(singleton);
}
return singletonNames;
}
return null;
}
}
[ “ autoConfigurationReport”, “ springApplicationArguments”, “ springBootBanner”, “ springBootLoggingSystem”, “环境”, “系统属性”, “ systemEnvironment”, “ org.springframework.context.annotation.internalConfigurationAnnotationProcessor”, “ org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory”, “ org.springframework.boot.autoconfigure.condition.BeanTypeRegistry”, “ org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry”, “ propertySourcesPlaceholderConfigurer”, “ org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor.store”, “ preserveErrorControllerTargetClassPostProcessor”, “ org.springframework.context.annotation.internalAutowiredAnnotationProcessor”, “ org.springframework.context.annotation.internalRequiredAnnotationProcessor”, “ org.springframework.context.annotation.internalCommonAnnotationProcessor”, “ org.springframework.boot.context.properties.ConfigurationPropertiesBindingPostProcessor”, “ org.springframework.scheduling.annotation.ProxyAsyncConfiguration”, “ org.springframework.context.annotation.internalAsyncAnnotationProcessor”, “ methodValidationPostProcessor”, “ embeddedServletContainerCustomizerBeanPostProcessor”, “ errorPageRegistrarBeanPostProcessor”, “ messageSource”, “ applicationEventMulticaster”, “ org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration $ EmbeddedTomcat”, “ tomcatEmbeddedServletContainerFactory”, “ org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration $ TomcatWebSocketConfiguration”, “ websocketContainerCustomizer”, “ spring.http.encoding-org.springframework.boot.autoconfigure.web.HttpEncodingProperties”, “ org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration”, “ localeCharsetMappingsCustomizer”, “ org.springframework.boot.autoconfigure.web.ServerPropertiesAutoConfiguration”, “ serverProperties”, “ duplicateServerPropertiesDetector”, “ spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties”, “ org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ DefaultErrorViewResolverConfiguration”, “ conventionErrorViewResolver”, “ org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration”, “ errorPageCustomizer”, “ servletContext”, “ contextParameters”, “ contextAttributes”, “ spring.mvc-org.springframework.boot.autoconfigure.web.WebMvcProperties”, “ spring.http.multipart-org.springframework.boot.autoconfigure.web.MultipartProperties”, “ org.springframework.boot.autoconfigure.web.MultipartAutoConfiguration”, “ multipartConfigElement”, “ org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration $ DispatcherServletRegistrationConfiguration”, “ org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration $ DispatcherServletConfiguration”, “ dispatcherServlet”, “ dispatcherServletRegistration”, “ requestContextFilter”, “ org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration”, “ hiddenHttpMethodFilter”, “ httpPutFormContentFilter”, “ characterEncodingFilter”, “ org.springframework.context.event.internalEventListenerProcessor”, “ org.springframework.context.event.internalEventListenerFactory”, “ reportGeneratorApplication”, “ exportController”, “ exportService”, “ org.springframework.boot.autoconfigure.AutoConfigurationPackages”, “ org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration”, “ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ Jackson2ObjectMapperBuilderCustomizerConfiguration”, “ spring.jackson-org.springframework.boot.autoconfigure.jackson.JacksonProperties”, “ standardJacksonObjectMapperBuilderCustomizer”, “ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ JacksonObjectMapperBuilderConfiguration”, “ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration”, “ jsonComponentModule”, “ jacksonObjectMapperBuilder”, “ org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ JacksonObjectMapperConfiguration”, “ jacksonObjectMapper”, “ org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration”, “ org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration”, “ org.springframework.boot.autoconfigure.web.DispatcherServletAutoConfiguration”, “ org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration”, “ defaultValidator”, “ org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ WhitelabelErrorViewConfiguration”, “错误”, “ beanNameViewResolver”, “ errorAttributes”, “ basicErrorController”, “ org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration $ EnableWebMvcConfiguration”, “ org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration $ WebMvcAutoConfigurationAdapter”, “ mvcContentNegotiationManager”, “ org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration $ StringHttpMessageConverterConfiguration”, “ stringHttpMessageConverter”, “ org.springframework.boot.autoconfigure.web.JacksonHttpMessageConvertersConfiguration $ MappingJackson2HttpMessageConverterConfiguration”, “ mappingJackson2HttpMessageConverter”, “ org.springframework.boot.autoconfigure.web.HttpMessageConvertersAutoConfiguration”, “ messageConverters”, “ mvcConversionService”, “ mvcValidator”, “ requestMappingHandlerAdapter”, “ mvcResourceUrlProvider”, “ requestMappingHandlerMapping”, “ mvcPathMatcher”, “ mvcUrlPathHelper”, “ viewControllerHandlerMapping”, “ beanNameHandlerMapping”, “ resourceHandlerMapping”, “ defaultServletHandlerMapping”, “ mvcUriComponentsContributor”, “ httpRequestHandlerAdapter”, “ simpleControllerHandlerAdapter”, “ handlerExceptionResolver”, “ mvcViewResolver”, “ org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration $ WebMvcAutoConfigurationAdapter $ FaviconConfiguration”, “ faviconRequestHandler”, “ faviconHandlerMapping”, “ defaultViewResolver”, “ viewResolver”, “ welcomePageHandlerMapping”, “ org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration”, “ objectNamingStrategy”, “ mbeanServer”, “ mbeanExporter”, “ org.springframework.boot.autoconfigure.admin.SpringApplicationAdminJmxAutoConfiguration”, “ springApplicationAdminRegistrar”, “ org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration”, “ org.springframework.boot.autoconfigure.web.JacksonHttpMessageConvertersConfiguration”, “ spring.info-org.springframework.boot.autoconfigure.info.ProjectInfoProperties”, “ org.springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration”, “ multipartResolver”, “ org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration $ RestTemplateConfiguration”, “ restTemplateBuilder”, “ org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration”, “ spring.devtools-org.springframework.boot.devtools.autoconfigure.DevToolsProperties”, “ org.springframework.boot.devtools.autoconfigure.LocalDevToolsAutoConfiguration $ RestartConfiguration”, “ fileSystemWatcherFactory”, “ classPathRestartStrategy”, “ classPathFileSystemWatcher”, “ hateoasObjenesisCacheDisabler”, “ org.springframework.boot.devtools.autoconfigure.LocalDevToolsAutoConfiguration $ LiveReloadConfiguration $ LiveReloadServerConfiguration”, “ org.springframework.boot.devtools.autoconfigure.LocalDevToolsAutoConfiguration $ LiveReloadConfiguration”, “ OptionalLiveReloadServer”, “ org.springframework.boot.devtools.autoconfigure.LocalDevToolsAutoConfiguration”, “ lifecycleProcessor” ]
答案 6 :(得分:1)
使用spring-boot-starter-actuator
可以轻松访问所有bean。
以下是设置过程:
将波纹管添加到gradle文件中:
compile("org.springframework.boot:spring-boot-starter-actuator")
将management.security.enabled=false
添加到您的application.property文件中
呼叫/ beans端点:
在那之后,安装弹簧将启用一些与指标相关的端点。 它的端点之一是 / beans 调用此终结点后,它将提供一个json文件,其中包含您所有的bean,包括其依赖项和范围。
这是一个示例json文件:
[{"context":"application:8442","parent":null,"beans":[{"bean":"beanName","aliases":[],"scope":"singleton","type":"packageName$$4b46c703","resource":"null","dependencies":["environment","beanName1","beanName2"]},{"bean":"org.springframework.boot.autoconfigure.internalCachingMetadataReaderFactory","aliases":[],"scope":"singleton","type":"org.springframework.core.type.classreading.CachingMetadataReaderFactory","resource":"null","dependencies":[]}]
有关更多信息,请访问以下链接:
希望这会对您有所帮助。谢谢:)
答案 7 :(得分:1)
这是从spring应用程序上下文中打印所有bean名称的另一种方法:
import java.util.Arrays;
import java.util.concurrent.atomic.AtomicInteger;
import org.apache.logging.log4j.LogManager;
import org.apache.logging.log4j.Logger;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.context.ConfigurableApplicationContext;
/***********************************************************************************************************
* Java File: MainApplication.java
* Description: Main class to run the application.
*
***********************************************************************************************************/
@SpringBootApplication
public class MainApplication {
private static final Logger logger = LogManager.getLogger(MainApplication.class);
public static void main(String[] args)
{
final ConfigurableApplicationContext context = SpringApplication.run(MainApplication.class, args);
final AtomicInteger counter = new AtomicInteger(0);
logger.info("**************** START: Total Bean Objects: {} ******************", context.getBeanDefinitionCount());
Arrays.asList(context.getBeanDefinitionNames())
.forEach(beanName -> {
logger.info("{}) Bean Name: {} ", counter.incrementAndGet(), beanName);
});
logger.info("**************** END: Total Bean: {} ******************", context.getBeanDefinitionCount());
}
}
Sample Output:
2019-11-27 20:08:02.821 INFO [main] [c.c.a.MainApplication:18] - **************** START: Total Bean Objects: 564 ******************
...........................
2019-11-27 20:08:02.821 INFO [main] [c.c.a.MainApplication:22] - 460) Bean Name: mvcPathMatcher
2019-11-27 20:08:02.821 INFO [main] [c.c.a.MainApplication:22] - 461) Bean Name: mvcUrlPathHelper
2019-11-27 20:08:02.821 INFO [main] [c.c.a.MainApplication:22] - 462) Bean Name: viewControllerHandlerMapping
2019-11-27 20:08:02.821 INFO [main] [c.c.a.MainApplication:22] - 463) Bean Name: beanNameHandlerMapping
2019-11-27 20:08:02.821 INFO [main] [c.c.a.MainApplication:22] - 464) Bean Name: resourceHandlerMapping
...........................
2019-11-27 20:08:02.821 INFO [main] [c.c.a.MainApplication:25] - **************** END: Total Bean: 564 ******************