在这个例子中我们将通过构造函数注入设置bean属性。先看一下下面的User bean类。
- package com.vaannila;
- public class User {
- private String name;
- private int age;
- private String country;
- User(String name, int age, String country)
- {
- this.name=name;
- this.age=age;
- this.country=country;
- }
- public String toString() {
- return name + " is " + age + " years old, living in " + country;
- }
- }
package com.vaannila; public class User { private String name; private int age; private String country; User(String name, int age, String country) { this.name=name; this.age=age; this.country=country; } public String toString() { return name + " is " + age + " years old, living in " + country; } }
User bean类有三个属性,即:name, age和country。这三个属性都是通过setter注入来进行设置的。User bean类的toString()方法被重载来展示User对象。
bean.xml用来配置spring bean。下面的代码说明设置属性的值直至setter注入。
- <?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="user" class="com.vaannila.User" >
- <constructor-arg value="Eswar" />
- <constructor-arg value="24"/>
- <constructor-arg value="India"/>
- </bean>
- </beans>
<?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="user" class="com.vaannila.User" > <constructor-arg value="Eswar" /> <constructor-arg value="24"/> <constructor-arg value="India"/> </bean> </beans>
在bean元素中的constructor-arg元素用来设置属性值直至构造函数注入。当User bean类中有一个构造函数,这个代码将会正常工作。当有另外一个有相同参数数量的构造函数,将会产生错误,参考一下代码:
- User( int age, String country)
- {
- this.age=age;
- this.country=country;
- }
- User(String name, String country)
- {
- this.name=name;
- this.country=country;
- }
User( int age, String country) { this.age=age; this.country=country; } User(String name, String country) { this.name=name; this.country=country; }
bean的配置文件:
- <bean id="user" class="com.vaannila.User" >
- <constructor-arg value="24"/>
- <constructor-arg value="India"/>
- </bean>
<bean id="user" class="com.vaannila.User" > <constructor-arg value="24"/> <constructor-arg value="India"/> </bean>
现在哪个构造函数将被调用?调用第一个int和String参数的构造函数是正确的,但是事实上将调用第二个构造函数。虽然我们知道第一个参数是int类型,第二个参数是String类型,但是Spring将他们都解释为Spring参数。为了避免这种情况,需要指定constructor-arg元素的type属性。现在bean配置属性如下,第一个构造函数将被调用。
- <bean id="user" class="com.vaannila.User" >
- <constructor-arg type="int" value="24"/>
- <constructor-arg type="java.lang.String" value="India"/>
- </bean>
<bean id="user" class="com.vaannila.User" > <constructor-arg type="int" value="24"/> <constructor-arg type="java.lang.String" value="India"/> </bean>
我们将User bean类的构造函数改为如下的情况:
- User(String name, int age)
- {
- this.name=name;
- this.age=age;
- }
- User( int age, String country)
- {
- this.age=age;
- this.country=country;
- }
User(String name, int age) { this.name=name; this.age=age; } User( int age, String country) { this.age=age; this.country=country; }
现在哪个构造函数将被调用那?调用第二个构造函数是正确的,但是实际情况是第一个构造函数被调用。这是因为当构造函数被调用的时候,在bean配置文件不会考虑参数出现的顺序。为了解决这个问题我们可以指定构造函数参数的索引数。
bean配置文件如下:
- <bean id="user" class="com.vaannila.User" >
- <constructor-arg index="0" type="int" value="24"/>
- <constructor-arg index="1" type="java.lang.String" value="India"/>
- </bean>
<bean id="user" class="com.vaannila.User" > <constructor-arg index="0" type="int" value="24"/> <constructor-arg index="1" type="java.lang.String" value="India"/> </bean>
现在,现在正确的构造函数将被调用。

676

被折叠的 条评论
为什么被折叠?



