在这个例子中我们将通过构造函数注入设置bean属性。先看一下下面的User bean类。
[java]view plaincopy
packagecom.vaannila;
publicclassUser{
privateStringname;
privateintage;
privateStringcountry;
User(Stringname,intage,Stringcountry)
{
this.name=name;
this.age=age;
this.country=country;
}
publicStringtoString(){
returnname+"is"+age+"yearsold,livingin"+country;
}
}
User bean类有三个属性,即:name, age和country。这三个属性都是通过setter注入来进行设置的。User bean类的toString()方法被重载来展示User对象。
bean.xml用来配置spring bean。下面的代码说明设置属性的值直至setter注入。
[xhtml]view plaincopy
<?xmlversion="1.0"encoding="UTF-8"?>
<beansxmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd">
<beanid="user"class="com.vaannila.User">
<constructor-argvalue="Eswar"/>
<constructor-argvalue="24"/>
<constructor-argvalue="India"/>
</bean>
</beans>
在bean元素中的constructor-arg元素用来设置属性值直至构造函数注入。当User bean类中有一个构造函数,这个代码将会正常工作。当有另外一个有相同参数数量的构造函数,将会产生错误,参考一下代码:
[java]view plaincopy
User(intage,Stringcountry)
{
this.age=age;
this.country=country;
}
User(Stringname,Stringcountry)
{
this.name=name;
this.country=country;
}
bean的配置文件:
[xhtml]view plaincopy
<beanid="user"class="com.vaannila.User">
<constructor-argvalue="24"/>
<constructor-argvalue="India"/>
</bean>
现在哪个构造函数将被调用?调用第一个int和String参数的构造函数是正确的,但是事实上将调用第二个构造函数。虽然我们知道第一个参数是int类型,第二个参数是String类型,但是Spring将他们都解释为Spring参数。为了避免这种情况,需要指定constructor-arg元素的type属性。现在bean配置属性如下,第一个构造函数将被调用。
[xhtml]view plaincopy
<beanid="user"class="com.vaannila.User">
<constructor-argtype="int"value="24"/>
<constructor-argtype="java.lang.String"value="India"/>
</bean>
我们将User bean类的构造函数改为如下的情况:
[java]view plaincopy
User(Stringname,intage)
{
this.name=name;
this.age=age;
}
User(intage,Stringcountry)
{
this.age=age;
this.country=country;
}
现在哪个构造函数将被调用那?调用第二个构造函数是正确的,但是实际情况是第一个构造函数被调用。这是因为当构造函数被调用的时候,在bean配置文件不会考虑参数出现的顺序。为了解决这个问题我们可以指定构造函数参数的索引数。
bean配置文件如下:
[xhtml]view plaincopy
<beanid="user"class="com.vaannila.User">
<constructor-argindex="0"type="int"value="24"/>
<constructor-argindex="1"type="java.lang.String"value="India"/>
</bean>