spring 의존관계

<test-context.xml>


<
bean id="testA" class="springTest.TestA" depends-on="testB" init-method="init" destroy-method="destroy" />

<
bean id="testB" class="springTest.TestB" init-method="init" destroy-method="destroy"> <property name="testA" ref="testA" /> </bean>


depends-on 이 뭐지? 레퍼런스를 봐야지?

———
3.3.4. depends-on 사용하기
대부분의 상황을 위해 bean이 다른 것들의 의존성이라는 사실은 하나의 bean이 다른것의 프라퍼티처럼 셋팅한다는 사실에 의해 간단하게 표현된다. 이것은 XML-기반의 설정 메타데이터내 <ref/>요소를 가지고 수행한다. 이것의 다양한 종류에서 때때로 컨테이너를 인식하는 bean은 간단하게 주어진 의존성(문자열 값이나 문자열 값과 같은것을 평가하는 <idref/>요소의 대안을 사용하여)의 id이다. 첫번째 bean은 이것의 의존성을 위해 컨테이너에 프로그램마다 다른 방식으로 요청한다. 어느 경우에나 의존성은 의존적인 bean이전에 초기화된다.
다소 덜 직접적인(예를 들면, 데이터베이스 드라이버 등록과 같은 클래스내 정적인 초기자가 트리거 될 필요가 있을때) bean들 사이의 의존성이 있는 비교적 드물게 발생하는 상황을 위해 'depends-on'속성은 이 초기화된 요소를 사용하는 bean이전에 초기화되기 위한 하나 이상의 bean을 명시적으로 강제하기 위해 사용된다. 하나의 bean에 의존성을 표시하기 위한 'depends-on' 속성을 사용하는 예제를 아래에서 보라.

이게 무슨 말이지 ?? =_=;;

<bean id="beanOne" class="ExampleBean" depends-on="manager"/>

<bean id="manager" class="ManagerBean" />
다중 bean에 의존성을 표시할 필요가 있다면, 콤마, 공백 그리고 세미콜론과 같은 모든 유효한 구분자를 사용하여 'depends-on'속성의 값으로 bean이름의 구분된 목록을 제공할수 있다. 많은 수의 bean에 의존성을 표시하기 위해 'depends-on'를 사용하는 예제를 아래에서 보라.
<bean id="beanOne" class="ExampleBean" depends-on="manager,accountDao">
  <property name="manager" ref="manager" />
</bean>

<bean id="manager" class="ManagerBean" />
<bean id="accountDao" class="x.y.jdbc.JdbcAccountDao" />

——

depends-on 은 다른 빈에 대한 의존성을 가진다 라는 말인데?

testA는 testB에 의존성을 가진다?

-> 의존성??의존해야하니  testB 빈이 사용 가능 상태 이후  testA 빈을 사용 가능한 상태로 된다는 것 인데 

문제는 testB에 testA가 주입이 되어야만 testB가 사용가능한 상태가 된다는 것이다.

더 고민하기전에 결과를 보면 다음과 같다.

INFO : springTest.TestB - TestB()
INFO : springTest.TestA - TestA()
INFO : springTest.TestA - TestA init()
INFO : springTest.TestB - TestB setTestA()
INFO : springTest.TestB - TestB init()
INFO : springTest.TestA - TestA destroy()
INFO : springTest.TestB - TestB destroy()

결국 depends-on 구문은 무시된다.

그럼 depends-on 구문을 지웠을때 어떤 결과가 나올까 ?


INFO : springTest.TestA - TestA()
INFO : springTest.TestA - TestA init()
INFO : springTest.TestB - TestB()
INFO : springTest.TestB - TestB setTestA()
INFO : springTest.TestB - TestB init()
INFO : springTest.TestB - TestB destroy()
INFO : springTest.TestA - TestA destroy()

testA의 생성자와 testA의 destroy-method 호출 순서가 변경 되었다.

생성자 : testA는 testB에 의존 한다. -> testB가 있어야 의존 가능하다. -> 생성자만 봤을때 depends-on은 제역할을 한 것이다.

destroy-method : testA destroy가 먼저 호출 되었다. 이 역시 testB에 의존하니 
만약 testB destroy가 먼저 동작 했다면 testA의 destroy가 오동작할 가능성이 있다.
여기에서도 depends-on은 제역할을 한 것 같다.

하지만 init-method와 testB.setTestA는 depends-on보다 di가 우선 시 되었다.

결론은 =_=;; 저런 순서를 외우지 못하면 bean의 의존관계를 꼬이게 하는 상황을 안만드는 거겠지.

가장 나이스한 구조? di를 제거


<
bean id=“testA" class="springTest.TestA" depends-on="testB" init-method="init" destroy-method="destroy" />

<
bean id="testB" class="springTest.TestB" init-method="init" destroy-method="destroy" />
INFO : springTest.TestB - TestB()
INFO : springTest.TestB - TestB init()
INFO : springTest.TestA - TestA()
INFO : springTest.TestA - TestA init()
INFO : springTest.TestA - TestA destroy()
INFO : springTest.TestB - TestB destroy()

참고사항) 빈 후처리가 init-method를 호출 한다. testB init()이 TestA 생성자 보다 먼저 호출 됐네?
아! =_= 후처리는 모든 빈 이후에 수행 하는 것이 아니라 자신의 프로퍼티 등 다 설정한 다음 호출된다는 것이네.
=_=;; 오해 해서 미안해..


빈 라이프 사이클 참고 자료 
http://markan.tistory.com/223
 

댓글

이 블로그의 인기 게시물

Spring Batch - JobParameters Default Value 만들기

Hsqldb Server 재기동 시 오류