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>
这时就可以消除参数歧义的问题,从而使用目标构造器进行传参!!

本文探讨了Spring框架中依赖注入(DI)时遇到的参数歧义问题,并通过实例演示了如何通过指定参数类型来避免错误的构造函数调用。
之参数歧义问题&spm=1001.2101.3001.5002&articleId=55667890&d=1&t=3&u=2b67e1dc068845b1bd7c0ce4e5b919d4)
674

被折叠的 条评论
为什么被折叠?



