SPRING bean life cycle
SPRING bean life cycle
스프링컨테이너는 빈 객체를 생성하고 프로퍼티를 할당하고 초기화를 수행하고 사용이 끝나면 소멸시키는 과정을 관리하게 된다.
과정은 다음과 같다.
빈 라이프사이클
Bean객체를 생성한 후 Bean Property 설정한 뒤에 BeanNameAware.setBeanName()메서드를 호출하게 되는데
생성된 Bean이 BeanNameAware인터페이스를 구현하고 있을 경우 setBeanName()메서드를 호출하고
ApplicationContextAware인터페이스를 구현하고 있는 경우 setApplicationContext()메서드를 호출한다.
위 그림의 전체적인 흐름을 보게되면 [객체생성/프로퍼티설정 -> 초기화 -> 사용 -> 소멸] 단계를 거치게 된다.
빈의 초기화와 소멸 방법은 각각 세 가지가 존재한다. 각 방식이 쌍을 이루어 사용된다.
1.
InitializingBean인터페이스와 DisposableBean인터페이스
public interface InitializingBean { void afterPropertiesSet() throws Exception; } public interface DisposableBean { void destroy() throws Exception; }
스프링 컨테이너는 생성한 빈 객체가 InitializingBean 인터페이스를 구현하고 있으면 InitializingBean인터페이스로 정의되어 있는 afterPropertiesSet()메서드를 호출한다. 따라서 스프링 빈 객체가 정상적으로 동작하기 위해 객체 생성 이외의 추가적인 초기화 과정이 필요하다면 InitializingBean인터페이스를 상속받고 afterPropertiesSet()메서에서 초기화 작업을 수행하면 된다.
스프링 컨테이너가 종료될 때 빈 객체가 알맞은 처리가 필요하다면 DisposableBean인터페이스를 상속받고 destroy()메서드를 override해서 재정의 해주면 된다.
public class SimpleExample implements InitilizingBean, DisposableBean { @Override public void afterPropertiesSet() throws Exception { /* 초기화 과정에서 새롭게 설정을 해줘야 한다면 override를 해주어 재정의한다. */ } @Override public void destroy() throws Exception { /* 소멸 단계에 무언가 새롭게 설정해주어야 한다면 override를 해주어 재정의한다. */ } /* * * 중략 * */ }
2. @PostConstruct어노테이션과 @PreDestroy어노테이션
InitializingBean, DisposableBean인터페이스를 구현하는 것 말고도 @PostConstrucotr, @PreDestroy 어노테이션을 사용할 수 있는데 각각 초기화와 소멸단계에 실행할 메서드에 적용해주면 된다.
import javax.annotation.PostConstructor import javax.annotation.PreDestroy public class ConnPool { @PostConstruct public void initPool() { /* Initalize the connection pool */ } @PreDestroy public void destroyPool() { /* destroy the connection pool */ } }
※주의※
@PostConstruct, @PreDestroy어노테이션은 JSR250에 정의되어 있기 때문에 CommonAnnotationBeanPostProcessor전처리기를 스프링 빈으로 등록해주어야 한다.
태그를 사용하면 CommonAnnotationBeanPostProcessor가 빈으로 등록된다.
3. 커스텀 init메서드와 커스텀 destroy메서드
외부 라이브러리의 클래스를 이용하여 init()메서드와 destroy()메서드를 정의할 수 있다.
XML설정을 사용한다면 init-method속성과 destroy-method속성을 사용해서 초기화 및 소멸과정에 사용할 메서드의 이름을 지정하면 된다.
자바 기반 설정을 사용한다면 @Bean어노테이션의 initMethod속성과 destroyMethod속성을 사용하면 된다.
@Bean(initMethod="init", destroymethod="destroy") public SimpleExample simpleExample() { return new simpleExample(); }
==========================================================
1. InitializingBean인터페이스와 DisposableBean인터페이스
예제.
[SimpleExample.class]
package com.spring.example; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.InitializingBean; public class SimpleExample implements InitializingBean, DisposableBean { @Override public void destroy() throws Exception { System.out.println("Disposable인터페이스의 destroy를 override하여 재정의한다."); } @Override public void afterPropertiesSet() throws Exception { System.out.println("InitializingBean인터페이스의 afterPropertiesSet을 override하여 재정의한다."); } }
[MainExample.class]
package com.spring.example; import org.springframework.context.support.GenericXmlApplicationContext; public class MainExample { public static void main(String[] args) { GenericXmlApplicationContext context = new GenericXmlApplicationContext(); context.refresh(); context.load("classpath:META-INF/spring/root-context.xml"); SimpleExample se = context.getBean("simpleBean", SimpleExample.class); context.close(); } }
[root-context.xml]
==========================================================
2. @PostConstruct어노테이션과 @PreDestroy어노테이션 예제
[SimpleExample.class]
package com.spring.example; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class SimpleExample { @PostConstruct public void init() throws Exception { System.out.println("BEAN INFO : init()메소드 호출"); } @PreDestroy public void destroy() throws Exception { System.out.println("BEAN INFO : destroy()메서드 호출"); } }
[root-context.xml]
==========================================================
3. 커스텀 init메서드와 커스텀 destroy메서드 예제
[SimpleExample.class]
package com.spring.example; import javax.annotation.PostConstruct; import javax.annotation.PreDestroy; public class SimpleExample { @PostConstruct public void init() throws Exception { System.out.println("BEAN INFO : init()메소드 호출, 객체생성 및 초기화"); } @PreDestroy public void destroy() throws Exception { System.out.println("BEAN INFO : destroy()메서드 호출, 객체 소멸"); } }
[root-context.xml]
from http://jaebworld.tistory.com/32 by ccl(A) rewrite - 2020-03-25 18:54:23
댓글
댓글 쓰기