构造注入 ‹constructor-arg›

Exisi 2022-06-28 07:43:36
Categories: Tags:
  • <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>

数组标签

属性

描述

merge

使用父/ bean 时启用/禁用集合合并。

value-type

嵌套值的默认Java类型。必须是完全限定的类名

 

子标签

说明

<value>

用于迭代列表或数组数据

<ref/>

使用引用数据

属性

描述

bean

被引用bean的名称

 

<idref>

此工厂或外部工厂(父工厂或包含的工厂)中的另一个beanid。虽然可以使用常规的“value”元素来获得相同的效果,但使用idref表示Spring容器应该检查该值是否实际对应于bean id

属性

描述

bean

被引用bean的名称

parent

父工厂中被引用bean的名称

 

<null>

表示 Java 空值。必要的,因为一个空的“值”标签将解析为一个空字符串,除非特殊的 PropertyEditor 这样做,否则不会将其解析为空值

 

<list>

列表数据

属性

描述

merge

使用父/ bean 时启用/禁用集合合并。

value-type

嵌套值的默认Java类型。必须是完全限定的类名

 

子标签

说明

<value>

用于迭代列表或数组数据

<ref/>

使用引用数据

属性

描述

bean

被引用bean的名称

 

<idref>

此工厂或外部工厂(父工厂或包含的工厂)中的另一个beanid。虽然可以使用常规的“value”元素来获得相同的效果,但使用idref表示Spring容器应该检查该值是否实际对应于bean id

属性

描述

bean

被引用bean的名称

parent

父工厂中被引用bean的名称

 

<null>

表示 Java 空值。必要的,因为一个空的“值”标签将解析为一个空字符串,除非特殊的 PropertyEditor 这样做,否则不会将其解析为空值

 

<set>

set集合数据

属性

描述

merge

使用父/ bean 时启用/禁用集合合并。

value-type

嵌套值的默认Java类型。必须是完全限定的类名

 

子标签

说明

<value>

用于迭代列表或数组数据

<ref/>

使用引用数据

属性

描述

bean

被引用bean的名称

 

<idref>

此工厂或外部工厂(父工厂或包含的工厂)中的另一个beanid。虽然可以使用常规的“value”元素来获得相同的效果,但使用idref表示Spring容器应该检查该值是否实际对应于bean id

属性

描述

bean

被引用bean的名称

parent

父工厂中被引用bean的名称

 

<null>

表示 Java 空值。必要的,因为一个空的“值”标签将解析为一个空字符串,除非特殊的 PropertyEditor 这样做,否则不会将其解析为空值

 

<map>

map集合数据

属性

描述

merge

使用父/ bean 时启用/禁用集合合并。

value-type

嵌套值的默认Java类型。必须是完全限定的类名

key-type

嵌套条目键的默认 Java 类型。必须是完全限定的类名。

 

子标签

说明

<entry>

用于迭代<map>数据

属性

描述

key

数据的对应的键名

value

数据的值

 

 

<ref/>

使用引用数据

属性

描述

bean

被引用bean的名称

 

<idref>

此工厂或外部工厂(父工厂或包含的工厂)中的另一个beanid。虽然可以使用常规的“value”元素来获得相同的效果,但使用idref表示Spring容器应该检查该值是否实际对应于bean id

属性

描述

bean

被引用bean的名称

parent

父工厂中被引用bean的名称

 

<props>

注入实体对象

子标签

说明

<prop>

实体对象

属性

描述

key

属性项对应的键名

 

 

<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 注入配置循环依赖关系