Spring Note 5:构造函数注入

Recap

之前讨论了setter方法注入,要求在pojo类中要有对应属性的set方法,然后在xml文件中通过标签实现注入。
例如:
User.java:

1
2
3
4
5
6
7
8
9
10
11
public class User {
private String name;

public void setName(String name) {
this.name = name;
}

public void show() {
System.out.println("name="+name);
}
}

beans.xml:

1
<property name="name" value="xliu"/>

构造器注入

除了setter方法注入之外,还有构造器注入,这种方法要求pojo类中有构造函数,不要求set方法。xml文件中使用标签<constructor-arg>
例如:
User.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class User {
private String name;

public User(String name) {
this.name = name;
}

public String getName() {
return name;
}

public void show() {
System.out.println("name="+name);
}
}

beans.xml:

1
<constructor-arg name="name" value="xliu"/>

其他数据类型

除了基本的数据类型,int,String之类的,还有Map和List类型,其在xml中对应的配置标签如下。
User.java:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
public class User {
private String name;
private List<String> dream;
private Map<String,String> score;

public User(String name, List<String> dream, Map<String, String> score) {
this.name = name;
this.dream = dream;
this.score = score;
}

@Override
public String toString() {
return "User{" +
"name='" + name + '\'' +
", dream=" + dream +
", score=" + score +
'}';
}
}

beans.xml:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<bean id="user" class="com.xliu.pojo.User">
<constructor-arg name="name" value="xliu"/>
<constructor-arg name="dream">
<list>
<value>programmer</value>
<value>travel</value>
</list>
</constructor-arg>
<constructor-arg name="score">
<map>
<entry key="math" value="90"/>
<entry key="science" value="80"/>
</map>
</constructor-arg>
</bean>

输出:

1
User{name='xliu', dream=[programmer, travel], score={math=90, science=80}}

同理,数组对应的标签为<array>,set对应的标签为<set>