@ -927,14 +927,14 @@ element.
@@ -927,14 +927,14 @@ element.
[subs="verbatim,quotes"]
----
<beans>
<bean id="thing One" class="x.y.ThingOne">
<constructor-arg ref="thing Two"/>
<constructor-arg ref="thing Three"/>
<bean id="bean One" class="x.y.ThingOne">
<constructor-arg ref="bean Two"/>
<constructor-arg ref="bean Three"/>
</bean>
<bean id="thing Two" class="x.y.ThingTwo"/>
<bean id="bean Two" class="x.y.ThingTwo"/>
<bean id="thing Three" class="x.y.ThingThree"/>
<bean id="bean Three" class="x.y.ThingThree"/>
</beans>
----
====
@ -1937,27 +1937,28 @@ The following example uses the `c:` namespace to do the same thing as the from
@@ -1937,27 +1937,28 @@ The following example uses the `c:` namespace to do the same thing as the from
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd">
<bean id="thingOne " class="x.y.ThingTwo"/>
<bean id="thingTwo " class="x.y.ThingThree"/>
<bean id="beanTwo " class="x.y.ThingTwo"/>
<bean id="beanThree " class="x.y.ThingThree"/>
<!-- traditional declaration -->
<bean id="thing One" class="x.y.ThingOne">
<constructor-arg ref="thing Two"/>
<constructor-arg ref="thing Three"/>
<constructor-arg value="something@somewhere.com"/>
<!-- traditional declaration with optional argument names -->
<bean id="bean One" class="x.y.ThingOne">
<constructor-arg name="thingTwo" ref="bean Two"/>
<constructor-arg name="thingThree" ref="bean Three"/>
<constructor-arg name="email" value="something@somewhere.com"/>
</bean>
<!-- c-namespace declaration -->
<bean id="thingOne" class="x.y.ThingOne" c:thingTwo-ref="thingTwo" c:thingThree-ref="thingThree" c:email="something@somewhere.com"/>
<!-- c-namespace declaration with argument names -->
<bean id="beanOne" class="x.y.ThingOne" c:thingTwo-ref="beanTwo"
c:thingThree-ref="beanThree" c:email="something@somewhere.com"/>
</beans>
----
====
The `c:` namespace uses the same conventions as the `p:` one (a trailing `-ref` for bean
references) for setting the constructor arguments by their names. Similarly, it
needs to be declared even though it is not defined in an XSD schema (it exists
inside the Spring core).
The `c:` namespace uses the same conventions as the `p:` one (a trailing `-ref` for
bean references) for setting the constructor arguments by their names. Similarly,
it needs to be declared in the XML file even though it is not defined in an XSD schema
(it exists inside the Spring core).
For the rare cases where the constructor argument names are not available (usually if
the bytecode was compiled without debugging information), you can use fallback to the
@ -1968,12 +1969,15 @@ argument indexes, as follows:
@@ -1968,12 +1969,15 @@ argument indexes, as follows:
[subs="verbatim,quotes"]
----
<!-- c-namespace index declaration -->
<bean id="thingOne" class="x.y.ThingOne" c:_0-ref="thingTwo" c:_1-ref="thingThree"/>
<bean id="beanOne" class="x.y.ThingOne" c:_0-ref="beanTwo" c:_1-ref="beanThree"
c:_2="something@somewhere.com"/>
----
====
NOTE: Due to the XML grammar, the index notation requires the presence of the leading `_`,
as XML attribute names cannot start with a number (even though some IDEs allow it).
A corresponding index notation is also available for `<constructor-arg>` elements but
not commonly used since the plain order of declaration is usually sufficient there.
In practice, the constructor resolution
<<beans-factory-ctor-arguments-resolution,mechanism>> is quite efficient in matching