스프링에서 빈 생명주기 콜백을 지원하는 방법은 3가지가 있다.
1. 인터페이스(InitializingBean, DisposableBean)
public class NetworkClient implements InitializingBean, DisposableBean {
private String url;
public NetworkClient() {
...
}
// 서비스 시작시 호출
public void connect() {
...
}
public void call() {
...
}
// 서비스 종료시 호출
public void disconnect() {
...
}
@Override // 의존성 주입 이후에 실행 (InitializingBean)
public void afterPropertiesSet() throws Exception {
connect();
call();
}
@Override // 빈 소멸 전 호출 (DisposableBean)
public void destroy() throws Exception {
disconnect();
}
}
관련 로직은 직접 구현해야 한다
-> 요즘은 별로 사용하지 않는 방식이다.
2. 설정 정보에 초기화 메서드, 종료 메서드 지정
public class NetworkClient {
private String url;
public NetworkClient() {
...
}
// 서비스 시작시 호출
public void connect() {
...
}
public void call() {
...
}
// 서비스 종료시 호출
public void disconnect() {
...
}
public void init() {
connect();
call();
}
public void close() {
disconnect();
}
}
.
.
.
@Configuration
static class LifeCycleConfig {
// networkClient.init(), networkClient.close() 를 초기화, 소멸자 메서드로 사용한다
@Bean(initMethod = "init", destroyMethod = "close")
public NetworkClient networkClient() {
NetworkClient networkClient = new NetworkClient();
return networkClient;
}
}
@Bean() 에서 속성을 줄 수 있다.
@Component에 적용시키니까 컴파일 에러가 발생한다. 아마 자동 등록에서는 쓸 수 없는 방식인 듯?
코드에 직접적으로 변화를 주는 것이 아니라 설정 정보(@Configuration)를 사용하는 것이기 때문에 코드를 고칠 수 없는 외부 라이브러리에도 초기화, 종료 메서드를 적용할 수 있게 된다.
3. @PostConstruct, @PreDestory (이걸 쓰면 된다)
public class NetworkClient {
private String url;
public NetworkClient() {
...
}
// 서비스 시작시 호출
public void connect() {
...
}
public void call() {
...
}
// 서비스 종료시 호출
public void disconnect() {
...
}
@PostConstruct
public void init() {
connect();
call();
}
@PreDestroy
public void close() {
disconnect();
}
}
해당 메서드들에 직접적으로 어노테이션을 달아주면 된다.
(클래스에 직접 적용된 코드이니 당연히 @Componenet를 써도 잘 돌아간다)
스프링에서 직접 권장하는 방식이므로 그냥 이걸 사용하자.
코드를 직접적으로 추가해야 하기 때문에 외부 라이브러리에는 적용이 불가능하다. 외부 라이브러리에 대해서는 2번 방식(@Bean(initMethod = "init", destroyMethod = "close"))을 사용해야 한다.
'김영한님 스프링 강의 정리 > 핵심원리 기본편' 카테고리의 다른 글
Request 객체와 Proxy (0) | 2021.01.16 |
---|---|
빈 스코프 @Scope, ObjectProvider<T> (0) | 2021.01.16 |
조회한 빈이 두 개 이상일 때? 필드명, @Qualifier, @Primary (0) | 2021.01.11 |
Lombok 라이브러리를 사용한 생성자 주입 (0) | 2021.01.11 |
의존성 주입 @Autowired, 옵션 처리 설정 (0) | 2021.01.11 |