bean 소멸 시점에 통지 받기
- DefaultListableBeanFactory 인터페이스를 래핑한 AppliccationContext 구현체를 이용하는 경우ConfigurableBeanFactory.destroySingletons()를 호출하여 모든 싱글턴 인스턴스를 소멸시키도록 통지할 수 있다.
- 소멸 통지를 통해 애플리케이션이 사용중인 모든 리소스를 정리한 후 애플리케이션을 안전하게 종료할 수 있다.
- 소멸 통지 콜백은 메모리의 데이터를 안전하게 저장하고 오래 실행 중인 bean을 종료하는 최적의 장소이다.
- 일반적으로 소멸 콜백은 초기화 콜백과 쌍으로 사용되며 초기화 콜백에서 생성된 리소스를 소멸 콜백에서 반납한다.
Bean이 소멸될 때 메서드를 실행하기
- 구성파일의
태그에 destroy-method 속성을 추가하여 호출될 메서드 이름을 지정한다. - 스프링은 bean의 싱글턴 인스턴스가 소멸하기 직전에 이 메서드를 호출한다.
- 프로토타입 스코프에 있는 소멸 콜백 메서드는 호출하지 않는다.
...
public class DestructiveBean {
private File file;
private String filePath;
public void afterPropertiesSet() throws Exception {
System.out.println("bean을 초기화합니다.");
if (filePath == null) {
throw new IllegalArgumentException(
DestructiveBean.class + "에 filePath 속성을 지정해야 합니다.");
}
this.file = new File(filePath);
this.file.createNewFile();
System.out.println("파일 존재 여부: " + file.exists());
}
public void destroy() {
System.out.println("bean을 소멸합니다.");
if (!file.delete()) {
System.out.println("에러: 파일 삭제에 실패하였습니다.");
}
System.out.println("파일 존재 여부: " + file.exists());
}
public void setFilePath(String filePath) {
this.filePath = filePath;
}
public static void main(String... args) throws Exception {
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext();
ctx.road("classpath:spring/app-context-xml.xml");
ctx.refresh();
DestructiveBean bean = (DestructiveBean) ctx.getBean("destructiveBean");
System.out.println("destroy() 호출 시작");
ctx.destroy();
System.out.println("destroy() 호출 종료");
}
}
...
<beans...>
<bean id="destructiveBean"
class="com....DestructiveBean"
descroy-mathod="destroy"
init-method="afterPropertiesSet"
p:filePath="...text.txt" />
</beans>