스프링 3.1에서 소개된 c-namespace는 p-namespace와 유사하게 'constructor-arg' 요소 없이, 인라인 속성으로 생성자 매개변수를 설정할 수 있게 해준다.
다음 예시는 'c:' namespace를 사용하여 생성자 기반의 의존성 주입과 같은 일을 하는 것을 보여준다.
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:c="http://www.springframework.org/schema/c"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="beanTwo" class="x.y.ThingTwo" />
<bean id="beanThree" class="x.y.ThingThree" />
<!-- 선택적 인자 이름들을 통한 전통적인 선언 -->
<bean id="beanOne" class="x.y.ThingOne">
<constructor-arg name="thingTwo" ref="beanTwo" />
<constructor-arg name="thingThree" ref="beanThree" />
<constructor-arg name="email" value="something@somewhere.com" />
</bean>
<!-- c-namespace를 이용한 인자 이름 선언 -->
<bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
c:thingThree-ref="beanThree" c:email="something@somewhere.com" />
</beans>
'c:' namespace는 '-ref'에서 bean들의 이름을 활용해 생성자 매개변수를 세팅한다는 점에서 'p:'와 같은 방식으로 사용된다. 또한 비슷하게도, XSD 스키마에는 정의가 되어 있지 않지만 XML 파일 안에서 선언되어야 한다(c-namespace도 스프링 코어에 존재한다).
드물게 생성자 매개변수의 이름을 사용할 수 없을 때(보통 디버깅 정보 없이 바이트 코드가 컴파일될 때)에는, 다음 예시처럼 인자에 인덱스를 사용하면 된다.
<!-- c-namespace의 인덱스 선언 -->
<bean id="beanOne" class="x.y.ThingOne"
c:_0-ref="beanTwo"
c:_1-ref="beanThree"
c:_2="something@somewhere.com" />
※ XML 문법 때문에 인덱스 표시에는 선행하는 '_'가 필요하다. 비록 몇몇 IDE에서 허용해주긴 하지만 XML 속성의 이름은 숫자로 시작할 수 없기 때문이다. 동일한 인덱스 표시가 <constructor-arg>에도 사용될 수 있으나 보통 잘 사용하지는 않는다. 선언의 순서만으로도 충분하기 때문이다.
실제로, 생성자 작업 메커니즘은 인자를 매칭해 주는 데에 매우 효율적이다. 따라서 웬만하면 설정 전반에 걸쳐 이름 표기를 사용하는 것을 권장한다.
'SpringFramework Core - I. IoC 컨테이너 > 4. 의존성' 카테고리의 다른 글
4.3. depends-on 사용하기 (0) | 2020.03.18 |
---|---|
4.2.12. 복합적인 Property 이름들 (0) | 2020.03.17 |
4.2.10. p-namespace를 이용한 XML Shortcut (0) | 2020.03.17 |
4.2.9. Null과 Empty인 문자열 값들 (0) | 2020.03.17 |
4.2.8. 엄격한 타입의 collection (0) | 2020.03.17 |