constrructor-arg:以构造函数的形式注册bean
可以用“type”、“index”或“name”指定传入的参数以决定使用哪个构造函数
比如有一个实体类为:
package cn.linkengine.internal.http.api.business;
/**
* @program: internal-http-api
* @author: yuhh
* @create: 2018-11-02 15:41
**/
public class Test {
private Long id;
private String name;
public Test(){
}
public Test(Long id, String name){
this.id = id;
this.name = name;
}
public Long getId() {
return id;
}
public void setId(Long id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
以下三种方式的效果都是相同的
以type的方式:
<bean class="cn.linkengine.internal.http.api.business.Test">
<constructor-arg type="java.lang.String" value="yhh"></constructor-arg>
<constructor-arg type="java.lang.Long" value="1"></constructor-arg>
</bean>
以index的形式:
<bean class="cn.linkengine.internal.http.api.business.Test">
<constructor-arg index="0" value="1"></constructor-arg>
<constructor-arg index="1" value="yhh"></constructor-arg>
</bean>
以name的形式:
<bean class="cn.linkengine.internal.http.api.business.Test">
<constructor-arg name="id" value="1"></constructor-arg>
<constructor-arg name="name" value="yhh"></constructor-arg>
</bean>
type:以参数类型来指定是用哪个构造函数,只有在所有构造函数的每个参数类型都不同的情况下才能使用,如果有构造函数为
public Test (String name, String phone)
那这个时候type就无法使用了
index:以参数位置来指定是用哪个构造函数,只有在没有相同数量参数的构造函数的情况下才能使用,如果有两个构造函数为
public Test(String phone, String name)
public Test(Long id, String name)
这个时候index就会有问题
name:以参数名来指定是用哪个构造函数,这种方式比较稳妥,不易出错
如果参数为对象,则需要先把对象注册为bean,再用“ref”来引用对象的bean,如
<constructor-arg ref="beanName"></constructor-arg>
如果参数是简单数据类型,则只要用“value”来指定值就行,如
<constructor-arg name="id" value="1"></constructor-arg>
如果参数是对象类型集合,则可以用“<list>”和"<ref>"来声明一个列表,如
<constructor-arg name="lists">
<list>
<ref bean="xx"/>
<ref bean="yy"/>
</list>
</constructor-arg>
如果参数是简单数据类型集合,则可以用“<list>”和“<value>”来声明一个列表,如
<constructor-arg name="lists">
<list>
<value>xx</value>
<value>yy</value>
</list>
</constructor-arg>
当然用“<set>”也是可以,用法同“<list>”,只是“<set>”会去重