Whiteship's Note

Circular dependencies

Spring/Chapter 3 : 2007.03.24 23:54


참조 : Spring Reference 3.3.1.2의 오른쪽 회색 박스

Circular dependencies[각주:1]는 간단하게 교착상태에 비유할 수 있을 것 같습니다.

Constructor Injection을 사용할 때 발생할 수 있는 문제로 예를 들어 A라는 클래스의 인자로 B 클래스 타입의 객체가 필요하고 B 객체를 만들 때 생성자의 인자로 A 타입의 객체가 필요하다면... 대체.. 어떻게 A와 B를 만들 수 있을까요??[footnote]저런 생성자들만 존재한다는 전제 조건이죠.[/footenote]

이런 경우 BeanCurrentlyInCreationException 이 발생한다고 합니다.

해결책은..Setter Injection을 사용하는거죠. 아니면 다른 객체를 인자로 받아들이는 생성자 말고 다른 생성자를 사용해서 생성하는 방법도 있지만 어차피 속성을 세팅하려면 Setter Injection을 써야겠습니다.

코드로 확인해보죠.

<bean id="employee" class="circularReference.Employee">
    <constructor-arg ref="project" />
</bean>

<bean id="project" class="circularReference.Project">
    <constructor-arg ref="employee"/>
</bean>

@Test public void name(){
        ApplicationContext context =
            new ClassPathXmlApplicationContext("circularReference/circuralContext.xml");
        assertNotNull(context.getBean("project"));
    }

BeanCurrentlyInCreationException의 상위 타입인 BeanCreationException으로 나옵니다. 에러 메시지를 좀 더 읽다보면 보입니다.
사용자 삽입 이미지

아래는 에러 메시지의 Trace입니다.

  1. 이전 글에서 모르겠다고 했던 circular reference를 다르게 IoC챕터 답게 표현한듯... [본문으로]

'Spring > Chapter 3' 카테고리의 다른 글

Bean Life Cycle 통째로 테스트  (0) 2007.05.09
BeanFactoryAware 테스트  (0) 2007.05.09
BeanClassLoaderAware 테스트  (0) 2007.05.09
BeanNameAware 테스트  (0) 2007.05.09
3.4.3. The other scopes  (6) 2007.04.29
Circular dependencies  (0) 2007.03.24
연습 문제 풀다가 모르는 것 체크  (0) 2007.03.24
Java Black Belt :: Spring Basic 시험 결과  (0) 2007.03.24
setParentBeanFactory 사용하기  (0) 2007.03.23
ApplicationEvent 사용 예  (2) 2007.03.16
MessageSource 사용 예  (0) 2007.03.15
top

Write a comment.




: 1 : ··· : 17 : 18 : 19 : 20 : 21 : 22 : 23 : 24 : 25 : ··· : 58 :