본문 바로가기

SpringFramework Core - I. IoC 컨테이너/4. 의존성

4.4. Lazy-initialized Beans

원문: https://docs.spring.io/spring-framework/docs/current/spring-framework-reference/core.html#beans-factory-lazy-init

 

 

기본적으로, ApplicationContext 구현체들은 초기화 과정 중에 싱글턴 bean들을 열심히 만들어낸다. 일반적으로 이런 사전 인스턴스화는 바람직하다. 설정이나 환경적인 에러들이 즉시 발견되기 때문이다. 하지만 이런 활동이 바람직하지 않은 경우에는 bean을 lazy-initialized라고 표시하여 사전 인스턴스화를 막을 수 있다. lazy-initialized bean은 IoC 컨테이너에게 startup될 때가 아니라 요청 받았을때 자신을 만들게끔 한다. 

 

XML에서 이 행동은 <bean/>요소의 'lazy-init' 속성을 통해 제어된다. 다음 예시를 참고하라.

<bean id="lazy" class="com.something.ExpensiveToCreateBean" lazy-init="true" />
<bean name="not.lazy" class="com.something.AnotherBean" />

 위 설정은 ApplicationContext가 사용한다. ApplicationContext가 시작할 때, 'not.lazy' bean은 사전 인스턴스화 되지만 'lazy' bean은 사전 인스턴스화되지 않는다.

 

그러나 lazy-initialized bean이 lazy-initialized가 아닌 싱글턴 bean의 의존성이라면, ApplicationContext는 lazy-initialized bean을 시작할 때 만들어버린다. 왜냐하면 싱글턴의 의존성을 만족시켜줘야 하기 때문이다. lazy-initialized bean은 lazy-initialized하지 않은 싱글턴 bean들에게 주입된다.

 

<bean/> 요소의 'default-lazy-init' 속성을 사용하면 컨테이너 레벨에서도 lazy-initialization을 제어할 수 있다. 다음 예시를 참고하라.

<beans default-lazy-init="true">
    <!-- 어떤 bean도 사전 인스턴스화되지 않는다 -->
</beans>