In tất cả các Đậu mùa xuân được tải


94

Có cách nào để in tất cả các Spring bean được tải khi khởi động không? Tôi đang sử dụng Spring 2.0.

Câu trả lời:


87

Có, giữ lại ApplicationContextvà gọi.getBeanDefinitionNames()

Bạn có thể lấy bối cảnh bằng cách:

  • thực thi ApplicationContextAware
  • tiêm nó với @Inject/ @Autowired(sau 2,5)
  • sử dụng WebApplicationContextUtils.getRequiredWebApplicationContext(..)

Liên quan: Bạn cũng có thể phát hiện đăng ký của từng bean bằng cách đăng ký BeanPostprocessorbean. Nó sẽ được thông báo cho mỗi hạt đậu.


1
Lý do để triển khai ApplicationContextAwaregiao diện là vì Spring framework cho nó cơ hội truy cập vào ngữ cảnh ứng dụng. Bạn nên đặt nó trong @Configurationlớp cho ngữ cảnh ứng dụng dự định.
smwikipedia

Một liên kết có liên quan: stackoverflow.com/questions/14829258/…
smwikipedia

1
applicationContext.getBeanDefinitionNames () không hiển thị các bean được đăng ký mà không có cá thể BeanDefinition. Bạn sẽ không thể liệt kê các hạt đậu đơn được đăng ký theo cách thủ công. ví dụ: :) bạn không thể liệt kê các hạt đậu môi trường, hệ thống, hệ thống. Tuy nhiên những hạt đậu này có sẵn trong thùng. Bạn có thể tự động kích hoạt chúng bằng cách sử dụng @Auwired Environment env, v.v. stackoverflow.com/a/54863282/1840774
Velu

66
public class PrintBeans {
    @Autowired
    ApplicationContext applicationContext;

    public void printBeans() {
        System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames()));
    }
}

applicationContext.getBeanDefinitionNames () không hiển thị các bean được đăng ký mà không có cá thể BeanDefinition. Bạn sẽ không thể liệt kê các hạt đậu đơn được đăng ký theo cách thủ công. ví dụ: :) bạn không thể liệt kê các hạt đậu môi trường, hệ thống, hệ thống. Tuy nhiên những hạt đậu này có sẵn trong hộp đựng. Bạn có thể tự động kích hoạt chúng bằng cách sử dụng @Auwired Environment env, v.v. stackoverflow.com/a/54863282/1840774
Velu

21

In tất cả các tên bean và các lớp của nó:

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 () không hiển thị các bean được đăng ký mà không có cá thể BeanDefinition. Bạn sẽ không thể liệt kê các hạt đậu đơn được đăng ký theo cách thủ công. ví dụ: :) bạn không thể liệt kê các hạt đậu môi trường, hệ thống, hệ thống. Tuy nhiên những hạt đậu này có sẵn trong hộp đựng. Bạn có thể tự động kích hoạt chúng bằng cách sử dụng @Auwired Environment env, v.v. stackoverflow.com/a/54863282/1840774
Velu

19

Với Spring Boot và bộ khởi động bộ truyền động

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

bạn có thể kiểm tra điểm cuối /beans


2
Câu hỏi dành cho Spring 2.0, không phải Spring Boot.
TMN

7

applicationContext.getBeanDefinitionNames () không không thấy đậu được đăng ký mà không BeanDefinition dụ.

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

}


Đầu ra bảng điều khiển

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

Như bạn có thể thấy trong đầu ra, môi trường, systemProperties, systemEnosystem bean sẽ không được hiển thị bằng cách sử dụng phương thức context.getBeanDefinitionNames () .

Khởi động mùa xuân

Đối với các ứng dụng web khởi động mùa xuân, tất cả các bean có thể được liệt kê bằng cách sử dụng điểm cuối bên dưới.

