Есть ли способ распечатать все компоненты Spring, которые загружаются при запуске? Я использую Spring 2.0.
95
Да, возьми ApplicationContext
и позвони.getBeanDefinitionNames()
Вы можете получить контекст:
ApplicationContextAware
@Inject
/ @Autowired
(после 2.5)WebApplicationContextUtils.getRequiredWebApplicationContext(..)
Связанный: Вы также можете определить регистрацию каждого bean-компонента, зарегистрировав BeanPostprocessor
bean-компонент. Он будет уведомлен для каждого bean-компонента.
ApplicationContextAware
интерфейса заключается в том, что среда Spring дает ему возможность доступа к контексту приложения. Вы должны поместить его в@Configuration
класс для предполагаемого контекста приложения.public class PrintBeans { @Autowired ApplicationContext applicationContext; public void printBeans() { System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames())); } }
источник
Выведите все имена bean-компонентов и их классы:
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"; } }
источник
С пружинным чехлом и пускателем привода
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
вы можете проверить конечную точку
/beans
источник
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 не будут отображаться с помощью 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; }
}
источник
Вы можете попробовать позвонить
Или включите ведение журнала отладки для
org.springframework
. (В весенней загрузке используется параметр--logging.level.org.springframework=DEBUG
)источник
ListableBeanFactory
это интерфейс. Где взять экземпляр класса, расширяющего этот интерфейс, чтобы выполнить методgetBeansOfType
или любой другой метод в интерфейсе? Я вижу, чтоApplicationContext
это расширяет его, но ваш пример не показывает, как получить один из них.@Autowired ListableBeanFactory listableBeanFactory
и вы получите его (тип реализации не имеет значения)С помощью
spring-boot-starter-actuator
вы можете легко получить доступ ко всем bean.Вот процесс настройки:
Добавьте ниже в файл gradle:
compile("org.springframework.boot:spring-boot-starter-actuator")
Добавьте
management.security.enabled=false
в свой файл application.propertyконечная точка вызова / beans :
После этой настройки Spring включит некоторые конечные точки, связанные с метриками. Одна из его конечных точек - / beans. После вызова этой конечной точки она предоставит json-файл, содержащий все ваши bean-компоненты, включая его зависимости и область видимости.
Вот пример файла 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":[]}]
Для получения дополнительной информации посетите следующие ссылки:
Надеюсь, что это поможет вам. Благодарность :)
источник
Вот еще один способ распечатать все имена bean-компонентов из контекста приложения 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 ******************
источник