Drucken Sie alle geladenen Spring Beans

91

Gibt es eine Möglichkeit, alle Spring Beans zu drucken, die beim Start geladen werden? Ich verwende Spring 2.0.

Punter Vicky
quelle

Antworten:

85

Ja, nehmen Sie Kontakt auf ApplicationContextund rufen Sie an.getBeanDefinitionNames()

Sie können den Kontext erhalten durch:

  • Umsetzung ApplicationContextAware
  • Injektion mit @Inject/ @Autowired(nach 2.5)
  • verwenden WebApplicationContextUtils.getRequiredWebApplicationContext(..)

Verwandte Themen: Sie können die Registrierung jeder Bean auch erkennen, indem Sie eine BeanPostprocessorBean registrieren . Es wird für jede Bohne benachrichtigt.

Bozho
quelle
1
Der Grund für die Implementierung der ApplicationContextAwareSchnittstelle liegt darin, dass das Spring-Framework die Möglichkeit bietet , auf den Anwendungskontext zuzugreifen. Sie sollten es in der @ConfigurationKlasse für den beabsichtigten Anwendungskontext platzieren.
smwikipedia
Ein verwandter Link: stackoverflow.com/questions/14829258/…
smwikipedia
1
applicationContext.getBeanDefinitionNames () zeigt nicht die Beans an, die ohne BeanDefinition-Instanz registriert sind. Sie können keine Singleton-Beans auflisten, die manuell registriert werden. Beispiel: Sie können keine Environment-, SystemProperties- und SystemEnvironment-Beans auflisten. Diese Bohnen sind jedoch im Behälter verfügbar. Sie können sie mit @Auwired Environment env usw. automatisch
Velu
65
public class PrintBeans {
    @Autowired
    ApplicationContext applicationContext;

    public void printBeans() {
        System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));
    }
}
Akceptor
quelle
applicationContext.getBeanDefinitionNames () zeigt nicht die Beans an, die ohne BeanDefinition-Instanz registriert sind. Sie können keine Singleton-Beans auflisten, die manuell registriert werden. ex- :) Sie können keine Environment-, SystemProperties- und SystemEnvironment-Beans auflisten. Diese Bohnen sind jedoch im Behälter verfügbar. Sie können sie mit @Auwired Environment env usw. automatisch
Velu
21

Drucken Sie alle Bean-Namen und ihre Klassen aus:

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
quelle
1
applicationContext.getBeanDefinitionNames () zeigt nicht die Beans an, die ohne BeanDefinition-Instanz registriert sind. Sie können keine Singleton-Beans auflisten, die manuell registriert werden. Beispiel: Sie können keine Environment-, SystemProperties- und SystemEnvironment-Beans auflisten. Diese Bohnen sind jedoch im Behälter verfügbar. Sie können sie mit @Auwired Environment env usw. automatisch
Velu
18

Mit Spring Boot und dem Aktuatorstarter

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

Sie können den Endpunkt überprüfen /beans

vietnem
quelle
2
Die Frage war für Spring 2.0, nicht für Spring Boot.
TMN
6

Sie könnten versuchen anzurufen

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

Oder aktivieren Sie die Debug-Protokollierung für org.springframework. (Im Spring Boot verwendet das einen Parameter --logging.level.org.springframework=DEBUG)

Artbristol
quelle
ListableBeanFactoryist eine Schnittstelle. Woher würde man eine Instanz einer Klasse bekommen, die diese Schnittstelle erweitert, um die Methode getBeansOfTypeoder eine andere Methode in der Schnittstelle auszuführen ? Ich sehe, das ApplicationContexterweitert es, aber Ihr Beispiel zeigt nicht, wie man eines davon erwirbt.
ErikE
Sie können einfach ein Feld hinzufügen @Autowired ListableBeanFactory listableBeanFactoryund Sie erhalten eines (der Implementierungstyp sollte keine Rolle spielen)
Artbristol
6

applicationContext.getBeanDefinitionNames () zeigt nicht die Beans an, die ohne BeanDefinition-Instanz registriert sind .

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);
    }       
}

}}


Konsolenausgabe

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

Wie Sie in der Ausgabe sehen können, werden Environment, SystemProperties und SystemEnvironment- Beans nicht mit der context.getBeanDefinitionNames () -Methode angezeigt .

Frühlingsstiefel

Für Spring Boot-Webanwendungen können alle Beans mithilfe des folgenden Endpunkts aufgelistet werden.

