Bean은 스프링 컨테이너가 관리하는 객체입니다.
따라서 Bean도 스프링 컨테이너가 생성되고 종료됨에 따라 생명주기를 가집니다.
간략하게 예를 들면
스프링 컨테이너가 생성됨
인스턴스 생성 요청이 옴
1. 빈 인스턴스화
2. 의존관계 주입
스프링 컨테이너 닫힘
이런 생명주기를 가지는데요.
만약 클라이언트의 요청 이전에 데이터 베이스 연결을 해야한다거나(초기화),
컨테이너가 닫히기 전에 안전하게 종료하고싶으면 어떻게 해야할까요
그래서 오늘은 스프링 프레임워크에서 위 방법을 어떻게 해결해줬는지 정리해보겠습니다.
스프링은 이렇게 두가지를 제공합니다.
그럼 빈의 생명주기를 다음과 같이 나타낼수 있습니다.
public class bean implements InitializingBean, DisposableBean {
@Override
public void afterPropertiesSet() throws Exception {
System.out.println("초기화 작업");
}
@Override
public void destroy() throws Exception {
System.out.println("종료 전 작업");
}
}
스프링이 제공하는 InitializingBean, DisposableBean 를 구현함으로써 초기화와 종료작업을 하는 작업 하지만 이 방식은 스프링 인터페이스를 그대로 노출하고 스프링과 강결합 되기때문에 권장하지않습니다.
빈 설정정보를 만들면서 Bean메소드의 initMethod와 destroyMethod 엘리멘트에 메소드를 지정해줄 수 있습니다.
@Bean(initMethod = "init", destroyMethod = "close")
public BeanA beanA(){
BeanA beanA = new BeanA();
return beanA;
}
public class BeanA {
void init(){
System.out.println("초기화");
}
void close() {
System.out.println("종료");
}
}
초기화나 종료전 메소드에 위 애노테이션을 지정해줍니다.
public class BeanA {
@PostConstruct
void init(){
System.out.println("초기화");
}
@PreDestroy
void close() {
System.out.println("종료");
}
}
굉장히 직관적이고, 자바 표준 공통애노테이션입니다, 하지만 외부 라이브러리에는 적용하지 못합니다. -> 코드를 수정할수가 없기 때문에