8、spring依赖注入(DI)之参数歧义问题
背景说明:当一个类中,包含有多个带参数构造器,而且构造器的参数数量和类型都一致,但是位置不同,这时如果通过构造器进行依赖注入的话,可能会造成参数歧义(错位传参)问题。
让我们看看下面的例子!
例子
Customer.java
package com.main.autowrite.DI;
public class Customer {
private String name;
private String address;
private int age;
public Customer(String name, String address, int age) {
this.name = name;
this.address = address;
this.age = age;
}
public Customer(String name, int age, String address) {
this.name = name;
this.age = age;
this.address = address;
}
//getter and setter methods
public String toString(){
return " name : " +name + "\n address : "
+ address + "\n age : " + age;
}
}
在bean.xml文件中的声明如下:
<bean id="customer" class="com.main.autowrite.DI.Customer">
<constructor-arg>
<value>jack</value>
</constructor-arg>
<constructor-arg>
<value>1111111</value>
</constructor-arg>
<constructor-arg>
<value>2222222</value>
</constructor-arg>
</bean>
测试方法以及结果:
@Test
public void test(){
ApplicationContext context =
new ClassPathXmlApplicationContext("com/main/autowrite/DI/bean.xml");
Customer customer =
(Customer)context.getBean("customer");
System.out.println(customer.toString());
}
假设我们想要的是利用第二个构造函数进行传参,这时的运行结果就不是我们想要的,所以就产生了参数歧义的问题
目标结果为:
name : jack
address:2222222
age : 1111111
但是实际结果为:
这时,通过在bean.xml配置文件中对参数进行类型的限定,就可以达到我们的目标效果!!
修改如下:
<bean id="customer" class="com.main.autowrite.DI.Customer">
<constructor-arg type="java.lang.String">
<value>jack</value>
</constructor-arg>
<constructor-arg type="int">
<value>1111111</value>
</constructor-arg>
<constructor-arg type="java.lang.String">
<value>2222222</value>
</constructor-arg>
</bean>
这时就可以消除参数歧义的问题,从而使用目标构造器进行传参!!