在IOC容器中初始化对象有两种方式,一种是使用property调用set方法进行初始化赋值,另一种是调用constructor-arg调用有参构造器进行初始化赋值在这里插入图片描述

1.在bean中使用property调用set进行初始化赋值

在bean中使用property标签进行初始化赋值,这种赋值方式会调用bean对象中的set方法进行赋值操作,它会先调用无参构造器创建对象,然后调用set方法进行赋值操作
验证测试:
添加无参构造器和打印输出,为set方法添加打印输出在这里插入图片描述
使用property进行初始化赋值
在这里插入图片描述
在test中进行对象获取
在这里插入图片描述

<bean id="User" class="com.hao.spring.user.User">
            <property name="userName" value="qianghao"></property>
            <property name="sex" value="man"></property>
            <property name="age" value="25"></property>
 </bean>

2.在bean中使用constructor-arg调用有参构造器完成初始化赋值

使用constructor-arg会调用有参构造器,在创建对象的同时,完成初始化赋值的操作
验证测试:
创建有参构造器并添加打印输出在这里插入图片描述
使用constructor-arg进行初始化赋值
在这里插入图片描述
在test中进行对象获取
在这里插入图片描述

<bean id="constructor-user" class="com.hao.spring.user.User">
            <constructor-arg name="userName"  value="qianghao"></constructor-arg>
</bean>

在这里插入图片描述
在这里插入图片描述

3.constructor-arg标签属性说明

在constructor-arg标签中有index,name,ref,type这4个属性
在这里插入图片描述

  • index: 指定该参数为形参中的第几个参数赋值,下标从0开始
  • name: 指定该参数为形参中的哪个参数赋值
  • ref: 引用IOC容器中的其他外部对象
  • type 指定改参数为哪种数据类型的参数赋值

4. 使用constructor-arg需要注意的问题

4.1. 当我们不指定name时,需要注意参数顺序

当我们不指定参数的name时,spring会根据我们在property中指定的参数按顺序为对象赋值,所以如果参数顺序写错了很容易出现下面的错误,而当指定name后会根据name进行定向赋值,就不需要关系参数的顺序了,所以如果需要在IOC容器中进行显示的初始化赋值,用name!!!用name!!!用name!!!
在这里插入图片描述
4.2. 当我们不指定name时,还可以指定type,进行指定参数类型的赋值

当我们用type指定了数据类型时,只要我们的value和type的类型保持一致就可以不用但是上面的类型转换异常的错误的,使用type相当于是对形参进行了一个分组,然后IOC会根据顺序将值赋给参数。
所以你会发现我们还是需要注意相同类型的参数的顺序,否则可能赋值还是会错,所以如果需要在IOC容器中进行显示的初始化赋值,用name!!!用name!!!用name!!!
在这里插入图片描述
4.3. 当我们不指定name也不指定type时,我们可以使用index,去指定该参数赋值给第几个形参
这个方式是最接近name的方式,因为我们可以确定的指定该value会赋值给哪个参数。但是…emmm…用name!!!用name!!!用name!!!在这里插入图片描述

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