스프링 컨테이너와 Bean객체의 생명주기
Bean객체를 이용하기 위해선 스프링 컨테이너를 생성해준 뒤 getBean을 통해 객체를 가져오는 과정을 거쳐야한다. 이 때 컨테이너와 Bean이 생성되는 시점과 소멸되는 시점에 특정한 작업을 필요한 경우 생명주기를 알아야한다.
컨테이너 생성 = Bean객체 생성
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:appCtx.xml");
ctx.close();
스프링 컨테이너가 초기화되면 xml상에 작성된 Bean 객체 또한 같이 생성된다. 이후 ctx.close()를 이용해 스프링 컨테이너를 메모리에서 해제하게 되면 생성된 Bean 객체 또한 같이 해제되므로, Bean객체의 생성과 소멸시점은 스프링컨테이너와 동일하다고 할 수 있다.
appCtx.xml
<bean id="bookDao" class="com.brms.book.dao.BookDao" />
<bean id="bookRegisterService" class="com.brms.book.service.BookRegisterService" />
<bean id="bookSearchService" class="com.brms.book.service.BookSearchService" />
스프링 컨테이너상에 명시된 Bean목록이다.
afterPropertiesSet() - 생성시점에 실행할 작업 지정
public class BookRegisterService implements InitializingBean{
@Autowired
private BookDao bookDao;
public BookRegisterService() { }
@Override
public void afterPropertiesSet() throws Exception{
System.out.println("BookRegisterService Create");
}
}
클래스가 InitializingBean을 상속하게되면 반드시 afterPropertiesSet()을 재정의 해야하는데 이 메소드상에 컨테이너 생성 직후 작업할 내용을 입력하면된다.
destroy() - 소멸시점에 실행할 작업 지정
public class BookRegisterService implements DisposableBean{
@Autowired
private BookDao bookDao;
public BookSearchService() { }
@Override
public void destroy() throws Exception{
System.out.println("BookRegisterService Destroy");
}
}
DisposableBean을 상속하게되면 destroy()를 재정의해야한다. InitializingBean와 DisposableBean 모두 상속할 수 있다.
Main.java 실행결과
public class Main {
public static void main(String[] args) {
GenericXmlApplicationContext ctx = new GenericXmlApplicationContext("classpath:appCtx.xml");
ctx.close();
}
}
INFO: Loading XML bean definitions from class path resource [appCtx.xml] 3월 19, 2022 6:23:42 오후 org.springframework.context.support.GenericXmlApplicationContext prepareRefresh Dao Create BookRegisterService Create BookSearchService Create 3월 19, 2022 6:23:42 오후 org.springframework.context.support.GenericXmlApplicationContext doClose BookSearchService destroy BookRegisterService Destroy Dao Destroy |
Dao 및 SearchService Java 파일에도 지정한 뒤 Main을 실행시키면 각 Bean객체마다 지정해준 작업이 언제 실행되는지 알 수 있다.
Bean태그 속성활용
상속을 통해 메소드를 지정할 수도 있지만 컨테이너 상의 bean 태그 속성을 이용할 수도 있다. init-method는 생성시점, destroy-method 속성은 소멸시점에 동작할 작업을 명시해준다.
appCtx.xml 수정
<bean id="bookRegisterService" class="com.brms.book.service.BookRegisterService"
init-method="initMethod" destroy-method="destroyMethod"/>
BookRegisterService.java
public class BookRegisterService {
@Autowired
private BookDao bookDao;
public BookRegisterService() { }
public void initMethod() {
System.out.println("BookRegisterService Create - xml");
}
public void destroyMethod() {
System.out.println("BookRegisterService Destroy - xml");
}
}
컨테이너에 명시된 속성 값과 동일한 이름의 메소드를 작성해준다.
실행결과
INFO: Loading XML bean definitions from class path resource [appCtx.xml] 3월 19, 2022 6:50:24 오후 org.springframework.context.support.GenericXmlApplicationContext prepareRefresh Dao Create BookRegisterService Create - xml BookSearchService Create 3월 19, 2022 6:50:24 오후 org.springframework.context.support.GenericXmlApplicationContext doClose BookSearchService destroy BookRegisterService Destroy - xml Dao Destroy |
실행결과2
INFO: Loading XML bean definitions from class path resource [appCtx.xml] 3월 19, 2022 6:53:24 오후 org.springframework.context.support.GenericXmlApplicationContext prepareRefresh Dao Create BookRegisterService Create - impl BookRegisterService Create - xml BookSearchService Create 3월 19, 2022 6:53:24 오후 org.springframework.context.support.GenericXmlApplicationContext doClose BookSearchService destroy BookRegisterService Destroy - impl BookRegisterService Destroy - xml Dao Destroy |
BookRegisterService.java 코드에 implements와 init-method와 destroy-method를 모두 적용한 뒤 실행해본 결과 implements를 통한 작업이 더 먼저 실행되는걸 확인했다.
출처 : [인프런] 자바 스프링 프레임워크(renew ver.) - 신입 프로그래머를 위한 강좌