디비 커넥션 풀이나, 네트워크 소켓처럼 미리 연결해두고 애플리케이션 종료할때 연결을 모두 종료하는 작업을 진행하려면 객체의 초기화와 종료작업이 필요하다
스프링은 의존 관계 주입이 완료되면 스프링 빈에게 콜백 메서드를 통해서 초기화 시점을 알려주고, 스프링 컨테이너가 종료되기 직전에 소멸 콜백을 줘서 안전하게 초기화 및 종료 작업이 가능하다.
스프링 컨테이너 생성 -> 스프링 빈 생성 -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
생성자는 필수 정보(파라미터)를 받고, 메모리를 할당해서 객체를 생성하는 책임
초기화는 생성된 값을 활용해서 외부 커넥션을 연결하는 등 무거운 동작을 수행한다.
이 둘을 명확하게 나누는 것이 유지보수 관점에서 좋다
인터페이스를 구현하고 함수 두가지 구현하면 됨
단점
스프링 전용 인터페이스이므로 해당 코드가 스프링 전용 인터페이스에 의존하게 된다.
초기화, 소멸 메서드의 이름을 변경할 수가 없다.
내가 코드를 고칠 수 없는 외부 라이브러리에 적용할 수 없다.
메서드 이름을 자유롭게 설정 가능
스프링 빈이 스프링 코드에 의존하지 않는다.
코드가 아니라 설정 정보를 사용하기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있다.
종료 메서드 이름을 close 또는 shutdown으로 해두면 종료 메서드를 자동으로 호출 해준다.
어노테이션 하나만 붙여주면 돼서 편리함
최신 스프링에서 가장 권장하는 방법
패키지도 javax.annotation 으로 스프링이 아닌 다른 컨테이너에서도 동작함
컴포넌트 스캔과 잘 어울림
유일한 단점으로 코드를 고쳐야하기 때문에 외부 라이브러리에는 적용하지 못한다는 것
외부 라이브러리 사용시 @Bean 설정 정보 사용