Spring构造器注入出现歧义,先定义的int参数构造器未被调用原因排查
问题原因
你之前了解的「构造器存在歧义时优先调用先定义的构造器」规则有明确的生效前提:仅当多个候选构造器的参数类型匹配度完全一致时,Spring才会按构造器的定义顺序做选择,当前场景不满足该前提。
核心触发点是你在XML配置中没有给<constructor-arg>显式声明type属性:
- 你传入的
12、34是字符串格式的数值,Spring的默认类型转换逻辑可以同时支持将其转为int和double两种类型 - Spring的构造器匹配算法中,会优先选择参数类型覆盖范围更广的构造器:
double可以覆盖所有int的取值范围,反过来int无法覆盖所有double的取值范围,因此Spring判定double,double参数的构造器匹配度更高,最终调用了该构造器。
解决方案
要强制调用int,int参数的构造器,只需在构造参数声明中显式指定类型即可,修改后的XML配置如下:
<bean class="com.spring.Addition" name="addition1"> <constructor-arg type="int" value="12"/> <constructor-arg type="int" value="34"/> </bean>
如果存在同类型多参数顺序匹配的问题,还可以额外加上index属性指定参数的索引位置:
<bean class="com.spring.Addition" name="addition1"> <constructor-arg index="0" type="int" value="12"/> <constructor-arg index="1" type="int" value="34"/> </bean>
内容的提问来源于stack exchange,提问作者Dawson Smith
相关产品推荐
相关产品推荐

