首页 > 学院 > 开发设计 > 正文

8、spring依赖注入(DI)之参数歧义问题

2019-11-08 02:51:08
字体:
来源:转载
供稿:网友

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>

这时就可以消除参数歧义的问题,从而使用目标构造器进行传参!!


发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表