背景說明:當一個類中,包含有多個帶參數構造器,而且構造器的參數數量和類型都一致,但是位置不同,這時如果通過構造器進行依賴注入的話,可能會造成參數歧義(錯位傳參)問題。
讓我們看看下面的例子!
例子
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>這時就可以消除參數歧義的問題,從而使用目標構造器進行傳參!!
新聞熱點
疑難解答