Роздрукуйте всі завантажені весняні боби


95

Чи є спосіб роздрукувати всі весняні боби, які завантажуються під час запуску? Я використовую Spring 2.0.

Відповіді:


88

Так, загляньте ApplicationContextі зателефонуйте.getBeanDefinitionNames()

Ви можете отримати контекст, виконавши:

  • впровадження ApplicationContextAware
  • вводячи його з @Inject/ @Autowired(після 2,5)
  • використання WebApplicationContextUtils.getRequiredWebApplicationContext(..)

Пов’язане: Ви також можете виявити реєстрацію кожного бобу, зареєструвавши BeanPostprocessorбоб. Буде повідомлено про кожну квасоля.


1
Причиною реалізації ApplicationContextAwareінтерфейсу є те, що Spring framework дає йому можливість отримати доступ до контексту програми. Ви повинні помістити його в @Configurationклас для передбачуваного контексту програми.
smwikipedia

Пов'язана посилання: stackoverflow.com/questions/14829258 / ...
smwikipedia

1
applicationContext.getBeanDefinitionNames () не відображає компоненти, зареєстровані без екземпляра BeanDefinition. Ви не зможете перерахувати одиночні боби, які реєструються вручну. ex- :) ви не можете перерахувати середовище, 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 () не відображає компоненти, зареєстровані без екземпляра BeanDefinition. Ви не зможете перерахувати одиночні боби, які реєструються вручну. ex- :) ви не можете перерахувати середовище, systemProperties, systemEnvironment боби. Однак ці боби доступні в контейнері. Ви можете використовувати їх autowire @Auwired навколишнього середовища окр т.д. stackoverflow.com/a/54863282/1840774
Велю

22

Роздрукуйте всі назви квасолі та її класи:

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

1
applicationContext.getBeanDefinitionNames () не відображає компоненти, зареєстровані без екземпляра BeanDefinition. Ви не зможете перерахувати одиночні боби, які реєструються вручну. ex- :) ви не можете перерахувати середовище, 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

Як ви можете бачити на виході, навколишнього середовища, 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.internalConfigurationAnnotationProcessor. internalCachingMetadataReaderFactory "," org.springframework.boot.autoconfigure.condition.BeanTypeRegistry "," org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry "," propertySourcesPlaceholderPonquestPressholderConworkSpeperPressConworkSpensionPress. , "saveErrorControllerTargetClassPostProcessor "," org.springframework.context.annotation.internalAutowiredAnnotationProcessor "," org.springframework.context.annotation.internalRequiredAnnotationProcessor. ConfigurationPropertiesBindingPostProcessor "," org.springframework.scheduling.annotation.ProxyAsyncConfiguration "," org.springframework.context.annotation.internalAsyncAnnotationProcessor "," methodValidationPostProcessorBestPressPressPressPressPressPressPressPressPercessorapplicationEventMulticaster "" 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.springframeworkProFetwork.bogetProperCraft. duplicateServerPropertiesDetector "," spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties "," org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ DefaultErrorViewResolverConfiguration "," conventionErrorViewResolver "," org.springframeb. contextParameters "," contextAttributes "," spring.mvc-org.springframework.boot.autoconfigure.web.WebMvcProperties "," spring.http.multipart-org.springframework.boot.autoconfigure.web.MultipartProperties "," org.springframe " 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", "exportContwork. завантаження.autoconfigure.AutoConfigurationPackages "," org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ Jackson2Object. 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," error "," , "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.Confress.web.Conf.requestMappingHandlerAdapter »," mvcResourceUrlProvider "," requestMappingHandlerMapping "," mvcPathMatcher "," mvcUrlPathHelper "," viewControllerHandlerMapping "," beanNameHandlerMapping "," resourceHandlerMapping "," defaultServletHandlerMapping "," mvcUriComponentsContributor "," httpRequestHandlerAdapter "," simpleControllerHandlerAdapter "," handlerExceptionResolver " , "mvcViewResolver", "org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration $ WebMvcAutoConfigurationAdapter $ FaviconConfiguration", "faviconRequestHandler", "faviconHandlerMapping", default "viewResolver "," welcomePageHandlerMapping "," org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration "," objectNamingStrategy "," mbeanServer "," mbeanExporter "," org.springframework.boot.autoconfiningApplicationAdig. , "org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration", "org.springframework.boot.autoconfigure.web.JacksonHttpMessageConvertersConfiguration", "spring.info-org.springframework.boot.Potg. springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration "," multipartResolver "," org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration $ RestTemplateConfiguration "," restTemplateBuilder "," org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration "," spring.devtools.google.com. 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)


ListableBeanFactoryце інтерфейс. Де можна взяти екземпляр класу, що розширює цей інтерфейс, щоб виконати метод getBeansOfTypeабо будь-який інший метод в інтерфейсі? Я бачу, що ApplicationContextце розширює, але ваш приклад не показує, як придбати одне з них.
ErikE

Ви можете просто додати поле, @Autowired ListableBeanFactory listableBeanFactoryі ви отримаєте його (тип реалізації не повинен мати значення)
artbristol

1

За допомогою spring-boot-starter-actuatorви можете легко отримати доступ до всіх бобів.

Ось процес налаштування:

  1. Додайте залежність у gradle :

Додайте нижче файл gradle:

compile("org.springframework.boot:spring-boot-starter-actuator")
  1. Увімкніть безпеку на application.properties :

Додайте management.security.enabled=falseу файл application.property

  1. кінцева точка виклику / квасолі :

    Після цього пружина налаштування дозволить включити деякі кінцеві точки, пов’язані з показниками. Однією з його кінцевих точок є / beans. Після виклику цієї кінцевої точки він надасть файл json, що містить весь ваш компонент, включаючи його залежність та область дії.

Ось приклад 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":[]}]

Для отримання додаткової інформації відвідайте наведені нижче посилання:

Сподіваюся, це допоможе вам. Дякую :)


1
весна! = spring-boot
Хіманшу Бхардвай

Так, це справжній брат :). Це рішення призначене для спринтерського завантаження.
Md. Sajedul Karim

1

Ось ще один спосіб надрукувати всі імена компонентів з контексту програми 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 ****************** 
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.