티스토리 뷰

반응형

이전 글에서는 컨테이너의 생명주기를 간략하게 정리하였다.
이번 글에는 유사한 예제로 빈의 생명주기를 보겠다.

스프링 빈 생명주기

스프링 빈은 간단하게 아래와 같이 라이프사이클을 가진다.

객체 생성 - 의존관계 주입

스프링 빈의 이벤트 라이프사이클을 자세히 보면 아래와 같다.

스프링 컨테이너 생성 → 스프링 빈 생성→ 의존관계 주입 → 초기화 콜백 → 사용 → 소멸 전 콜백 → 스프링 종료

라이프사이클 콜백 지원을 인터페이스로 한다면, 아래와 같은 시나리오가 된다.

  1. 스프링 컨테이너가 초기화 할 때, 빈 객체를 설정 정보에 따라 생성하고, 의존 관계를 설정한다.
  2. 의존 설정이 완료되면, 빈 객체가 지정한 메소드(afterPropertiesSet())를 호출해 초기화한다.
  3. 컨테이너가 종료될 시 빈 객체가 지정한 메소드(destroy())를 호출해 빈 객체의 소멸을 처리한다.


빈 생명주기 콜백 지원 3가지 방법

  • 인터페이스 (InitializingBean, DisposableBean)
  • @PostConstruct, @PreDestory 애노테이션
  • 설정 정보에 초기화 메소드, 종료 메소드 지정

1. 인터페이스 (InitializingBean, DisposableBean)

InitializingBean, DisposableBean 인터페이스를 상속받아 아래 콜백 메소드를 오버라이딩한다

 // 초기화 인터페이스
 public interface InitializingBean {
     void afterPropertiesSet() throws Exception;
 }
 // 소멸 인터페이스
 public interface DisposableBean {
     void destroy() throws Exception;
 }

예제

인터페이스 구현

import java.util.ArrayList;

import org.springframework.beans.factory.DisposableBean;
import org.springframework.beans.factory.InitializingBean;

//콜백 메서드를 오버라이딩한다
public class Student  implements InitializingBean,DisposableBean {//초기화 인터페이스, 소멸 인터페이스
    private String name;
    private int age;

    public Student() {
        // TODO Auto-generated constructor stub
    }

    public Student(String name, int age) {
        super();
        this.name = name;
        this.age = age;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    @Override
    public void afterPropertiesSet() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("#3에서 생성-Student에서 호출");
    }

    //콜백 메서드 - 자동 인계되는 메서드다.
    @Override
    public void destroy() throws Exception {
        // TODO Auto-generated method stub
        System.out.println("#3에서 close가 호출-Student에서 호출");
    }
}

컨테이너

// 스프링 컨테이너 생성 
GenericXmlApplicationContext ctx=new GenericXmlApplicationContext(); 

// 스프링 컨테이너 설정 
ctx.load("classpath:applicationCTX_ex13.xml"); 
ctx.refresh(); // 의존관계 설정 후 -> refresh할 때 자동 인계 -"콜백"afterPropertiesSet()

// 스프링 컨테이너 사용 Student std1=ctx.getBean("student1",Student.class); 
System.out.println(std1.getName()); 
System.out.println(std1.getAge()); 

// 스프링 컨테이너 종료 
ctx.close(); //close() 자동 인계-"콜백"destroy()

2. @PostConstruct, @PreDestory 애노테이션

위의 인터페이스 방식과 유사하다. 인터페이스를 구현하는 대신 @PostConstruct, @PreDestory 애노테이션 붙여 콜백 메소드를 정의한다.

예제

메소드 구현

import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;

public class OtherStudent {
    private String juso;
    private double height;
    private double weight;

    public OtherStudent() {
        // TODO Auto-generated constructor stub
    }

    ...

    //생성시 호출될 메서드
    @PostConstruct //생성 후 ..post
    public void initMethod(){
        //db 연동 후 데이터 검색 등
        System.out.println("----------------------------------");
        System.out.println("#4. 임의의 메서드-실행-생성후");
        System.out.println(getJuso());
        System.out.println(getHeight());
        System.out.println(getWeight());
        System.out.println("----------------------------------");
    }
    //파괴시 호출될 메서드
    @PreDestroy    // pre-: ~~하기전
    public void destroyMethod(){
        //메모리 소거(close)등을 수행
        System.out.println("#4. 임의의 메서드-소멸시키기 전 ");
    }
}

컨테이너

GenericXmlApplicationContext ctx=new GenericXmlApplicationContext();     
ctx.load("classpath:applicationCTX_ex13.xml");
ctx.refresh(); //설정 파일로 초기화 해라!

OtherStudent otherStudent=ctx.getBean("otherStudent",OtherStudent.class);
//other에서도 소멸시 실행할 메서드를 호출하려면??
otherStudent.destroyMethod();//소멸할 때, 실행할 내용을
                             //갖고 있는 메서드를 "콜백"시키지 말고..
                            //바로 사용하고 싶어서 명시적으로 호출하고 있다.

//ctx가 보유중인 모든 bean을 소멸시켜라
ctx.close();

3. 설정 정보에 초기화 메소드, 종료 메소드 지정

xml 파일에 bean을 정의하면서 속성으로 init-method, destory-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" xmlns:context="http://www.springframework.org/schema/context"
    xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">
    <bean id="student1" class="com.koreait.ex13_bean_life_cycle.Student">
        <constructor-arg value="홍길동" />
        <constructor-arg value="30" />
    </bean>
    <bean id="otherStudent" class="com.koreait.ex13_bean_life_cycle.OtherStudent"
        init-method="initMethod" destroy-method="destroyMethod">
        <constructor-arg value="서울시 강남구 서초동" />
        <constructor-arg value="178.1" />
        <constructor-arg value="68.1" />
    </bean>
</beans>
반응형
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
글 보관함