스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 빈 사용 -> 소멸 전 콜백 -> 스프링 종료
초기화 콜백 : 빈이 생성되고, 의존관계까지 모두 주입됐을 때 실행
소멸 전 콜백 : 빈이 소멸되기 직전에 호출
InitializingBean 인터페이스를 Implements 하면 추상메서드인 afterPropertiesSet()를 상속받을 수 있고, 여기에 빈 초기화시 동작할 로직을 작성하면 된다.
DisposableBean 인터페이스를 Implements 하면 추상 메서드인 destroy()를 상속받을 수 있고, 여기에 빈 소멸 전에 동작할 로직을 작성하면 된다.
이러한 치명적인 단점들로 인해 인터페이스 방식은 잘 사용하지 않는다. (2003년에 나온 기능이라 그런지 더 구리네)
@Bean(initMethod="initMethodName", destroyMethod="asdf")
식으로 @Bean에 초기화와 소멸 메서드를 지정해 줄 수 있다. 이렇게 하면 해당 스프링 빈 객체 내부에 있는 메서드를 호출하게 되므로 당연히 객체 내부엔 위와 같은 이름의 메서드를 가지고 있어야 한다.
@Bean의 destroyMethod() 기능에는 아주 특별한 기능이 있다. 외부 라이브러리의 경우 대부분 종료하는 메서드의 이름은 close(), shutdown() 의 이름을 가지게 되는데 @Bean의 destroyMethod()의 기본값은 inferred(추론)로 지정되어 있다. 이 추론 기능은 외부 라이브러리에 위와 같은 종료 메서드를 추론하여 찾아 실행시킨다. 따라서 외부 라이브러리를 스프링 빈으로 등록 시 따로 종료 메서드를 적어주지 않아도 정상 동작한다.
만약, 추론 기능을 사용하기 싫으면 destroyMethod="" 로 공백을 넘겨주면 된다.
이 방법도 쓰긴 하지만 마지막 방법이 굉장히 유용하게 사용된다.
초기화 및 소멸 시 실행할 로직 메서드 위에 @PostConstruct나 @PreDestroy를 적어주면 된다.