- <constructor-arg> 标签通过实体类对象中的有参构造给对象传递成员变量的值
- <constructor-arg> 标签有以下参数:
参数 |
描述 |
name |
根据变量名称传值 |
index |
根据名称顺序传值 |
type |
根据变量类型传值 |
value |
变量赋值 |
ref |
引用已有的数据类型赋值 |
- 调用类中的 有参构造 方法, 在创建对象的同时,给属性赋值
示例
<!--构造注入,使用name属性-->
<bean id="myStudent" class="com.bjpowernode.ba03.Student">
<constructor-arg name="myage" value="22" />
<constructor-arg name="myname" value="李四" />
<constructor-arg name="mySchool" ref="mySchool" />
</bean>
示例
<!--构造注入,使用index,参数的位置,构造方法参数从左往右位置是0,1,2-->
<bean id="myStudent2" class="com.bjpowernode.ba03.Student">
<constructor-arg index="1" value="28" />
<constructor-arg index="0" value="张三" />
<constructor-arg index="2" ref="mySchool" />
</bean>
示例
<!--构造注入,省略index属性-->
<bean id="myStudent3" class="com.bjpowernode.ba03.Student">
<constructor-arg value="张峰" />
<constructor-arg value="28" />
<constructor-arg ref="mySchool" />
</bean>
- <constructor-arg> 有以下子标签,其中 <array> <list> <set>标签可以相互嵌套使用
子标签 |
说明 |
||||||||||||||||||||||||||
<value> |
用于迭代列表或数组数据 |
||||||||||||||||||||||||||
<array> |
数组标签
|
||||||||||||||||||||||||||
<list> |
列表数据
|
||||||||||||||||||||||||||
<set> |
set集合数据
|
||||||||||||||||||||||||||
<map> |
map集合数据
|
||||||||||||||||||||||||||
<ref/> |
使用引用数据
|
||||||||||||||||||||||||||
<idref> |
此工厂或外部工厂(父工厂或包含的工厂)中的另一个bean的id。虽然可以使用常规的“value”元素来获得相同的效果,但使用idref表示Spring容器应该检查该值是否实际对应于bean id
|
||||||||||||||||||||||||||
<props> |
注入实体对象
|
||||||||||||||||||||||||||
<null> |
表示 Java 空值。必要的,因为一个空的“值”标签将解析为一个空字符串,除非特殊的 PropertyEditor 这样做,否则不会将其解析为空值 |
- applicationContext.xml
示例
<bean id="student" class="com.bcu.entity.Student">
<constructor-arg name="name" value="张三"></constructor-arg>
</bean>
示例
<bean id="size" class="com.bcu.entity.Size">
<constructor-arg name="size">
<array>
<value>4.7</value>
<value>5.5</value>
<value>5.8</value>
</array>
</constructor-arg>
</bean>
示例
<bean id="mobile" class="com.bcu.entity.Mobile">
<constructor-arg name="apps">
<list>
<value>appStore</value>
<value>weChat</value>
<value>camera</value>
</list>
</constructor-arg>
</bean>
示例
<bean id="mobile" class="com.bcu.entity.Computer">
<constructor-arg name="software">
<list>
<value>ps</value>
<value>idea</value>
<value>pycharm</value>
</list>
</constructor-arg>
</bean>
示例
<bean id="price" class="com.bcu.entity.Price">
<constructor-arg name="price">
<map>
<entry key="4.7" value="5288"></entry>
<entry key="5.5" value="6288"></entry>
<entry key="5.8" value="7288"></entry>
</map>
</constructor-arg>
</bean>
示例
<bean id="person" class="com.example.Person">
<constructor-arg>
<ref bean="address"/>
</constructor-arg>
</bean>
<bean id="address" class="com.example.Address"/>
注
- 如果主要使用构造函数注入,则可能会创建无法解决的循环依赖方案。
- 如果 A 类通过构造函数注入需要 B 类的实例,而 B 类通过构造函数注入需要 A 类的实例。如果为将类 A 和 B 相互注入而配置了 bean,则 Spring IoC 容器会在运行时检测到此循环引用,并抛出 BeanCurrentlyInCreationException。解决方案是修改某些类的代码,使这些类由设置器而不是构造函数来配置。或者,避免构造函数注入,而仅使用 setter 注入。尽管不建议这样做,但是可以使用 setter 注入配置循环依赖关系