今天遇到一个构造方法,传了一大波参数,也是醉了,正好在写测试代码的时候,构造方法注入属性的时候,声明bean的时候,constructor-arg标签又熟悉了一通
通过一个简单例子说明下问题
package com.lihuia.constructor.arg;
/**
* Copyright (C), lihuia.com
* FileName: Demo
* Author: lihui
* Date: 2018/8/3
*/
public class Demo {
private int number;
private String message;
private boolean flag;
public Demo(int number, String message, boolean flag) {
this.number = number;
this.message = message;
this.flag = flag;
}
public int getNumber() {
return number;
}
public String getMessage() {
return message;
}
public boolean getFlag() {
return flag;
}
}
测试代码
package com.lihuia.constructor.arg;
import javax.annotation.Resource;
import org.testng.Assert;
import org.testng.annotations.Test;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.testng.AbstractTestNGSpringContextTests;
/**
* Copyright (C), lihuia.com
* FileName: DemoTest
* Author: lihui
* Date: 2018/8/3
*/
@ContextConfiguration(locations = "classpath:demo.xml")
public class DemoTest extends AbstractTestNGSpringContextTests {
@Resource
private Demo demo;
@Test
public void DemoTest() {
Assert.assertEquals(demo.getNumber(), 2018);
Assert.assertEquals(demo.getMessage(), "lihui");
Assert.assertEquals(demo.getFlag(), true);
}
}
假如bean的声明不带任何属性参数,就会报错
提示说明已经说明一切,在Demo类里找不到匹配的构造方法,原因就是下面三个参数不见了,当然如果在Demo类里加一个无参的Demo构造方法,这里的报错就会消失
而此时只有一个带参数的构造方法,因此要么新建对象的时候传参,要么就在声明bean的时候指明参数
最简单的方法就是指明参数和值
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
<bean id="demo" class="com.lihuia.constructor.arg.Demo">
<constructor-arg name="number" value="2018"></constructor-arg>
<constructor-arg name="message" value="lihui"></constructor-arg>
<constructor-arg name="flag" value="true"></constructor-arg>
</bean>
</beans>
或者通过参数的次序对应的index值来指定
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
<bean id="demo" class="com.lihuia.constructor.arg.Demo">
<constructor-arg index="0" value="2018"></constructor-arg>
<constructor-arg index="1" value="lihui"></constructor-arg>
<constructor-arg index="2" value="true"></constructor-arg>
</bean>
</beans>
这里的顺序不能弄错,否则没法对应上
这里有两点:
1:value是必传,因为本来constructor-arg就是要注入属性,能够想象带参数构造方法,在new对象的时候偏偏不传参的感觉么
2:不管源码里参数是啥类型,xml里值都要带引号,不影响其真实的类型,因为value元素就是通过字符串来指定属性值
下面才是重点:
其实只要将value按序,index和name元素可以不需要
<?xml version="1.0" encoding="UTF-8"?>
<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.xsd">
<bean id="demo" class="com.lihuia.constructor.arg.Demo">
<constructor-arg value="2018"></constructor-arg>
<constructor-arg value="lihui"></constructor-arg>
<constructor-arg value="true"></constructor-arg>
</bean>
</beans>
此时注释掉String这个注入
注释两个
这么看来,如果只传了一个参数,就会对应构造方法第一个参数;如果传两个参数,就会对应构造方法首末两个参数
手贱再加一个参数
构造方法4参数,传入三个,如上匹配,估计只有看看源代码才知道这里的实现逻辑