스프링 컨테이너는 빈 객체의 라이프사이클을 관리한다.
객체 생성 -> 의존 설정 -> 초기화 -> 소멸 단계를 거친다.
스프링 컨테이너를 초기화 활 때 스프링 컨테이너는 가장 먼저 빈 객체를 생성하고 의존 주입을 한다. 의존 자동 주입을 통한 의존 설정이 이 시점에 실행되며, 모든 의존 설정이 완료되면 빈 객체를 초기화하기 위해 스프링은 빈 객체의 지정된 메서드를 호출한다.
스프링 컨테이너가 close() 메서드로 종료될 시점에 컨테이너는 빈 객체의 소멸을 처리한다. 이때에도 지정된 메서드를 호출한다.
지정된 메서드는 다음과 같다.
org.springframework.beans.factory.InitializingBean , org.springframework.beans.factory.DisposableBean
빈 객체가 InitializingBean 인터페이스를 구현하면 스프링 컨테이너는 초기화 과정에서 afterPropertiesSet() 메서드를 실행한다. 초기화 과정이 필요한 경우 해당 인터페이스를 상속받아 메서드를 구현하 된다.
빈 객체가 DisposableBean 인터페이스를 구현한 경우 소멸과정에서 빈 객체의 destory() 메서드를 실행한다.
해당 메서드가 필요한 경우가 바로 데이터베이스 커넥션 풀이다. 커넥션 풀을 위한 객체는 초기화 과정에서 데이터베이스와 연결을 생성하며 사용하는 동안에는 연결을 유지하다 빈 객체를 소멸할 때 연결을 종료해야 한다.
코드는 다음과 같다.
package chap06;
import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;
public class Client implements InitializingBean, DisposableBean{
private String host;
public Client() {
System.out.println("객체 생성");
}
public void setHost(String host) {
this.host = host;
}
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("초기화후 실행");
}
public void send() {
System.out.println("Clinet.send() to " + host);
}
@Override
public void destroy() throws Exception {
System.out.println("객체 소멸");
}
}
package chap06.main;
import org.springframework.context.annotation.AnnotationConfigApplicationContext;
import org.springframework.context.support.AbstractApplicationContext;
import chap06.Client;
import chap06.config.AppCtx;
public class Main {
public static void main(String[] args) {
AbstractApplicationContext ctx = new AnnotationConfigApplicationContext(AppCtx.class);
Client client = ctx.getBean(Client.class);
client.send();
ctx.close();
}
}
콘솔 창에는 다음 순서이다 생성 -> 초기화 후 실행 -> send() 메서드 실행 -> 객체 소멸
이러한 초기화 메서드와 소멸 메서드도 커스텀이 가능한데 설정 파일에서 @Bean 속성을 이용한다.
package chap06.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import chap06.Client;
@Configuration
public class AppCtx {
@Bean(initMethod = "초기화 후 실행될 메서드명", destoryMethod = "소멸과정시 실행될 메서드명")
public Client client() {
Client client = new Client();
client.setHost("host");
return client;
}
}
이 경우 메서드에는 파라미터가 존재한다면 익셉션을 발생시킨다.
'Spring|Spring-boot' 카테고리의 다른 글
Spring Transaction (0) | 2021.04.03 |
---|---|
Spring Security(3) (0) | 2021.03.28 |
[Spring] 의존 자동 주입 대상의 필수 유무설정 (0) | 2021.01.25 |
JWT(2) (0) | 2020.08.18 |
Json Web Tokens(1) (0) | 2020.08.14 |
댓글