spring 의존관계
<test-context.xml>
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가 사용가능한 상태가 된다는 것이다.
더 고민하기전에 결과를 보면 다음과 같다.
결국 depends-on 구문은 무시된다.
그럼 depends-on 구문을 지웠을때 어떤 결과가 나올까 ?
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를 제거
참고사항) 빈 후처리가 init-method를 호출 한다. testB init()이 TestA 생성자 보다 먼저 호출 됐네?
아! =_= 후처리는 모든 빈 이후에 수행 하는 것이 아니라 자신의 프로퍼티 등 다 설정한 다음 호출된다는 것이네.
=_=;; 오해 해서 미안해..
빈 라이프 사이클 참고 자료
: http://markan.tistory.com/223
<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
댓글
댓글 쓰기