@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", "môi trường", "systemProperties", "systemEnosystem", "org.springframework.context.annotation.internalConfigurationAnnotation.bospring.ameframe org. org. InternalCachingMetadataReaderFactory "," org.springframework.boot.autoconfigure.condition.BeanTypeRegistry "," org.springframework.context.annotation.ConfigurationClassPostProcessor.importRegistry "," propertySourcesPostholderConfcessor.proottiesProtiesProtiescontework. , "bảo tồnErrorControllerTargetClassPostProcessor "," org.springframework.context.annotation.internalAutowosystemAnnotationProcessor "," org.springframework.context.annotation.internalRequiredAnnotationProcessor "," org.springframework.contextprocesswork. ConfigurationPropertiesBindingPostProcessor "," org.springframework.scheduling.annotation.ProxyAsyncConfiguration "," org.springframework.context.annotation.internalAsyncAnnotationProcessor "," methodValidationPostProcessor "," errorPostomProvletContext "," Tin nhắn "nhúngPostomProvletConteapplicationEventMulticaster "," org.springframework.boot.autoconfigure.web.EmbeddedServletContainerAutoConfiguration $ EmbeddedTomcat "," tomcatEmbeddedServletContainerFactory "," org.springframework.boot.autoconfigureWcat.webefingcketContainer " org.springframework.boot.autoconfigure.web.HttpEncodingProperties "," org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration "," localeCharsetMappingsCustomizer "," org.springframework.boot.autoconfigure.web.HttpEncodingAutoConfiguration "," localeCharsetMappingsCustomizer "," org.springframework, máy chủ " DupateServerPropertiesDetector "," spring.resources-org.springframework.boot.autoconfigure.web.ResourceProperties "," org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ DefaultErrorViewResolverConfiguration "," ConventionErrorViewResolver "," org.springframework.boot.autocon ", servextredframework error.boot.autocon" contextParameters "," contextAttributes "," spring.mvc-org.springframework.boot.autoconfigure.web.WebMvcProperties "," spring.http.multipart-org.springframework.boot.autoconfigure.web.MultipartProperties "," org. boot.autoconfigure.web.MultipartAutoConfiguration "," multiartConfigElement "," 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. khởi động.autoconfigure.AutoConfigurationPackages "," org.springframework.boot.autoconfigure.context.PropertyPlaceholderAutoConfiguration "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration.context.PropertyPlaceholderAutoConfiguration "org.springframework.boot.autoconfigure.jackson.JacksonAutoConfigurationCustackson $ Jackson2ObonfigurationMapperme" springwork.jpg JacksonProperties "," standardJacksonObjectMapperBuilderCustomizer "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration $ JacksonObjectMapperBuilderConfiguration "," org.springframework.boot.autoconfigure.jackson.JacksonAutoConfiguration "$ JacksonObjectMapperBuilderConfiguration", "org.springframework.boot.autocon" boot.autoconfigure.jackson.JacksonAutoConfiguration $ JacksonObjectMapperConfiguration "," jacksonObjectMapper "," org.springframework.boot.autoconfigure.websocket.WebSocketAutoConfiguration "," org.springframework.boot.autoconfigure.weerwork.Embotringa " , "org.springframework.boot.autoconfigure.validation.ValidationAutoConfiguration", "defaultValidator", "org.springframework.boot.autoconfigure.web.ErrorMvcAutoConfiguration $ WhitelabelErrorViewConfiguration basic errorView," error "," Lỗi "bean , "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.autocerC messageConfigure.utob.Httpvc ", mvice"requestMappingHandlerAdapter", "mvcResourceUrlProvider", "requestMappingHandlerMapping", "mvcPathMatcher", "mvcUrlPathHelper", "viewControllerHandlerMapping", "beanNameHandlerMapping", "resourceHandlerMapping", "defaultServletHandlerMapping", "mvcUriComponentsContributor", "httpRequestHandlerAdapter", "simpleControllerHandlerAdapter", "handlerExceptionResolver" , "mvcViewResolver", "org.springframework.boot.autoconfigure.web.WebMvcAutoConfiguration $ WebMvcAutoConfigurationAdapter $ FaviconConfiguration", "faviconRequestHandler", "faviconHandlerMappingolver", "default ,ViewResviewResolver "," welcomePageHandlerMapping "," org.springframework.boot.autoconfigure.jmx.JmxAutoConfiguration "," objectNamingStrategy "," mbeanServer "," mbeanExporter "," org.springAframework.boot.adminAdminJprxAframework.boot.adminAdminJprxAppraApp " , "org.springframework.boot.autoconfigure.context.ConfigurationPropertiesAutoConfiguration", "org.springframework.boot.autoconfigure.web.JacksonHttpMessageConvertersConfiguration", "spring.info-orgties.springainmework.boot", orgties.org springframework.boot.autoconfigure.info.ProjectInfoAutoConfiguration "," multiartResolver "," org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration $ RestTemplateConfiguration "," restTemplateBuilder "," org.springframework.boot.autoconfigure.web.WebClientAutoConfiguration "," spring.devtools, "evonfiguration. 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 "," optionLiveReloadServer "," org.springframework.boot.devtools.autoconfigure.LocalDevToolsAutoConfiguration "," lifeecycleProcessor "]


6

Bạn có thể thử gọi điện

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

Hoặc bật ghi nhật ký gỡ lỗi cho org.springframework. (Trong khởi động mùa xuân, đó là sử dụng một tham số --logging.level.org.springframework=DEBUG)


ListableBeanFactorylà một giao diện. Người ta sẽ lấy một thể hiện của một lớp mở rộng giao diện đó ở đâu để thực thi phương thức getBeansOfTypehoặc bất kỳ phương thức nào khác trong giao diện? Tôi thấy điều đó ApplicationContextmở rộng nó, nhưng ví dụ của bạn không cho thấy làm thế nào để có được một trong những điều đó.
ErikE

Bạn chỉ có thể thêm một lĩnh vực @Autowired ListableBeanFactory listableBeanFactoryvà bạn sẽ nhận được một (kiểu thực hiện nên không quan trọng)
artbristol

1

Sử dụng spring-boot-starter-actuatorbạn có thể dễ dàng truy cập tất cả các đậu.

Đây là quá trình thiết lập:

  1. Thêm phụ thuộc vào gradle :

Thêm dưới đây vào tệp gradle:

compile("org.springframework.boot:spring-boot-starter-actuator")
  1. Bật bảo mật trên application.properties :

Thêm management.security.enabled=falsevào tệp application.property của bạn

  1. call / bean endpoint :

    Sau khi thiết lập, mùa xuân sẽ bật một số điểm cuối liên quan đến chỉ số. Một trong những điểm cuối của nó là / bean Sau khi gọi điểm cuối này, nó sẽ cung cấp một tệp json chứa tất cả bean của bạn bao gồm cả phần phụ thuộc và phạm vi của nó.

Đây là một tệp json mẫu:

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

Để biết thêm thông tin, hãy truy cập các liên kết dưới đây:

Hy vọng điều này sẽ giúp bạn. Cảm ơn :)


1
! mùa xuân = mùa xuân-boot
Himanshu Bhardwaj

Yeah, đúng là anh trai :). Giải pháp này dành cho khởi động nước rút.
Md. Sajedul Karim.

1

Đây là một cách khác để in tất cả các tên bean từ ngữ cảnh ứng dụng mùa xuân:

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 ****************** 
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.