Spring - 초기화 및 빈의 생명주기 관리

2010. 8. 15. 18:51plming/Java - Spring

- BeanFactory 와 ApplicationContext
  기본적인 빈의 생성, 초기화, 빈에 대한 접근과 같은 기능을 제공하는 인터페이스는 BeanFactory.
  ApplicationContext는 BeanFactory의 하위 인터페이스로서 BeanFactory가 가지고 있는 기능 외에 추가적인 기능을 지원하고 있는 것.

- ApplicationContext가 추가적으로 지원하는 기능
1. MessageSource를 지원하여 애플리케이션에서 필요한 메시지들을 관리하는 것이 가능하다.
2. Spring 프레임워크에서 관리하는 POJO 빈들 중 ApplicationListener를 구현하여 설정파일에 등록할 경우 등록된 리스너에게 이벤트를 전달하는 것이 가능하다.  즉, ApplicationContext를 이용할 경우 애플리케이션내에 간단한 이벤트 기능을 구현하는 것이 가능하다.
3. 애플리케이션내에서는 파일, URL과 같은 다양한 자원(Resource)에 접근할 필요가 있다. ResourceLoader를 지원함으로 다양한 하위레벨의 자원을 Spring 프레임워크의 Resource 인스턴스로 생성하는 것이 가능하다.

※ ApplicationContext를 직접 사용하는 방법을 알아둘 경우 테스트 프로그램을 작성할 때 유용하게 사용할 수 있다.


- Spring 프레임워크에서 빈의 생명주기
 1. 빈 설정 파일 정보 초기화  1.디폴트 생성자 Invoke
 2. POJO 빈 초기화 상태  2. 빈의 의존관계 여부 체크
 3. setXXX() 메소드 호출
 4. setBeanName() 메소드 호출
 5. setBeanFactory() 메소드 호출
 6. setApplicationContext 메소드 호출
 7. afterProperties() 메소드 호출
 8. 빈 설정 파일의 init-method 호출
 3. POJO 빈 준비 상태  빈에 대한 초기화가 완료되고
 서비스 가능한 준비 상태
 4. POJO 빈 소멸 상태  9. destory() 메소드 호출
 10.빈 설정 파일의 destory-method 호출

- 초기화 과정
1. Spring 프레임워크는 먼저 빈 설정파일의 POJO 빈을 인스턴스화하지 않은 상태로 빈 설정 파일 정보를 초기화한다. 빈 설정파일의 정보를 초기화하면서 XML DTD에 대하여 유효한지를 체크한다.
2. 빈 인스턴스를 생성하면서 의존관계에 있는 빈이 존재하는지의 여부를 체크하여 의존관계에 있는 빈이 존재하지 않는다면 빈의 초기화가 실패한다.
3. 의존관계에 있는 빈의 체크가 완료되면 setter 메써드를 호출하거나(Setter Injection의 경우), 생성자의 인자(Constructor Injection의 경우)로 실질적인 값을 추가하거나 다른 빈에 대한 레퍼런스(reference)를 전달한다.
4. 생성한 빈이 BeanNameAware 인스턴스이면 setBeanName() 메써드를 호출한다.
5. 생성한 빈이 BeanFactoryAware 인스턴스이면 setBeanFactory() 메써드를 호출한다.
6. 생성한 빈이 ApplicationContextAware 인스턴스이면 setApplicationContext() 메써드를 호출한다. 이 과정은 ApplicationContext를 이용하여 초기할 때만 실행된다.
7. 생성한 빈이 InitializingBean 인스턴스이면 afterProperties() 메써드를 호출한다.
8. 생성한 빈의 설정파일에 init-method가 설정되어 있다면 init-method에 해당하는 메써드를 호출한다.

- 종료 메소드를 호출하는 과정
1. 생성한 빈이 DisposableBean 인스턴스이면 destory() 메써드를 호출한다.
2. 생성한 빈의 설정파일에 destroy-method가 설정되어 있다면 destroy-method에 해당하는 메써드를 호출한다.


- POJO 빈에서 빈 설정 정보에 접근하기
   POJO 빈에서 BeanNameAware, BeanFactoryAware, ApplicationContextAware 인터페이스 중 필요한 인터페이스를 상속하고 인터페이스의 메소드를 구현하기만 하면 된다.


- 빈의 생명주기 제어하기
1. 빈의 초기화 과정을 지원하는 두 가지 방법

 UserServiceImpl.java - InitializingBean을 이용한 초기화

 public class UserServiceImpl implements UserService, InitializingBean {

     public void afterPropertiesSet() throws Exception {


 UserServiceImpl.java - 설정파일의 init-method를 이용하여 초기화

 public class UserServiceImpl implements UserService {

     public void init() throws Exception {


 applicationContext.xml - userService 빈에 init-method 추가

    <bean id="userService" class="net.javajigi.user.service.UserServiceImpl"
        init-method="init">


2. 소멸 과정 또한 초기화 과정과 똑같이 두 가지 방식으로 지원

 applicationContext.xml - dataSource 빈에 destroy-method 추가

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource"
        destroy-method="close">



- Singleton 빈과 Non Singleton 빈의 관리 방식
  Spring 프레임워크 기반 하에서 관리되는 POJO 빈은 디폴트로 Singleton 방식으로 관리된다.
  Non Singleton 방식으로 인스턴스를 생성하고자 한다면, "singleton" 속성을 false로 설정해주면 된다.

  <bean id="userDAO" class="net.javajigi.user.dao.MySQLUserDAO" singleton="false" />

  Singleton 인스턴스로 관리되는 모든 POJO빈은 ApplicationContext내에 있는 HashMap에 키=값(key=value) 쌍으로 저장되었다가 getBean() 메써드를 통하여 빈에 접근하고자 할 때 HashpMap에서 빈 인스턴스를 얻게 되는 것이다.  Spring 프레임워크는 HashMap을 이용하여 모든 Singleton인스턴스를 관리하기 때문에 Singleton인스턴스로 관리하기위하여 굳이 Singleton 디자인 패턴을 이용할 필요가 없다. 그러므로 Singleton 디자인 패턴을 이용할 경우 발생하게 되는 문제점을 해결하는 것이 가능하다.

  애플리케이션 전체에서 사용할 전역변수를 관리하기 위하여 ServletContext(JSP에서는 application이 ServletContext의 변수 예약어이다.)를 이용하는 것이 일반적이다.  ServletContext에 저장되어있는 ApplicationContext는 org.springframework.web.context.support.WebApplicationContextUtils을 이용하여 접근하게 되는 것이다.


[출처] http://www.javajigi.net/pages/viewpage.action?pageId=2621452
[출처] Spring 프레임워크 워크북

'plming > Java - Spring' 카테고리의 다른 글

Spring - 테스트 전략  (0) 2010.08.17
ANT 사용 시 한글 Properties 파일처리  (0) 2010.08.17
Spring - Log4J 설정  (0) 2010.08.15
Spring IoC - DI (Dependency Injection)  (0) 2010.08.15
Spring IoC - DL (Dependency Lookup)  (0) 2010.08.15