打印所有加载的Spring bean

时间:2012-03-07 13:46:34

标签: java spring

有没有办法打印启动时加载的所有spring bean?我使用的是Spring 2.0。

8 个答案:

答案 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

对于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。

以下是设置过程:

  1. 将依赖项添加到gradle中

将波纹管添加到gradle文件中:

compile("org.springframework.boot:spring-boot-starter-actuator")
  1. 启用application.properties的安全性

management.security.enabled=false添加到您的application.property文件中

  1. 呼叫/ 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 ****************** 
相关问题