본문 바로가기

Java/Spring

[Bean] init-method, lazy-init, destroy는 무엇일까?


Spring Framework를 사용하면 Bean을 등록하여 객체를 사용하게된다.

일반적인 경우에는 Tomcat 혹은 프로젝트가 시작할 때 Bean 등록이 시작되고 초기화되는 경우가 많을 겁니다.

항상 개발을 하다보면 뭔가 커스텀하게 추가 작업을 진행한다던지? 끝날때 뭘한다던지 하고 싶은 일들이 생기기 마련이죠.

이럴때 Bean의 옵션으로 초기화 시점이나 Bean이 제거될 때 하고 싶은 기능을 명시할 수 있습니다.



init-method 옵션



1번 : XML 설정



<bean id="sampleTaky" class="com.taky.sample.service.SampleTaky" init-method="init">

public void init() {
    model = fooService.getModel();
}


2번 : Java 설정 (Spring 2.5이상 가능)



@PostConstruct
public void init() {
    model = fooService.getModel();
}

- 기능 : Bean이 생성된 후 콜백으로 호출되는 메서드를 선언합니다.

lazy-init 옵션



XML 설정



<bean id="sampleTaky" class="com.taky.sample.service.SampleTaky" lazy-init="true">
- 값은 true/false (디폴트 : false)
- 기능 : Bean을 최초로 호출할 때 초기화합니다. 최초 호출 시점에 따라 초기화 시점이 다름

하위 Bean들 전체에 lazy-init을 하고 싶다면?



<beans default-lazy-init="true">
 
</beans>
- 상위에 옵션을 줄 수 있습니다.

destroy-method 옵션



1번 : XML 설정



<bean id="sampleTaky" class="com.taky.sample.service.SampleTaky" init-method="init" destroy-method="destory">

public void destroy() {
    logger.debug("#### 객체 파괴");
}


2번 : Java 설정 (Spring 2.5이상 가능)



@PreDestroy
public void destroy() {
    logger.debug("#### 객체 파괴");
}

참고
1. PreDestroy, PostConstruct 어노테이션은 Spring 2.5 버전이상부터 사용 가능합니다.
As of version 2.5, the Spring Framework corenow provides support for the following JSR-250 annotations:
@Resource
@PostConstruct
@PreDestroy

2. bean의 preDestroy, destory bean xml 설정의 호출은 
ServletContextListener의 contextDestroyed보다 이후에 수행됩니다!