스프링으로 만든 어플리케이션실행과 함께 스케줄등을 실행 시켜야 하거나 initialDB등등 초기화 하는 메서드를 실행시켜야 하는 경우가 있기 때문에
실행되는 메소드에 대해서 알아볼 필요가 있어서
이 구동될 때 실행되는 메소드에 대해 정리하였다.
1. PostConstruct, PreDestory
그 중 bean이 생성될 때 실행되는 init-method 또는 destroy-method를 하는
@PostConstruct와 @PreDestroy가 있다.
@PostConstruct는 InitializingBean 콜백 인터페이스로써 afterPorpertiesSet() 으로써 정의된다.
@PreDestory는 DisposableBean에 대해서 destroy()를 호출한다.
이런 초기화 메서드와 소멸 메서드의 객체 정의 메타데이터를 사용하면 클래스가 스프링 인터페이스와 커플링을 갖지 않으면서 이와 동일한 컨테이너와의 통합을 이룰 수있다.
이 둘은 Bean lifecycle이므로 컨텍스트 라이프사이클을 사용하고 싶은경우에는 바로아래의 방식을 사용한다.
-> 하지만 둘은 99% 케이스에서 동일하다.
빈이 생성될 때 실행되는 매커니즘이 한가지가 아니다. 하지만 이런 메카니즘을 여러개 선언하였을 때 실행 순서는 다음과 같다.
빈 생성
1). @PostConstruct 어노테이션이 붙은 메서드
2). InitializingBean 콜백 인터페이스로 정의된 afterPropertiesSet()
3). 커스텀 설정된 init() 메서드
빈 제거
1). @PreDestroy 어노테이션이 붙은 메서드
2). DisposableBean 콜백 인터페이스로 정의된 destroy()
3). 커스텀 설정된 destroy() 메서드
2. ApplicationContext 라이플 사이클 LifecycleProcessor
스프링이 관리하는 모든 객체는 이 인터페이스를 구현한다.
그리고 ApplicationContext의 시작과 종료의 컨텍스트에서 정의한 모든 라이플 사이클 구현체에서 단계적으로 이 LifecycleProcessor에서 다음 메소드가 실행된다.
1 2 3 4 5 6 7 8 9 10 11 | public interface Lifecycle { void start(); void stop(); boolean isRunning(); } // Lifecycle 인터페이스에서 확장된 인터페이스 LifecylcleProcessor 인터페이스 public interface LifecycleProcessor extends Lifecycle { void onRefresh(); void onClose(); } | cs |
ApplicationContext의 상태가 변경될 경우 ApplicationListener 이 변경된 상태를 통보받을 수 있도록 설계되어 있다.
이는 옵저버 패턴으로써 ApplicationContext는 subject, ApplicationListener은 observer로서 동작한다.
그렇기에 ApplicationContext는 ApplicationListener 인터페이스를 구현한 후 이벤트가 발생할 때마다 이를 통지한다.
이벤트 | 설명 |
ContextRefreshedEvent | ApplicationContext가 초기화되거나 갱신 될 때 실행됩니다. |
ContextClosedEvent | ApplicationContext가 닫힐 때 실행됩니다. |
RequestHandledEvent | Spring의 DispatcherServlet을 사용하는 Web 응용 프로그램에 HTTP 요청이있는 경우에 실행됩니다. |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | package com.techscore.spring.di; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationListener; import org.springframework.context.event.ContextClosedEvent; import org.springframework.context.event.ContextRefreshedEvent; public class ContextObserver implements ApplicationListener { public void onApplicationEvent (ApplicationEvent event) { if (event instanceof ContextRefreshedEvent) { System.out.println ( "context is refreshed."); } else if (event instanceof ContextClosedEvent) { System.out.println ( "context is closed."); } } } | cs |
ApplicationListner 인터페이스를 구현하여 onApplicationEvent를 재 정의 하는 경우 ApplicationContext의 상태 편경 시 마다 onApplicationEvent(..) method는 스프링 시작시 호출된다.
여기서 전달되는 ApplicationEvent의 형태에 따라 동작을 정의하여 필요한 동작을 수행할 수 있다.
'web > Spring' 카테고리의 다른 글
Mabatis #, $ 차이점 (0) | 2018.05.27 |
---|---|
Aop 설명과 설정방법 (0) | 2018.05.27 |
Mybatis에서 parameterType을 List로 insert하기 (0) | 2018.05.27 |
Spring 프로젝트에서 src/main/resource 경로에 파일접근 방법 (0) | 2018.05.27 |
외부 properties 파일을 이용해서 스프링 빈을 생성하는 방법 (0) | 2018.05.27 |