Распечатайте все загруженные бины Spring

95

Есть ли способ распечатать все компоненты Spring, которые загружаются при запуске? Я использую Spring 2.0.

Пантер Вики
источник

Ответы:

88

Да, возьми ApplicationContextи позвони.getBeanDefinitionNames()

Вы можете получить контекст:

  • реализация ApplicationContextAware
  • вводя его с помощью @Inject/ @Autowired(после 2.5)
  • использовать WebApplicationContextUtils.getRequiredWebApplicationContext(..)

Связанный: Вы также можете определить регистрацию каждого bean-компонента, зарегистрировав BeanPostprocessorbean-компонент. Он будет уведомлен для каждого bean-компонента.

Божо
источник
1
Причина реализации ApplicationContextAwareинтерфейса заключается в том, что среда Spring дает ему возможность доступа к контексту приложения. Вы должны поместить его в @Configurationкласс для предполагаемого контекста приложения.
smwikipedia 03
Связанная ссылка: stackoverflow.com/questions/14829258/…
smwikipedia 03
1
applicationContext.getBeanDefinitionNames () не показывает bean-компоненты, зарегистрированные без экземпляра BeanDefinition. Вы не сможете перечислить singleton beans, зарегистрированные вручную. ex- :) вы не можете перечислить компоненты environment, systemProperties, systemEnvironment. Однако эти бобы доступны в контейнере. Вы можете использовать их autowire @Auwired окружающей среды окр т.д. stackoverflow.com/a/54863282/1840774
Велю
67
public class PrintBeans {
    @Autowired
    ApplicationContext applicationContext;

    public void printBeans() {
        System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));
    }
}
Акцептор
источник
applicationContext.getBeanDefinitionNames () не показывает bean-компоненты, зарегистрированные без экземпляра BeanDefinition. Вы не сможете перечислить singleton beans, зарегистрированные вручную. ex- :) вы не можете перечислить компоненты environment, systemProperties, systemEnvironment. Однако эти бобы доступны в контейнере. Вы можете использовать их autowire @Auwired окружающей среды окр т.д. stackoverflow.com/a/54863282/1840774
Велю
22

Выведите все имена 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";
    }
}
vanfgh
источник
1
applicationContext.getBeanDefinitionNames () не показывает bean-компоненты, зарегистрированные без экземпляра BeanDefinition. Вы не сможете перечислить singleton beans, зарегистрированные вручную. ex- :) вы не можете перечислить компоненты environment, systemProperties, systemEnvironment. Однако эти бобы доступны в контейнере. Вы можете использовать их autowire @Auwired окружающей среды окр т.д. stackoverflow.com/a/54863282/1840774
Велю
19

С пружинным чехлом и пускателем привода

<dependency>
  <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-starter-actuator</artifactId>
</dependency>

вы можете проверить конечную точку /beans

Вьетнам
источник
2
Вопрос касался Spring 2.0, а не Spring Boot.
TMN
8

applicationContext.getBeanDefinitionNames () ничего не показывает бобы , которые зарегистрированы без экземпляра BeanDefinition.

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

Как видно из выходных данных, компоненты environment, systemProperties, systemEnvironment не будут отображаться с помощью context.getBeanDefinitionNames () .

Весенний ботинок

Для веб-приложений с весенней загрузкой все компоненты могут быть перечислены с помощью конечной точки ниже.

