Today I Learned_220808
Spring Framework
Bean Lifecycle Callback
빈 생명주기 콜백 지원 방법
- 인터페이스(InitializingBean, DisposableBean)
- 설정 정보에 초기화, 종료 메소드 지정
- @PostConstruct, @PreDestroy
인터페이스(InitializingBean, DisposableBean)
클래스에 InitializingBean, DisposableBean 인터페이스를 implement하여 사용
- InitializingBean : afterPropertiesSet() 메소드 구현 필요
- DisposableBean : destroy() 메소드 구현 필요
스프링 초창기(2003년)에 나온 방식으로, 아래와 같은 단점들이 있다.
- 스프링 전용 인터페이스이므로 스프링 컨테이너에 의존. 다른 컨테이너 사용할 때는 못 쓴다.
- 초기화, 소멸 메소드 이름이 고정되어 있어 변경 불가능
- 내가 코드를 고치지 못하는 외부 라이브러리(클래스파일 등)에 적용 불가능
설정 정보에 초기화, 종료 메소드 지정
설정 정보(AppConfig, Bean 등록하는 부분)에 아래 문구 추가
@Bean(initMethod = "init", destroyMethod = "close")
- 스프링 빈이 스프링 코드에 의존적이지 않음
- 메소드 이름을 자유롭게 정할 수 있음
- 설정 정보를 사용하기에 코드를 고칠 수 없는 외부 라이브러리에도 사용 가능
- destroyMethod 속성에 추론 기능 존재 -> 해당 속성을 기술하지 않아도 close() 혹은 shutdown() 메소드를 알아서 찾아가서 호출 -> 호출하고 싶지 않으면 destroyMethod=”” 공백 기술
AutoClosable
Java 8 DOC : https://docs.oracle.com/javase/8/docs/api/java/lang/AutoCloseable.html
try-with-resource 에서 주로 사용됨.
해당 인터페이스를 구현했다면 자원 사용 후(try 종료 후) 객체의 close() 메소드를 호출
@PostConstruct, @PreDestroy
- 스프링에서 공식적으로 권장하는 방법. 웬만하면 이 방법 쓰자.
- 자바 표준(javax에 포함)에 해당하여 스프링이 아닌 다른 컨테이너에서도 동작함
- 사용이 편리함
- 외부 라이브러리엔 적용 불가 -> 하려면 설정 정보(@Bean)에 추가하는 방법 사용하자.