Spring:带参构造方法属性注入遐想

今天遇到一个构造方法,传了一大波参数,也是醉了,正好在写测试代码的时候,构造方法注入属性的时候,声明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的声明不带任何属性参数,就会报错

NewImage

提示说明已经说明一切,在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这个注入

NewImage

注释两个

NewImage

这么看来,如果只传了一个参数,就会对应构造方法第一个参数;如果传两个参数,就会对应构造方法首末两个参数

手贱再加一个参数

NewImage

构造方法4参数,传入三个,如上匹配,估计只有看看源代码才知道这里的实现逻辑

发表回复