Imprime todos os beans Spring carregados

94

Existe uma maneira de imprimir todos os grãos de primavera que são carregados na inicialização? Estou usando o Spring 2.0.

Punter Vicky
fonte

Respostas:

87

Sim, ApplicationContextligue e ligue.getBeanDefinitionNames()

Você pode obter o contexto:

  • implementando ApplicationContextAware
  • injetando-o com @Inject/ @Autowired(após 2,5)
  • usar WebApplicationContextUtils.getRequiredWebApplicationContext(..)

Relacionado: Você também pode detectar o registro de cada bean registrando um BeanPostprocessorbean. Ele será notificado para cada bean.

Bozho
fonte
1
O motivo para implementar a ApplicationContextAwareinterface é porque a estrutura do Spring oferece a chance de acessar o contexto do aplicativo. Você deve colocá-lo na @Configurationclasse para o contexto de aplicativo pretendido.
smwikipedia
Um link relacionado: stackoverflow.com/questions/14829258/…
smwikipedia
1
applicationContext.getBeanDefinitionNames () não mostra os beans que estão registrados sem a instância de BeanDefinition. Você não poderá listar beans singleton que são registrados manualmente. ex- :) você não pode listar os beans de ambiente, systemProperties e systemEnvironment. No entanto, esses grãos estão disponíveis no recipiente. Você pode conectá-los automaticamente usando @Auwired Environment env etc. stackoverflow.com/a/54863282/1840774
Velu
66
public class PrintBeans {
    @Autowired
    ApplicationContext applicationContext;

    public void printBeans() {
        System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));
    }
}
Akceptor
fonte
applicationContext.getBeanDefinitionNames () não mostra os beans que estão registrados sem a instância BeanDefinition. Você não poderá listar beans singleton que são registrados manualmente. ex- :) você não pode listar os beans de ambiente, systemProperties e systemEnvironment. No entanto, esses grãos estão disponíveis no recipiente. Você pode conectá-los automaticamente usando @Auwired Environment env etc. stackoverflow.com/a/54863282/1840774
Velu
21

Imprima todos os nomes de bean e suas classes:

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
fonte
1
applicationContext.getBeanDefinitionNames () não mostra os beans que estão registrados sem a instância de BeanDefinition. Você não poderá listar beans singleton que são registrados manualmente. ex- :) você não pode listar os beans de ambiente, systemProperties e systemEnvironment. No entanto, esses grãos estão disponíveis no recipiente. Você pode conectá-los automaticamente usando @Auwired Environment env etc. stackoverflow.com/a/54863282/1840774
Velu
19

Com Spring Boot e o acionador de partida do atuador

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

você pode verificar o endpoint /beans

vietnem
fonte
2
A pergunta era para Spring 2.0, não Spring Boot.
TMN
7

applicationContext.getBeanDefinitionNames () faz não mostrar os grãos que são registradas sem instância 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);
    }       
}

}


Saída do console

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

Como você pode ver na saída, meio ambiente, SystemProperties, systemEnvironment feijão vai não ser mostrado usando context.getBeanDefinitionNames () método.

Spring Boot

Para aplicativos da web com boot de primavera, todos os beans podem ser listados usando o endpoint abaixo.

