복붙노트

[SPRING] 로드 된 모든 Spring 빈을 인쇄하십시오 - Spring Boot

SPRING

로드 된 모든 Spring 빈을 인쇄하십시오 - Spring Boot

스프링 부트 앱의 일부로로드 된 모든 bean의 이름을 어떻게 알 수 있습니까? 서버가 시작되면로드되는 bean의 세부 사항을 인쇄하기 위해 main 메소드에 몇 가지 코드가 필요하다.

해결법

  1. ==============================

    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. ==============================

    2.액츄에이터 사용을 제안 할 수 있습니까? 응용 프로그램의 모든 bean을 나열하는 / beans를 포함하여 여러 엔드 포인트를 제공합니다. "일단 서버가 시작되면"라고 말하면 웹 응용 프로그램의 옵션입니다.

    액츄에이터 사용을 제안 할 수 있습니까? 응용 프로그램의 모든 bean을 나열하는 / beans를 포함하여 여러 엔드 포인트를 제공합니다. "일단 서버가 시작되면"라고 말하면 웹 응용 프로그램의 옵션입니다.

    액츄에이터를 설치하려면

    액추에이터 엔드 포인트 목록

  3. ==============================

    3.글쎄,이 질문에 이미 대답했지만, 나는 아직도 자바 8 변종이다 대답을 제공하고 싶습니다 :)

    글쎄,이 질문에 이미 대답했지만, 나는 아직도 자바 8 변종이다 대답을 제공하고 싶습니다 :)

    Arrays.asList(context.getBeanDefinitionNames()).stream().sorted().forEach(System.out::println);
    

    자바 8하자!

  4. ==============================

    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. ==============================

    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. ==============================

    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. ==============================

    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 () 메소드를 사용하여 표시되지 않습니다.

  8. from https://stackoverflow.com/questions/33348937/print-all-the-spring-beans-that-are-loaded-spring-boot by cc-by-sa and MIT license