背景说明:当一个类中,包含有多个带参数构造器,而且构造器的参数数量和类型都一致,但是位置不同,这时如果通过构造器进行依赖注入的话,可能会造成参数歧义(错位传参)问题。
让我们看看下面的例子!
例子
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>这时就可以消除参数歧义的问题,从而使用目标构造器进行传参!!
新闻热点
疑难解答