Spring一个类包含多个构造函数且带的参数相同所存在的注入类型问题
2017-11-23 15:46
435 查看
在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/beanshttp://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/beanshttp://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方法。
看如下一个代码:
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/beanshttp://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/beanshttp://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方法。
相关文章推荐
- 二进制兼容 DLL 或 EXE 包含了一个找不到其定义的参数类型或返回类型
- 关于,VS2010 里面 一个解决方案包含多个win32程序,调试的问题~~~happy
- 关于Spring.net注入Controller时参数为空的问题。
- 一个程序中关于多个osgGA::GUIEventHandler同时存在的问题
- C++关于参数为const引用类型的函数调用参数成员函数的一个问题
- 一个.java文件是否一定要和文件中的类名相同呢?一个.java文件中可以包含多个类吗?
- 【spring教程之二】spring注入xml中带参数的构造函数
- Spring单元测试时出现的一个奇怪问题:找不到要注入的bean
- Spring-依赖注入-多参数的构造函数注入方式
- oracle 索引字段包含date类型,使用spring jdbc更新时不走索引,而是走table access full的问题
- Spring 一个接口多个实现注入
- 对一个Spring依赖注入问题的解答
- java不定参数存在一个小问题。
- 解决spring中不同配置文件中存在name或者id相同的bean可能引起的问题
- Struts2一个Action内包含多个请求处理方法的处理,method的使用方法,struts2中的路径问题,通配符映射
- 一个字符串参数(s)由字母(a-z,A-Z)组成, 且最大字符位数为40,要求写一个函数, 返回该参数中连续相同字母的最大个数及该字母,如果最大位数有多个,则返回第一个。例:字符串“aaaddxxxxddddxxxx”,返回值为:“x,4”。
- 关于结构指针类型数组做函数参数的一个问题#include<stdio.h>typede
- Linq to SharePoint中一个列表包含多个Content Type问题
- Spring @Autowired 注入集合类型的问题
- Struts2一个Action内包含多个请求处理方法的处理,method的使用方法,struts2中的路径问题,通配符映射