我们如何利用spring通过构造函数去给实体类初始化呢?利用constructor-arg属性。
我们可以看到这里面有很多的参数,index就是索引的位置,value可以去为属性赋值,ref可以去注入另一个bean,type可以去指明参数的类型,name可以指明参数的命名。
在下列的xml中我一共提供了三种给老王实例化的方法。
首先定义一个妻子类
@Data
public class Wife {
private String name;
public void getinformation(){
System.out.println("妻子名称:"+name);
}
}
定义一个老王类
public class Mr_wang {
private String name;
private Wife wife;
public Mr_wang(String name, Wife wife) {
this.name = name;
this.wife = wife;
}
public void s(){
System.out.println("我是:"+name);
wife.getinformation();
}
}
配置文件
<bean id="w1" class="com.LL.sp2.Wife">
<property name="name" value="敏敏"></property>
</bean>
<bean id="wang1" class="com.LL.sp2.Mr_wang">
<constructor-arg name="name" value="王五"></constructor-arg>
<constructor-arg type="com.LL.sp2.Wife" ref="w1" ></constructor-arg>
</bean>
<bean id="wang2" class="com.LL.sp2.Mr_wang">
<constructor-arg index="0" value="王六"></constructor-arg>
<constructor-arg index="1" ref="w1" ></constructor-arg>
</bean>
<bean id="wang3" class="com.LL.sp2.Mr_wang">
<constructor-arg type="com.LL.sp2.Wife" ref="w1" ></constructor-arg>
<constructor-arg name="name" value="王七" ></constructor-arg>
</bean>
在配置文件中,可以看到,我们注册了一个妻子bean。
第一种:在老王注册bean中,name属性绑定参数,value为其赋值,利用type指明参数类型,然后通过ref属性,为老王实体中的Wife赋值。
第二种:利用索引,在构造函数中,第一个参数是name,第二个参数是wife,依次赋值。
第三种:只是将第一种的参数调换位置,在下面我们将说明为什么会强调这种方式。
测试代码
public static void main(String[] args) {
ApplicationContext context =
new ClassPathXmlApplicationContext("sp2.xml");
Mr_wang wang1 = (Mr_wang) context.getBean("wang1");
Mr_wang wang2 = (Mr_wang) context.getBean("wang2");
Mr_wang wang3= (Mr_wang) context.getBean("wang3");
wang1.s();
wang2.s();
wang3.s();
}
运行结果
通过运行结果,我们可以发现,三位老王共同拥有了一位妻子敏敏,哎,好像哪里不太对。。
你以为完了?并没有!
补充:鉴于为什么我们在xml通过配置文件中要尽量去遵从顺序去给属性赋值。
举个栗子:
public class childrenN {
private String surname;
private String sex;
private int age;
public childrenN(String surname, String sex, int age) {
this.surname = surname;
this.sex = sex;
this.age = age;
}
}
这是一个朴实无华的实体类,细心的同学会发现,哎?第一个参数和第二个参数类型是相同的,都是String类型,前两种注册方式都没问题,但是第三种方式就会产生歧义,我们很容易分不清第一个和第二个参数是哪一个。
但是spring会根据顺序自动去为类进行赋值注册,也是可以运行成功的。
<bean id="c1" class="com.LL.sp2.childrenN">
<constructor-arg index="0" value="0"></constructor-arg>
<constructor-arg index="1" value="0"></constructor-arg>
<constructor-arg index="2" value="0"></constructor-arg>
</bean>
<bean id="c2" class="com.LL.sp2.childrenN">
<constructor-arg name="surname" value="0"></constructor-arg>
<constructor-arg name="sex" value="0"></constructor-arg>
<constructor-arg name="age" value="0"></constructor-arg>
</bean>
<bean id="c3" class="com.LL.sp2.childrenN">
<constructor-arg type="java.lang.String" value="0"></constructor-arg>
<constructor-arg type="java.lang.String" value="0"></constructor-arg>
<constructor-arg type="int" value="0"></constructor-arg>
</bean>