@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», «environment», «systemProperties», «systemEnvironment», «org.springframework.context.annotation.internalConfigurationAnnotation.Processor.framework», «org. internalCachingMetadataReaderFactory "," org.springframework.boot.autoconfigure.condition.BeanTypeRegistry "," org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry "ties "ties "propertySourcesPlaceholder.Configureframeworkr. , "preserveErrorControllerTargetClassPostProcessor "," org.springframework.context.annotation.internalAutowiredAnnotationProcessor "," org.springframework.context.annotation.internalRequiredAnnotationProcessor "," org.springframework.context.annotation.internalAutowiredAnnotationProcessor "," org.springframework.context.annotation.internalRequiredAnnotationProcessor "," org.springframework.context.processor. ConfigurationPropertiesBindingPostProcessor "," org.springframework.scheduling.annotation.ProxyAsyncConfiguration "," org.springframework.context.annotation.internalAsyncAnnotationProcessor "," methodValidationPostProcessor "," errorServletaContainerPostProcessor "," errorServletanserPostProcessor "," errorServletCopyrightapplicationEventMulticaster "," org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration $ EmbeddedTomcat "," tomcatEmbeddedServletContainerFactory "," org.springframework.boot.autocketServletContainerServletContainerFactory "," org.springframework.boot. org.springframework.boot.autoconfigure.web.HttpEncodingProperties "," org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration "," localeCharsetMappingsCustomizer "," org.Spring.configuration.Properties "," org.framework.configuration. duplicateServerPropertiesDetector "," spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties "," org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ DefaultErrorViewResolverConfiguration "," ConventionErrorViewResolver "," org.springframework.boot.web.autoconfiguration "," ConventionErrorViewResolver "," org.springframework.boot.web.autoconfigure " contextParameters »,« contextAttributes »,« spring.mvc-org.springframework.boot.autoconfigure.web.WebMvcProperties »,« spring.http.multipart-org.springframework.boot.autoconfigure.web.MultipartProperties »,« orgrame.Properties ». 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». загрузки.autoconfigure.AutoConfigurationPackages "," org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ Jackson2ObjectMapperBuilconfiguration $ Jackson2ObjectMapperBuilservice.jackson2ObjectMapperBuil JacksonProperties "," standardJacksonObjectMapperBuilderCustomizer "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ JacksonObjectMapperBuilderConfiguration "," org.springframework.boot.AutoConfiguration "," jacksonObjectMapperBuilderConfiguration "," org.springframework.boot.Autoconfigure " boot.autoconfigure.jackson.JacksonAutoConfiguration $ JacksonObjectMapperConfiguration "," jacksonObjectMapper "," org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration "," org.springframework.boot.autoconfigure.webletContaincher.Autoconfigure.webletframework.boot.autoconfigure.webletAmbeddedSettings "или" , "org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration", "defaultValidator", "org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfigure.web.ErrorMvcAutoConfiguration $ WhitelabelErrorViewConfiguration", "errorAutoConfiguration $ WhitelabelErrorViewConfiguration", "ошибка" , "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.HttpMessageConverters "," mssageframework.boot.autoconfigure.web.HttpMessageConverters "," messageframeconverters "," messagecversion "," messageframeconverters "," messagecversion "," message "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.admin »,« org.springframework.boot.admin. , "org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration", «org.springframework.boot.autoconfigure.web.JacksonHttpMessageConvertersConfiguration», «spring.info-org.spring.framework.foot.boot. springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration "," multipartResolver "," org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration $ RestTemplateConfiguration "," restTemplateBuilder "," org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration "," spring.devtools.WebClientAutoConfiguration "," spring.devtools-org.springTemplate.devtools "," 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

Вы можете попробовать позвонить

org.springframework.beans.factory.ListableBeanFactory.getBeansOfType(Object.class)

Или включите ведение журнала отладки для org.springframework. (В весенней загрузке используется параметр --logging.level.org.springframework=DEBUG)

artbristol
источник
ListableBeanFactoryэто интерфейс. Где взять экземпляр класса, расширяющего этот интерфейс, чтобы выполнить методgetBeansOfType или любой другой метод в интерфейсе? Я вижу, что ApplicationContextэто расширяет его, но ваш пример не показывает, как получить один из них.
ErikE
Вы можете просто добавить поле, @Autowired ListableBeanFactory listableBeanFactoryи вы получите его (тип реализации не имеет значения)
artbristol
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 :

    После этой настройки Spring включит некоторые конечные точки, связанные с метриками. Одна из его конечных точек - / 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":[]}]

Для получения дополнительной информации посетите следующие ссылки:

Надеюсь, что это поможет вам. Благодарность :)

Md. Sajedul Karim
источник
1
spring! = Spring-boot
Химаншу Бхардвадж
Да, это настоящий брат :). Это решение для спринт-загрузки.
Md. Sajedul Karim
1

Вот еще один способ распечатать все имена bean-компонентов из контекста приложения Spring:

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 ****************** 
Вед Сингх
источник