객체를 전부 생성 -> 의존관계 주입
물론 생성자 주입은 예외적으로 만들때 관계가 같이 들어온다
스프링 컨테이너 생성 -> 스프링 빈 생성(생성자의 경우 이단계에서 의존관계도 주입) -> 의존관계 주입 -> 초기화 콜백 -> 사용 -> 소멸전 콜백 -> 스프링 종료
생성자는 필수정보를 받고 메모리를 할당해서 생성하는 책임을 가진다. 하지만 초기화는 이 값들을 이용해서 외부커넥션을 시도한다.
따라서 이 둘을 분리해야 유지보수 관점에서 좋다.
public class NetworkClient implements InitializingBean, DisposableBean {
//의존관계 주입이 끝나면
@Override
public void afterPropertiesSet() throws Exception {
connect();
call("초기화 연결 메세지");
}
// 모든 빈이 내려가면
@Override
public void destroy() throws Exception {
disconnect();
}
}
이런식으로 인터페이스를 써서 사용하면 된다.
단점
이는 스프링 인터페이스이다. 따라서 좋은 방법이라고는 할 수 없다.
또한 초기화, 소멸 메서드의 이름을 변경할 수 없고, 내가 코드를 고칠 수 없는 인터페이스 적용이다.
따라서 최근에는 쓰지 않는다.
public void init() {
connect();
call("초기화 연결 메세지");
}
public void close() {
disconnect();
}
이런 코드를 만들고,
@Bean(initMethod = "init", destroyMethod = "close")
Bean 어노테이션에 해당 값들을 지정해주면 된다.
destorymethod의 기능
외부 라이브러리의 종료 메서드는 대부분 close 혹은 shutdown이다. 따라서 이 destorymethod는 기본값을 이 두 값으로 설정한다. 따라서 destorymethod를 따로 설정하지 않아도 알아서 닫아버린다.
@PostConstruct @PreDestroy
@PostConstruct
public void init() {
connect();
call("초기화 연결 메세지");
}
@PreDestroy
public void close() {
disconnect();
}
이는 자바가 지원하는 패키지이다. 따라서 다른 컨테이너 환경에서도 사용이 가능하고, 스프링에서도 권장중이다.
코드를 고칠 수 없는 외부 라이브러리의 경우 위에 적힌 방법을 사용하면 된다.