¿Hay alguna manera de imprimir todos los frijoles de primavera que se cargan al inicio? Estoy usando Spring 2.0.
95
Sí, contacta ApplicationContext
y llama.getBeanDefinitionNames()
Puede obtener el contexto mediante:
ApplicationContextAware
@Inject
/ @Autowired
(después de 2.5)WebApplicationContextUtils.getRequiredWebApplicationContext(..)
Relacionado: también puede detectar el registro de cada bean registrando un BeanPostprocessor
bean. Se notificará para cada bean.
ApplicationContextAware
interfaz es porque Spring Framework le da la oportunidad de acceder al contexto de la aplicación. Debe colocarlo en la@Configuration
clase para el contexto de aplicación previsto.public class PrintBeans { @Autowired ApplicationContext applicationContext; public void printBeans() { System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames())); } }
fuente
Imprima todos los nombres de los frijoles y sus clases:
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"; } }
fuente
Con Spring Boot y el motor de arranque del actuador
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
puedes comprobar el punto final
/beans
fuente
applicationContext.getBeanDefinitionNames () no no muestran los granos que se registran sin instancia 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); } }
}
Salida de consola
Como se puede ver en la salida, medio ambiente, SystemProperties, systemEnvironment granos se no se muestran utilizando context.getBeanDefinitionNames () método.
Bota de primavera
Para las aplicaciones web de arranque de primavera, todos los beans se pueden enumerar utilizando el siguiente punto final.
@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; }
}
fuente
Podrías intentar llamar
O active el registro de depuración para
org.springframework
. (En el arranque de primavera, eso es usar un parámetro--logging.level.org.springframework=DEBUG
)fuente
ListableBeanFactory
es una interfaz. ¿Dónde se obtendría una instancia de una clase que extienda esa interfaz para ejecutar el métodogetBeansOfType
o cualquier otro método en la interfaz? Veo que loApplicationContext
amplía, pero su ejemplo no muestra cómo adquirir uno de esos.@Autowired ListableBeanFactory listableBeanFactory
y obtendrá uno (el tipo de implementación no debe importar)Utilizando
spring-boot-starter-actuator
puede acceder fácilmente a todos los archivos bean.Aquí está el proceso de configuración:
Agregue abajo en el archivo gradle:
compile("org.springframework.boot:spring-boot-starter-actuator")
Agregue
management.security.enabled=false
en su archivo application.propertypunto final de llamada / beans :
Después de esa configuración, la primavera habilitará algunos puntos finales relacionados con las métricas. Uno de sus puntos finales es / beans Después de llamar a estos puntos finales, proporcionará un archivo json que contiene todo su bean, incluida su dependencia y alcance.
Aquí hay un archivo json de ejemplo:
[{"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":[]}]
Para obtener más información, visite los siguientes enlaces:
Espero que esto te ayudará. Gracias :)
fuente
Aquí hay otra forma de imprimir todos los nombres de frijoles del contexto de la aplicación de primavera:
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 ******************
fuente