@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", "ambiente", "systemProperties", "systemEnvironment", "org.springframework.context.annotation.internalConfigurationAnnotationboamework.", "org. internalCachingMetadataReaderFactory "," org.springframework.boot.autoconfigure.condition.BeanTypeRegistry "," org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry "," propertySourcesPlacefigurationPlaceholderConfigurer.trostonfiguration.bootator.Processing , "preserveErrorControllerTargetClassPostProcessor "," org.springframework.context.annotation.internalAutowiredAnnotationProcessor "," org.springframework.context.annotation.internalRequiredAnnotationProcessor "," org.springframework.context.annotation.internal " ConfigurationPropertiesBindingPostProcessor "," org.springframework.scheduling.annotation.ProxyAsyncConfiguration "," org.springframework.context.annotation.internalAsyncAnnotationProcessor "," methodValidationPostProcessor "," embeddedServletContainerorCustomizerBosteanPostProcessor "," embeddedServletContainerorocustomizerBosteanPost "errorProcessor "ProcessorProcessador",applicationEventMulticaster "," org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration $ EmbeddedTomcat "," tomcatEmbeddedServletContainerFactory "," org.springframework.boot.autoconfiguration.websocket.WebencocketAutoconfiguration, "webscatEmbeddedServletContainerFactory", "org.springframework.boot.autoconfiguration.websocket.WebencocketAutoconfiguration" Tomcat org.springframework.boot.autoconfigure.web.HttpEncodingProperties "," org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration "," localeCharsetMappingsCustomizer "," org.springframework.boot.autoconfigure "," org.springframework.boot.autoconfigure ", duplicateServerPropertiesDetector "," spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties "," org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ DefaultErrorViewResolverConfiguration "," conventionErrorViewResolver "," org.springframework.boot.Mutoconfigure.webxtizer "errorConte contextParameters "," contextAttributes "," spring.mvc-org.springframework.boot.autoconfigure.web.WebMvcProperties "," spring.http.multipart-org.springframework.boot.autoconfigure.web.MultipartProperties "," org.sproperties. 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", "export.troller". inicializar.autoconfigure.AutoConfigurationPackages "," org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ Jackson2ObjectMapperBuilderCustomutizer.JacksonAutoConfiguration $ Jackson2ObjectMapperBuilderCustomutizer. JacksonProperties "," standardJacksonObjectMapperBuilderCustomizer "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ JacksonObjectMapperBuilderConfiguration "," org.springframework.boot.autoconfiguração.jackson.ComuilderConfiguration ". boot.autoconfigure.jackson.JacksonAutoConfiguration $ JacksonObjectMapperConfiguration "," jacksonObjectMapper "," org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration "," org.springframework.boot.autoconfigure.web.EmbigurerServletContainerAutoConfiguração , "org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration", "defaultValidator", "org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ WhitelabelErrorViewConfiguration", "errorConfiguração", "errorConfiguração", "errorConfiguração", "errorConfigurar" , "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 ",vigurationConverters"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.jmx.adminAutoConfiguration "," objectNamingStrategy "," mbeanServer "," mbeanExporter "," org.springframework.boot.autoconfigur.adminarutoSpregpplication "spring , "org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration", "org.springframework.boot.autoconfigure.web.JacksonHttpMessageConvertersConfiguration", "spring.info-org.springframework.Proot.autoconfigure" org.springframework.boot.autoconfigure "org.springframework.boot.autoconfigure". springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration "," multipartResolver "," org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration $ RestTemplateConfiguration "," restTemplateBuilder "," org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration "," spring.devtools-org.sprutoconfigure.boot.devto 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 "]

Velu
fonte
6

Você poderia tentar ligar

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

Ou ative o registro de depuração para org.springframework. (Na bota de primavera, isso está usando um parâmetro --logging.level.org.springframework=DEBUG)

Artbristol
fonte
ListableBeanFactoryé uma interface. Onde se obteria uma instância de uma classe que estende essa interface para executar o método getBeansOfTypeou qualquer outro método na interface? Vejo que o ApplicationContextestende, mas seu exemplo não mostra como adquirir um desses.
ErikE
Você pode simplesmente adicionar um campo @Autowired ListableBeanFactory listableBeanFactorye obterá um (o tipo de implementação não deve importar)
artbristol
1

Usando spring-boot-starter-actuatorvocê pode acessar facilmente todos os grãos.

Aqui está o processo de configuração:

  1. Adicionar dependência ao gradle :

Adicione o fole ao arquivo gradle:

compile("org.springframework.boot:spring-boot-starter-actuator")
  1. Ative a segurança em application.properties :

Adicione management.security.enabled=falseem seu arquivo application.property

  1. endpoint call / beans :

    Depois dessa configuração, a primavera ativará alguns endpoints relacionados a métricas. Um de seus endpoints é / beans Depois de chamar este endpoints, ele fornecerá um arquivo json que contém todos os seus beans, incluindo sua dependência e escopo.

Aqui está um exemplo de arquivo 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":[]}]

Para mais informações visite os links abaixo:

Espero que isso ajude você. Obrigado :)

Md. Sajedul Karim
fonte
1
spring! = spring-boot
Himanshu Bhardwaj
Sim, isso é verdadeiro irmão :). Esta solução é para inicialização sprint.
Md. Sajedul Karim
1

Aqui está outra maneira de imprimir todos os nomes de bean do contexto do aplicativo 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 ****************** 
Ved Singh
fonte