Apakah ada cara untuk mencetak semua kacang pegas yang dimuat saat startup? Saya menggunakan Spring 2.0.
95
Ya, ApplicationContext
hubungi dan hubungi.getBeanDefinitionNames()
Anda bisa mendapatkan konteksnya dengan:
ApplicationContextAware
@Inject
/ @Autowired
(setelah 2.5)WebApplicationContextUtils.getRequiredWebApplicationContext(..)
Terkait: Anda juga dapat mendeteksi pendaftaran kacang dengan mendaftarkan BeanPostprocessor
kacang. Ini akan diberitahukan untuk setiap kacang.
ApplicationContextAware
antarmuka adalah karena kerangka kerja Spring memberinya kesempatan untuk mengakses konteks aplikasi. Anda harus menempatkannya di@Configuration
kelas untuk konteks aplikasi yang dimaksudkan.public class PrintBeans { @Autowired ApplicationContext applicationContext; public void printBeans() { System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames())); } }
sumber
Cetak semua nama kacang dan kelasnya:
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"; } }
sumber
Dengan Spring Boot dan starter aktuator
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-actuator</artifactId> </dependency>
Anda dapat memeriksa titik akhir
/beans
sumber
applicationContext.getBeanDefinitionNames () tidak tidak menunjukkan kacang yang terdaftar tanpa BeanDefinition misalnya.
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); } }
}
Output Konsol
Seperti yang Anda lihat di output, environment, systemProperties, bean systemEnvironment tidak akan ditampilkan menggunakan metode context.getBeanDefinitionNames () .
Boot Musim Semi
Untuk aplikasi web boot musim semi, semua kacang dapat didaftarkan menggunakan titik akhir di bawah ini.
@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; }
}
sumber
Anda bisa mencoba menelepon
Atau aktifkan logging debug untuk
org.springframework
. (Di boot musim semi, itu menggunakan parameter--logging.level.org.springframework=DEBUG
)sumber
ListableBeanFactory
adalah sebuah antarmuka. Di mana seseorang akan mendapatkan instance dari kelas yang memperluas antarmuka itu untuk mengeksekusi metodegetBeansOfType
atau metode lain di antarmuka? Saya melihat ituApplicationContext
memperluasnya, tetapi contoh Anda tidak menunjukkan bagaimana mendapatkan salah satunya.@Autowired ListableBeanFactory listableBeanFactory
dan Anda akan mendapatkannya (jenis penerapan seharusnya tidak menjadi masalah)Menggunakan
spring-boot-starter-actuator
Anda dapat dengan mudah mengakses semua kacang.Berikut proses penyiapannya:
Tambahkan di bawah ke file gradle:
compile("org.springframework.boot:spring-boot-starter-actuator")
Tambahkan
management.security.enabled=false
ke file application.property Andacall / beans endpoint :
Setelah penyiapan itu, musim semi akan mengaktifkan beberapa titik akhir terkait metrik. Salah satu titik akhirnya adalah / beans Setelah memanggil endpoint ini, ia akan menyediakan file json yang berisi semua bean Anda termasuk dependensi dan cakupannya.
Berikut ini contoh file 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":[]}]
Untuk info lebih lanjut kunjungi tautan di bawah:
Semoga ini bisa membantu Anda. Terima kasih :)
sumber
Berikut adalah cara lain untuk mencetak semua nama kacang dari konteks aplikasi pegas:
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 ******************
sumber