[SPRING] 로드 된 모든 Spring 빈을 인쇄하십시오 - Spring Boot
SPRING로드 된 모든 Spring 빈을 인쇄하십시오 - Spring Boot
스프링 부트 앱의 일부로로드 된 모든 bean의 이름을 어떻게 알 수 있습니까? 서버가 시작되면로드되는 bean의 세부 사항을 인쇄하기 위해 main 메소드에 몇 가지 코드가 필요하다.
해결법
-
==============================
1.spring-boot의 시작 안내서에서 볼 수 있듯이 https://spring.io/guides/gs/spring-boot/
spring-boot의 시작 안내서에서 볼 수 있듯이 https://spring.io/guides/gs/spring-boot/
@SpringBootApplication public class Application { public static void main(String[] args) { SpringApplication.run(Application.class, args); } @Bean public CommandLineRunner commandLineRunner(ApplicationContext ctx) { return args -> { System.out.println("Let's inspect the beans provided by Spring Boot:"); String[] beanNames = ctx.getBeanDefinitionNames(); Arrays.sort(beanNames); for (String beanName : beanNames) { System.out.println(beanName); } }; } }
@Velu가 주석에서 언급했듯이, 수동으로 등록 된 빈은 나열되지 않습니다.
그렇게하고 싶다면 getSingletonNames ()를 사용할 수 있습니다. 그러나 조심하십시오. 이 메소드는 이미 인스턴스화 된 bean 만 리턴합니다. bean이 이미 인스턴스화되지 않은 경우, getSingletonNames ()에 의해 리턴되지 않습니다.
-
==============================
2.액츄에이터 사용을 제안 할 수 있습니까? 응용 프로그램의 모든 bean을 나열하는 / beans를 포함하여 여러 엔드 포인트를 제공합니다. "일단 서버가 시작되면"라고 말하면 웹 응용 프로그램의 옵션입니다.
액츄에이터 사용을 제안 할 수 있습니까? 응용 프로그램의 모든 bean을 나열하는 / beans를 포함하여 여러 엔드 포인트를 제공합니다. "일단 서버가 시작되면"라고 말하면 웹 응용 프로그램의 옵션입니다.
액츄에이터를 설치하려면
액추에이터 엔드 포인트 목록
-
==============================
3.글쎄,이 질문에 이미 대답했지만, 나는 아직도 자바 8 변종이다 대답을 제공하고 싶습니다 :)
글쎄,이 질문에 이미 대답했지만, 나는 아직도 자바 8 변종이다 대답을 제공하고 싶습니다 :)
Arrays.asList(context.getBeanDefinitionNames()).stream().sorted().forEach(System.out::println);
자바 8하자!
-
==============================
4.사실, @SpringBootApplication을 수정하지 않고이 클래스를 만드는 것이 좋습니다.
사실, @SpringBootApplication을 수정하지 않고이 클래스를 만드는 것이 좋습니다.
@Component public class ContextTeller implements CommandLineRunner { @Autowired ApplicationContext applicationContext; @Override public void run(String... args) throws Exception { System.out.println("-------------> just checking!"); System.out.println(Arrays.asList(applicationContext.getBeanDefinitionNames())); }}
이렇게하면 Spring Boot는이 클래스를로드하고 컨텍스트를로드 한 직후에 실행합니다. 그런 다음 파일을 제거하면 모든 것이 명확 해집니다.
-
==============================
5.이 요구 사항에 대한 작은 실험을 한 적이 있는데이 솔루션을 발견했습니다. WEB, 액추에이터, HAL 및 Devtools와 같은 모듈을 선택하면서 SpringBoot를 만들었습니다. 액추에이터에있는 모든 끝점을로드하기 위해 응용 프로그램 속성에서 아래 속성을 구성했습니다.
이 요구 사항에 대한 작은 실험을 한 적이 있는데이 솔루션을 발견했습니다. WEB, 액추에이터, HAL 및 Devtools와 같은 모듈을 선택하면서 SpringBoot를 만들었습니다. 액추에이터에있는 모든 끝점을로드하기 위해 응용 프로그램 속성에서 아래 속성을 구성했습니다.
작동기 정보는 http : // localhost : 8080 / actuator에서 확인할 수 있습니다. 이것은 액추에이터, 상태, 정보 등과 함께 모든 어플리케이션 정보를 보여줄 것입니다. 그 안에서, http : // localhost : 8080 / actuator / beans는 springboot 어플리케이션에 의해 내부적으로 생성 된 모든 bean을로드합니다.
모든 콩 정보를 볼 수있게되면 메인 클래스에서 다시 인쇄 할 필요가 없다고 생각합니다.
내 애플리케이션에서 rest-hal-browser 의존성을 이미 구성 했으므로 http : // localhost : 8080의 URL을로드하면 다른 엔드 포인트를 검색 할 UI가로드됩니다. 아래 그림에서 저는 액츄에이터 정보를 찾고 있습니다.
-
==============================
6.
@Component public class ContextTeller implements CommandLineRunner { @Autowired public ApplicationContext applicationContext; @Override public void run(String... args) throws Exception { System.out.println("<------------- Beans loaded --------------->"); Arrays.asList(applicationContext.getBeanDefinitionNames()).stream().forEach(System.out::println); } }
-
==============================
7.applicationContext.getBeanDefinitionNames ()는 BeanDefinition 인스턴스없이 등록 된 Bean을 표시하지 않습니다.
applicationContext.getBeanDefinitionNames ()는 BeanDefinition 인스턴스없이 등록 된 Bean을 표시하지 않습니다.
스프링 부트 웹 애플리케이션의 경우, 아래의 엔드 포인트를 사용하여 모든 bean을 나열 할 수 있습니다.
@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; }
}
environment, systemProperties 출력에서 볼 수 있듯이 systemEnvironment bean은 context.getBeanDefinitionNames () 메소드를 사용하여 표시되지 않습니다.
from https://stackoverflow.com/questions/33348937/print-all-the-spring-beans-that-are-loaded-spring-boot by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] 스프링 데이터 나머지에있는 동일한 엔티티에 대한 다중 리포지토리 (0) | 2019.03.18 |
---|---|
[SPRING] 차이가 액세스 = "permitAll"과 필터 = "없음"? (0) | 2019.03.18 |
[SPRING] java.lang.ClassNotFoundException : org.hibernate.engine.SessionFactoryImplementor (0) | 2019.03.18 |
[SPRING] restTemplate을 사용하여 Multipart 폼 데이터를 보내는 방법 Spring-mvc (0) | 2019.03.18 |
[SPRING] RestTemplate 대 Apache Http 클라이언트 (봄 프로젝트의 프로덕션 코드 용) (0) | 2019.03.18 |