프로그래머의 삶 Programmer's Life/SpringFramework

Spinrg 의 생명주기

Oliver's World 2008. 11. 1. 15:42
728x90

1. 컨테이너는 빈의 정의를 알아낸 다음 빈을 인스턴스화 한다.

2. 의존성 주입을 이용해 빈의 정의에 지정된 모든특성에 값을채운다.

3. 빈이 BeanNameAware 인터페이스를 구현한다면 팩토리는 빈의 ID를 setBeanName()에 전달하여 호출한다. (콜백은 일반적인 빈 프로퍼티의 활성화 이후지만 InitializingBean의 afterPropertiesSet이나 사용자지정 init-method같은 콜백을 초기화하기전에 호출될 것이다.)

InitializingBean 의 afterPropertiesSet()는 빈의 모든 특성이 설정된 후에 한번에 호출.

DisposableBean 의 destroy()는 빈이 컨테이너로부터 제거될때

호출

4. 빈이 BeanFactoryAware 인터페이스를 구현한다면 팩토리는 자신의 인스턴스를 setBeanFactory()에 전달하여 호출한다. 즉, org.springframework.beans.factory.BeanFactory 의 인터페이스를 통하거나 이를 상속받은 하위 클래스에 대한 참조를 형변환함으로써 프로그램마다 다르게 생성한 BeanFactory를 변경하는 것이다. 이 기능이 유용할 경우는 이것이 Spring에 코드를 결합하고 IoC스타일을 따르지 않았을때 프로퍼티처럼 빈에 제공되는 협력자가 위치한 곳에 이 기능을 사용함으로서 다르게 생성한 빈팩토리의 변경 또는  제거가 가능하다.

5. 빈과 연관된 하나이상의 BeanPostProcessor가 존재한다면 각각의 모든 postProcessBeforeInitialization()메소드가 호출된다.

BeanPostProcessor - 빈의 인스턴스를 위해 빈팩토리와 함께 후처리자처럼 등록되어 어떠한 초기화 메소드가 호출되기 전과 나중에 빈팩토리로부터 콜백을 얻는다. (ex 메소드 실행전 처리기)

6. 빈과 지정되어 있는 init-method 가 있으면 호출된다.

즉, org.springframework.beans.factory.InitializaingBean 을 구현한 것으로 빈의 필요한 모든 프로퍼티가 빈팩토리에 의해 세팅후 빈에게 초기화작업을 수행하는것을 허용하는 것을 말한다.

하지만 Spring에 코드를 결합하지는 않는다.

7. 빈과 연관되어 있는 하나이상의 BeanPostProcessor가 존재한다면 모든 postProcessAfterInitialization()메소드가 호출된다.


여기까지의 시점에서 빈의 application에 의해 즉시 사용될 수 있는 상태가 되며 필요치 않을때까지 빈 팩토리안에 남아있게 된다.

- 빈 팩토리 제거 방법

1. 빈이 DisposableBean 인터페이스를 구현하고 있다면 destroy()메소드 호출함으로서 제거

2. 커스텀 destroy-method 가 지정되어 있다면 그 메소드가 호출함으로서 제거

- org.springframework.beans.factory.DisposableBean 구현한 것은 빈팩토리가 destroy() 가 포함될때 빈에게 콜백을 얻는것을 허용한다. 빈의 정의는 destroy()메소드 지원을 위하여 제공한다. XmlBeanFactory의 경우 이것은 destroy-method속성을 통해 수행된다.

ex)

<bean id="exampleInitBean" class="examples.ExampleBean" destroy-method="cleanup"/>

public class ExampleBean {
    public void cleanup() {
        // do some destruction work (like closing connection)
    }
}


위의 내용은 아래와 동일

<bean id="exampleInitBean"

            class="examples.AnotherExampleBean"/>

public class AnotherExampleBean implements DisposableBean {
    public void destroy() {
        // do some destruction work
    }
}


 # 주의 사항 - 프로토타입모드로 빈을 배치할때 스프링은 논시글톤프로토타입빈의 완벽한 생명주기를 관리할 수 없다. (클라이언트와 컨테이너에 주어진 것은 더이상 추적하지 않으므로 )

즉, 어떤 생명주기 형상은 클라이언트에 의해 다루어질수 있는 지점을 벗어난다.

728x90