在Spring框架中,当一个类包含多个构造函数带的参数相同,它总是会造成构造函数注入参数类型歧义的问题。

问题

让我们来看看这个客户 bean 实例。它包含两个构造方法,均接受3个不同的数据类型参数。
package com.yiibai.common;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 methodspublic String toString(){return " name : " +name + "\n address : "+ address + "\n age : " + age;}}
在Spring bean 的配置文件中,通过传递一个“yiibai' 的名字,地址为'188',以及年龄为'28'。
<!--Spring-Customer.xml-->
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><bean id="CustomerBean" class="com.yiibai.common.Customer"><constructor-arg><value>yiibai</value></constructor-arg><constructor-arg><value>188</value></constructor-arg><constructor-arg><value>28</value></constructor-arg></bean></beans>
运行它,你期望的结果是什么?
package com.yiibai.common;import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;public class App
{public static void main( String[] args ){ApplicationContext context = new ClassPathXmlApplicationContext(new String[] {"Spring-Customer.xml"});Customer cust = (Customer)context.getBean("CustomerBean");System.out.println(cust);}
}

输出结果

name : yiibaiaddress : 28age : 188
其结果不是我们所期望的,第一个构造器不执行,而是第二构造函数运行。在Spring参数类型'188' 能够转换成int,所以Spring只是转换它,并采用第二个构造来执行,即使你认为它应该是一个字符串。
另外,如果Spring不能解决使用哪个构造函数,它会提示以下错误信息
constructor arguments specified but no matching constructor
found in bean 'CustomerBean' (hint: specify index and/or
type arguments for simple parameters to avoid type ambiguities)

解决

为了解决这个问题,应该为构造函数指定的确切数据类型,通过像这样类型的属性:
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd"><bean id="CustomerBean" class="com.yiibai.common.Customer"><constructor-arg type="java.lang.String"><value>yiibai</value></constructor-arg><constructor-arg type="java.lang.String"><value>188</value></constructor-arg><constructor-arg type="int"><value>28</value></constructor-arg></bean></beans>
再次运行它,现在得到你所期望的。
输出结果
name : yiibaiaddress : 188age : 28

这是一个很好的做法,显式声明每个构造函数参数的数据类型,以避免上述构造注入型歧义的问题。

http://www.yiibai.com/spring/constructor-injection-type-ambiguities-in-spring.html

Spring构造方法注入类型歧义相关推荐

  1. Spring——依赖注入类型

    以例子说明: 一.新建Student类,声明各属性,创建成JavaBean: 1 package spring; 2 3 import java.util.List; 4 import java.ut ...

  2. Spring依赖注入的方式、类型、Bean的作用域、自动注入、在Spring配置文件中引入属性文件...

    1.Spring依赖注入的方式 通过set方法完成依赖注入 通过构造方法完成依赖注入 2.依赖注入的类型 基本数据类型和字符串 使用value属性 如果是指向另一个对象的引入 使用ref属性 User ...

  3. Spring~用注解读取bean(属性注入、构造方法注入、set注入)

    文章目录 注解@Autowired. 属性注入 Setter注入 构造方法注入 三种注入的优缺点 注解@Resource. 1.属性注入 2.构造方法注入 @Resource与@Autowired区别 ...

  4. SSM之Spring文件配置/Spring怎么在pom文件中进行依赖注入/不同的依赖注入类型有哪些以及怎么写

    写在前面: 接着记录自己的Spring学习之旅,若看不懂则建议先看上一篇博客SSM框架之Spring介绍开发流程/IDEA如何建立Spring项目,详细代码可在我的Gitee仓库ssm-learnin ...

  5. Spring(8):构造方法注入与示例

    2017/12/24 spring的两种依赖注入方式:setter注入与构造方法注入,这两种方法的不同主要就是在xml文件下对应使用property和constructor-arg属性, 下面主要介绍 ...

  6. Spring依赖注入的模式和类型

    依赖注入类型 依赖注入类型 配置元数据举例 Setter 方法 <proeprty name="user" ref="userBean"/> 构造器 ...

  7. arg是什么函数_java后端开发三年!你还不了解Spring 依赖注入,凭什么给你涨薪...

    前言 前两天和一个同学吃饭的时候同学跟我说了一件事,说他公司有个做了两年的人向他提出要涨薪资,他就顺口问了一个问题关于spring依赖注入的,那个要求涨薪的同学居然被问懵了...事后回家想了想这一块确 ...

  8. Spring学习3—控制反转(IOC)Spring依赖注入(DI)和控制反转(IOC)

    一.思想理解    Spring 能有效地组织J2EE应用各层的对象.不管是控制层的Action对象,还是业务层的Service对象,还是持久层的DAO对象,都可在Spring的 管理下有机地协调.运 ...

  9. 2.3.2 spring属性注入-注解注入-半注解注入-后序

    代码: spring属性注入-注解注入-半注解后序.zip - 蓝奏云文件大小:15.2 K|https://www.lanzouw.com/iCjbVvpvxaf 上一个博客的半注解是,一个类在xm ...

最新文章

  1. 分析了10万起诈骗案例,大数据告诉你:2018年骗子更狡猾了
  2. mysql互为主从复制配置笔记--未读,稍后学习
  3. 【深度学习问题整理】
  4. prettyJson V7.1 使用
  5. 用Python实现二叉树,完全二叉树和满二叉树
  6. todo在此放置对话框控件_MFC界面开发进入BCGControlBar v30.5时代,Gantt Chart控件升级...
  7. Spark技术内幕:Stage划分及提交源码分析
  8. VA Code编写html(1)
  9. 给你准备的Linux启动流程
  10. JAVA本地文本读取---解决中文乱码
  11. [转]PHP或ASP   中Cookie禁用了,Session还能用吗?
  12. 编译OpenJDK8:OpenJDK8与OpenJDK8u运行结果相差很大
  13. ETL调度工具 Taskctl 作业(组)节点类型概述
  14. 计算机二级vb基础教程,2017计算机二级考试内容VB
  15. Revit SDK 介绍:CompoundStructure 复合结构
  16. 跨域在前端工程化中的实际解决方案。
  17. 计算机能显示u盘吗,U盘插到电脑上,能检测到这设备,但是在“我的电脑”里没有显示U盘...
  18. hadoop命令无法创建目录
  19. 实时时钟DS1302-第1季第14部分-朱有鹏-专题视频课程
  20. 中国科学技术大学 MIRA Lab夏令营

热门文章

  1. C语言反转二叉树的递归和迭代解决方案(附完整源码)
  2. OpenGL实现高度图
  3. QT的QSyntaxHighlighter类的使用
  4. mysql函数截断_Mysql截断GROUP_CONCAT函数的并置结果
  5. Android EditText密码框的可见性设置
  6. ValidateUtil
  7. 创建一个存储函数,返回指定员工的姓名,薪水和年收入
  8. 【tensorflow】Sequential 模型方法 compile, model.compile
  9. php中添加分类的界面设计,zblog php新增自定义分类模板和文章模板
  10. python123.io作业_Python自动化开发学习3