반응형

Spring - Bean Life Cycle


(원문 위치 : http://www.tutorialspoint.com/spring/spring_bean_life_cycle.htm )

Spring bean의  life-cycle은 이해하기 쉽다. Bean이 초기화되어질 때, 사용가능한 상태로 되기 위한 초기화작업의 수행이 요구된다. 유사하게, bean이 더이상 필요하지않고 container로부터 제거될 때, 정리(cleanup)가 필요하다.

Bean 생성(Instantiation)과 소멸(Destruction)시간 사이에 숨은 동작(activity)목록이 있지만, 여기서는 생성과 소멸시 필요한 두가지 중요한 bean life-cycle callback 함수에 관해서만 다룬다.

Bean에 대한 설정(setup)과 분해(teardown_를 정의하려면 간단하게 'init-method' 그리고/또는 'destroy-method' 인자를 갖는 <bean>을 선언하면 된다. 'init-method' 속성은 생성(Instantiation) 즉시 bean에서 호출되어지는 함수를 명시한다. 유사하게 'destroy-method'는 container로부터 bean이 제거되지 바로전에 호출되는 함수를 명시한다.

Initialization callbacks:

org.springframework.beans.factory.InitalizingBean interface튼 하나의 하나의 함수를 명시한다.

void afterPropertiesSet() throws Exception;
따라서 간단하게 위 interface를 구현할 수 있고 초기화 작업은 아래와 같이 'afterPropertiesSet()' 함수 내부에서 할 수 있다. (아래 예제가 InitializingBean interface를 상속받았다는 것을 주의하자.)
public class ExampleBean implements InitializingBean {
   public void afterPropertiesSet() {
      // do some initialization work
   }
}
XML기반 설정 metadata의 경우, 인자가 없고(non-argument signature) 리턴타입이 void인 함수로  'init-method'속성을 이용할 수 있다.
예를 들면
<bean id="exampleBean" 
         class="examples.ExampleBean" init-method="init"/>
관련된 class정의의 아래와 같다.
public class ExampleBean {
   public void init() {
      // do some initialization work
   }
}

Destruction callbacks

org.springframework.beans.factory.DisposableBean interface는 하나의 함수를 명시한다.
void destroy() throws Exception;
따라서 간단하게 위 interface를 구현할 수 있고 아래와 같이 종료작업이 destroy() 함수 내부에서 되도록 할 ㅜㅅ 있다. (아래 예제가 DisposableBean interface를 상속받았다는 것에 주의하자.)
public class ExampleBean implements DisposableBean {
   public void destroy() {
      // do some destruction work
   }
}
XML 기반 설정 metadata의 경우, 인자가 없고(non-argument signature) void를 반환하는 함수로 'destroy-method'속성을 이용할 수 있다.
예를 들면
<bean id="exampleBean"
         class="examples.ExampleBean" destroy-method="destroy"/>
관련된 class정의는 아래와 같다.
public class ExampleBean {
   public void destroy() {
      // do some destruction work
   }
}
웹이 아닌 환경에서 Spring IoC를 사용한다면, 예를 들면 rich client desktop 환경에서, JVM으로 shutdown hook을 등록한다. 이렇게 하는 것은 우아한(graceful) shutdown을 확실하게 하고 모든 리소스가 해제되도록 singleton bean의 관련 destroy method를 호출한다.

Example:

[003] HelloWorld Example을 참고하여 프로젝트를 생성한다.
    - package : com.tutorialspoint
    - project : 005.SpringExample

HelloWorld.java: init/destroy method가 추가됨.

package com.tutorialspoint;

public class HelloWorld {
   private String message;

   public void setMessage(String message){
      this.message  = message;
   }
   public void getMessage(){
      System.out.println("Your Message : " + message);
   }
   public void init(){
      System.out.println("Bean is going through init.");
   }
   public void destroy(){
      System.out.println("Bean will destroy now.");
   }
}

MainApp.java: IoC container 생성을 위해 ApplicationContext가 아닌 AbstractApplicationContext가 사용됨. 이는 registerShutdownHook()을 등록하기 위함.

package com.tutorialspoint;

import org.springframework.context.support.AbstractApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;

public class MainApp {
   public static void main(String[] args) {

      AbstractApplicationContext context = new ClassPathXmlApplicationContext("Beans.xml");

      HelloWorld obj = (HelloWorld) context.getBean("helloWorld");
      obj.getMessage();
      context.registerShutdownHook();
   }
}

Beans.xml: init-method/destroy-method 속성이 추가됨.

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

   <bean id="helloWorld" 
       class="com.tutorialspoint.HelloWorld"
       init-method="init" destroy-method="destroy">
       <property name="message" value="Hello World!"/>
   </bean>

</beans>

결과는 아래와 같다. main에서 별도의 호출없이 init/destroy함수가 실행되고 있음을 알 수 있다.

Bean is going through init.
Your Message : Hello World!
Bean will destroy now.

Default initialization and destroy methods:

만약 동일한 이름으로 생성 그리고/또는 소멸 함수를 갖는 bean이 많다면, 각각의 bean에 init-method/destroy-method를 선언할 필요가 없다. Spring framework는 이런 상황에 <beans> element에 default-init-method와 default-destroy-method 속성을 사용하여 유연한 설정을 제공한다.

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xsi:schemaLocation="http://www.springframework.org/schema/beans
    http://www.springframework.org/schema/beans/spring-beans-3.0.xsd"
    default-init-method="init" 
    default-destroy-method="destroy">

   <bean id="..." class="...">
       <!-- collaborators and configuration for this bean go here -->
   </bean>

</beans>


반응형

+ Recent posts