@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.internalConfigurationAnnotationProcessor", "org.springframework". internalCachingMetadataReaderFactory "," org.springframework.boot.autoconfigure.condition.BeanTypeRegistry "," org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry "," propertySourcesPlaceholderConfigurer "," org. , "erveErrorControllerTargetClassPostProcessor "," org.springframework.context.annotation.internalAutowiredAnnotationProcessor "," org.springframework.context.annotation.internalRequiredAnnotationProcessor "," org.springframework.contern.context " ConfigurationPropertiesBindingPostProcessor "," org.springframework.scheduling.annotation.ProxyAsyncConfiguration "," org.springframework.context.annotation.internalAsyncAnnotationProcessor "," methodValidationPostProcessor "," embeddedServletCeanPro "applicationEventMulticaster "," org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration $ EmbeddedTomcat "," tomcatEmbeddedServletContainerFactory "," org.springframework.boot.autoconfigure.websocket.WebSocketCutCt " org.springframework.boot.autoconfigure.web.HttpEncodingProperties "," org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration "," localeCharsetMappingsCustomizer "," org.springframework.boot.autoconfigure.weper "," ServerPro " duplicateServerPropertiesDetector "," spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties "," org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ DefaultErrorViewResolverConfiguration "," ConventionErrorViewResolver "," org.springframework.boot.autoconfigure.wec.Er " 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 "," requestContextFil " , "httpPutFormContentFilter", "characterEncodingFilter", "org.springframework.context.event.internalEventListenerProcessor", "org.springframework.context.event.internalEventListenerFactory", "reportGeneratorApplication", "exportController". booten.autoconfigure.AutoConfigurationPackages "," org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ Jackson2ObjectMapperBuilderCustomizerConfiguration "," spring.son JacksonProperties "," standardJacksonObjectMapperBuilderCustomizer "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ JacksonObjectMapperBuilderConfiguration "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration "," boot.autoconfigure.jackson.JacksonAutoConfiguration $ JacksonObjectMapperConfiguration "," jacksonObjectMapper "," org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration "," org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration ". , "org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration", "defaultValidator", "org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ WhitelabelErrorViewConfiguration", "error", "beanNameViewResolt" , "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.HttpMessageConvertersConver "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", "defaultViewResolver"viewResolver "," welcomePageHandlerMapping "," org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration "," objectNamingStrategy "," mbeanServer "," mbeanExporter "," org.springframework.boot.autoconfigure.admin.SpringApplA " , "org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration", "org.springframework.boot.autoconfigure.web.JacksonHttpMessageConvertersConfiguration", "spring.info-org.springframework.boot.autoconfigure.info.ProjectIno" 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.autoconPure " org.springframework.boot.devtools.autoconfigure.LocalDevToolsAutoConfiguration $ RestartConfiguration "," fileSystemWatcherFactory "," classPathRestartStrategy "," classPathFileSystemWatcher "," HassoasObjenesisCacheDisabler "," Konfiguration.Konfigurationskonfiguration " org.springframework.boot.devtools.autoconfigure.LocalDevToolsAutoConfiguration $ LiveReloadConfiguration "," optionalLiveReloadServer "," org.springframework.boot.devtools.autoconfigure.LocalDevToolsAutoConfiguration "," lifecycleProcessor "]

Velu
quelle
1

Mit können spring-boot-starter-actuatorSie leicht auf alle Bean zugreifen.

Hier ist der Einrichtungsprozess:

  1. Abhängigkeit in Gradle hinzufügen :

Fügen Sie unten in die Gradle-Datei ein:

compile("org.springframework.boot:spring-boot-starter-actuator")
  1. Aktivieren Sie die Sicherheit für application.properties :

Fügen Sie es management.security.enabled=falsein Ihre application.property-Datei ein

  1. Call / Beans-Endpunkt :

    Nach diesem Setup aktiviert Spring einige metrikbezogene Endpunkte. Einer der Endpunkte ist / bean. Nach dem Aufrufen dieser Endpunkte wird eine JSON-Datei bereitgestellt, die alle Ihre Beans einschließlich ihrer Abhängigkeit und ihres Umfangs enthält.

Hier ist ein Beispiel für eine JSON-Datei:

[{"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":[]}]

Weitere Informationen finden Sie unter den folgenden Links:

Hoffe das wird dir helfen. Vielen Dank :)

Md. Sajedul Karim
quelle
1
Frühling! = Frühlingsstiefel
Himanshu Bhardwaj
Ja, das ist wahrer Bruder :). Diese Lösung ist für Sprint-Boot.
Md. Sajedul Karim
1

Hier ist eine andere Möglichkeit, alle Bean-Namen aus dem Spring-Anwendungskontext zu drucken:

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
quelle