Spring一个类包含多个构造函数且带的参数相同所存在的注入类型问题

本文主要是介绍Spring一个类包含多个构造函数且带的参数相同所存在的注入类型问题,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


在Spring框架中,当一个类包含多个构造函数带的参数相同,它总是会造成构造函数注入参数类型歧义的问题。
看如下一个代码:
public class Student {
    
     private String name ;
     private String address ;
     private int age ;   
     public Student(String name , String address , int age ) {
          super ();
          this . name = name ;
          this . address = address ;
          this . age = age ;
    }
     public Student(String name , int age , String address ) {
          super ();
          this . name = name ;
          this . address = address ;
          this . age = age ;
    }
     public String getName() {
          return name ;
    }
     public void setName(String name ) {
          this . name = name ;
    }
     public String getAddress() {
          return address ;
    }
     public void setAddress(String address ) {
          this . address = address ;
    }
     public int getAge() {
          return age ;
    }
     public void setAge( int age ) {
          this . age = age ;
    }
     @Override
     public String toString() {
          return "Student [name=" + name + ", address=" + address + ", age=" + age + "]" ;
    }
}
在Spring bean的配置文件中,name为jack,adderss为123456,age为12:
< beans
     xmlns = " http://www.springframework.org/schema/beans" ;
     xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance" ;
     xmlns:p = " http://www.springframework.org/schema/p" ;
     xsi:schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd" ; >
    
     < bean id = "StudentBean" class = "com.yiibai.dao.Student" >
         < constructor-arg >< value > jack </ value ></ constructor-arg >
         < constructor-arg >< value > 123456 </ value ></ constructor-arg >
         < constructor-arg >< value > 12 </ value ></ constructor-arg >
         
     </ bean >
</ beans >
执行如下代码:
public static void main(String[] args ) {
         ApplicationContext context =
              new ClassPathXmlApplicationContext( "applicationContext.xml" );
         Student student = (Student) context .getBean( "StudentBean" );    
         System. out .println( student );
    }
我们期望的输出结果为:
Student [name=jack, address=123456, age=12]
实际的输出结果为:
Student [name=jack, address=12, age=123456]
我们期望的是它调用第一个构造函数来注入属性的,但实际上调用的是第二个构造函数, 在Spring参数类型'123456' 能够转换成int,所以Spring只是转换它,并采用第二个构造来执行,即使你认为它应该是一个字符串。 这样就造成了属性注入问题。
为了解决这个问题,应该为构造函数指定确切的数据类型,Spring bean的配置文件应该修改为如下形式:
< beans
     xmlns = " http://www.springframework.org/schema/beans" ;
     xmlns:xsi = " http://www.w3.org/2001/XMLSchema-instance" ;
     xmlns:p = " http://www.springframework.org/schema/p" ;
     xsi:schemaLocation = " http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd" ; >
    
     < bean id = "StudentBean" class = "com.yiibai.dao.Student" >
          < constructor-arg type = "java.lang.String" >< value > jack </ value ></ constructor-arg >
          < constructor-arg type = "java.lang.String" >< value > 123456 </ value ></ constructor-arg >
          < constructor-arg type = "int" >< value > 12 </ value ></ constructor-arg >
         
     </ bean >
</ beans >
输出结果为:
Student [name=jack, address=123456, age=12]
因此,为了解决这个问题可以为构造函数指定确切的数据类型,但是这样做其实还是很麻烦,所以,个人建议属性注入可以使用setter方法。

这篇关于Spring一个类包含多个构造函数且带的参数相同所存在的注入类型问题的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1125690

相关文章

Kotlin Map映射转换问题小结

《KotlinMap映射转换问题小结》文章介绍了Kotlin集合转换的多种方法,包括map(一对一转换)、mapIndexed(带索引)、mapNotNull(过滤null)、mapKeys/map... 目录Kotlin 集合转换:map、mapIndexed、mapNotNull、mapKeys、map

nginx中端口无权限的问题解决

《nginx中端口无权限的问题解决》当Nginx日志报错bind()to80failed(13:Permissiondenied)时,这通常是由于权限不足导致Nginx无法绑定到80端口,下面就来... 目录一、问题原因分析二、解决方案1. 以 root 权限运行 Nginx(不推荐)2. 为 Nginx

SpringBoot中六种批量更新Mysql的方式效率对比分析

《SpringBoot中六种批量更新Mysql的方式效率对比分析》文章比较了MySQL大数据量批量更新的多种方法,指出REPLACEINTO和ONDUPLICATEKEY效率最高但存在数据风险,MyB... 目录效率比较测试结构数据库初始化测试数据批量修改方案第一种 for第二种 case when第三种

解决1093 - You can‘t specify target table报错问题及原因分析

《解决1093-Youcan‘tspecifytargettable报错问题及原因分析》MySQL1093错误因UPDATE/DELETE语句的FROM子句直接引用目标表或嵌套子查询导致,... 目录报js错原因分析具体原因解决办法方法一:使用临时表方法二:使用JOIN方法三:使用EXISTS示例总结报错原

Java docx4j高效处理Word文档的实战指南

《Javadocx4j高效处理Word文档的实战指南》对于需要在Java应用程序中生成、修改或处理Word文档的开发者来说,docx4j是一个强大而专业的选择,下面我们就来看看docx4j的具体使用... 目录引言一、环境准备与基础配置1.1 Maven依赖配置1.2 初始化测试类二、增强版文档操作示例2.

一文详解如何使用Java获取PDF页面信息

《一文详解如何使用Java获取PDF页面信息》了解PDF页面属性是我们在处理文档、内容提取、打印设置或页面重组等任务时不可或缺的一环,下面我们就来看看如何使用Java语言获取这些信息吧... 目录引言一、安装和引入PDF处理库引入依赖二、获取 PDF 页数三、获取页面尺寸(宽高)四、获取页面旋转角度五、判断

Windows环境下解决Matplotlib中文字体显示问题的详细教程

《Windows环境下解决Matplotlib中文字体显示问题的详细教程》本文详细介绍了在Windows下解决Matplotlib中文显示问题的方法,包括安装字体、更新缓存、配置文件设置及编码調整,并... 目录引言问题分析解决方案详解1. 检查系统已安装字体2. 手动添加中文字体(以SimHei为例)步骤

Spring Boot中的路径变量示例详解

《SpringBoot中的路径变量示例详解》SpringBoot中PathVariable通过@PathVariable注解实现URL参数与方法参数绑定,支持多参数接收、类型转换、可选参数、默认值及... 目录一. 基本用法与参数映射1.路径定义2.参数绑定&nhttp://www.chinasem.cnbs

JAVA中安装多个JDK的方法

《JAVA中安装多个JDK的方法》文章介绍了在Windows系统上安装多个JDK版本的方法,包括下载、安装路径修改、环境变量配置(JAVA_HOME和Path),并说明如何通过调整JAVA_HOME在... 首先去oracle官网下载好两个版本不同的jdk(需要登录Oracle账号,没有可以免费注册)下载完

Spring StateMachine实现状态机使用示例详解

《SpringStateMachine实现状态机使用示例详解》本文介绍SpringStateMachine实现状态机的步骤,包括依赖导入、枚举定义、状态转移规则配置、上下文管理及服务调用示例,重点解... 目录什么是状态机使用示例什么是状态机状态机是计算机科学中的​​核心建模工具​​,用于描述对象在其生命