[Spring] SpringApplication를 통한 코딩

SpringBoot - SpringApplication ( applicationContext 등록 이전의 이벤트 Listener 등록 하기)

applicationContext가 등록되기 전에 발생한 이벤트를 Listen하는 리스너를 등록하려면 어떻게 해야할까?

@Component
public class SampleListener implements ApplicationListener<ApplicationStartingEvent> {

    @Override
    public void onApplicationEvent(ApplicationStartingEvent applicationStartingEvent) {
        System.out.println("===================");
        System.out.println("application start ");
        System.out.println("===================");
    }
}

SampleListner를 만들고, ApplicationListenr를 구현한다. Generic으로 발생할 이벤트를 명시해 준다. 여기에서는 ApplicationStartingEvent 클래스는 스프링부트에서 제공하는 Event 클래스이다. 문제는 해당 이벤트가 applicationContext가 띄기전에 발생하기 때문에, 해당 리스너가 캐치하지 못하는 문제가 발생한다.

해결책

@SpringBootApplication
public class DemoApplication {

    public static void main(String[] args) {

    //  SpringApplication.run(DemoApplication.class, args);

        SpringApplication springApplication = new SpringApplication(DemoApplication.class);
        springApplication.addListeners(new SampleListner());
        springApplication.run(args);

    }

}

기존의 SpringBoot 애플리케이션을 만든 Main메서드를 보면, SpringApplication.run() 이라는 static 메서드를 통해서 만든다. 그렇게 되면, SpringApplication을 커스터마이징 할 수 없기 때문에, 새로운 SpringApplication 객체를 만들고 리스너를 추가한다. 이렇게 되면 이전에 작성했던 SampleListner는 빈으로 등록할 필요가 없다. (어차피 해당 이벤트가 applicationContext가 등록되기 전에 발생한 이벤트이니까)

📚 Related Posts

[Spring] SpringApplication를 통한 코딩
Older post

[Spring Boot] 스프링 부트 3가지 특징

Newer post

[Spring] Profile 설정하기

[Spring] SpringApplication를 통한 코딩