Czy istnieje sposób na wydrukowanie wszystkich ziaren wiosennych, które są ładowane podczas uruchamiania? Używam Spring 2.0.
95
Tak, odbierz ApplicationContext
i zadzwoń.getBeanDefinitionNames()
Możesz uzyskać kontekst poprzez:
ApplicationContextAware
@Inject
/ @Autowired
(po 2,5)WebApplicationContextUtils.getRequiredWebApplicationContext(..)
Powiązane: rejestrację każdego ziarna można również wykryć, rejestrując BeanPostprocessor
ziarno. Zostanie powiadomiony o każdym ziarnie.
ApplicationContextAware
interfejsu jest to, że Spring Framework daje mu szansę na dostęp do kontekstu aplikacji. Powinieneś umieścić go w@Configuration
klasie dla zamierzonego kontekstu aplikacji.public class PrintBeans { @Autowired ApplicationContext applicationContext; public void printBeans() { System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames())); } }
źródło
Wydrukuj wszystkie nazwy ziaren i ich klasy:
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"; } }
źródło
Ze sprężyną rozruchową i rozrusznikiem siłownika
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
możesz sprawdzić punkt końcowy
/beans
źródło
applicationContext.getBeanDefinitionNames () czy nie pokazać ziarna, które są zarejestrowane bez instancji 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); } }
}
Wyjście konsoli
Jak widać w danych wyjściowych, komponenty bean environment, systemProperties, systemEnvironment nie zostaną wyświetlone przy użyciu funkcji context.getBeanDefinitionNames () metody .
Spring Boot
W przypadku aplikacji internetowych uruchamianych wiosną wszystkie komponenty bean można wyświetlić za pomocą poniższego punktu końcowego.
@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; }
}
źródło
Możesz spróbować zadzwonić
Lub włącz rejestrowanie debugowania dla
org.springframework
. (W butach wiosennych używa się parametru--logging.level.org.springframework=DEBUG
)źródło
ListableBeanFactory
to interfejs. Skąd można uzyskać instancję klasy rozszerzającej ten interfejs w celu wykonania metodygetBeansOfType
lub dowolnej innej metody w interfejsie? Widzę, żeApplicationContext
to przedłuża, ale twój przykład nie pokazuje, jak zdobyć jedną z nich.@Autowired ListableBeanFactory listableBeanFactory
i je otrzymasz (typ implementacji nie powinien mieć znaczenia)Za pomocą
spring-boot-starter-actuator
można łatwo uzyskać dostęp do wszystkich fasoli.Oto proces konfiguracji:
Dodaj poniżej do pliku gradle:
compile("org.springframework.boot:spring-boot-starter-actuator")
Dodaj
management.security.enabled=false
do pliku application.propertypunkt końcowy połączenia / fasoli :
Po tej konfiguracji wiosna włączy niektóre punkty końcowe związane z metrykami. Jednym z jego punktów końcowych jest / fasola Po wywołaniu tych punktów końcowych dostarczy plik json, który zawiera wszystkie komponenty bean, w tym jego zależności i zakres.
Oto przykładowy plik 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":[]}]
Aby uzyskać więcej informacji, odwiedź poniższe linki:
Mam nadzieję, że to ci pomoże. Dzięki :)
źródło
Oto inny sposób wydrukowania wszystkich nazw ziaren z kontekstu aplikacji wiosennej:
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 ******************
źródło