所谓依赖注入就是指:在运行期,由外部容器动态地将依赖对象注入到组件中。
使用构造器注入
|
1
2
3
4
|
//构造器注入
>
//构造器注入
|
PS:其中index的值代表构造器的第几个参数,type代表属性类型,value的值的类型为基本类型,ref的值为引用bean的名字。
范例:
配置文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
|
?>
>
</bean>
</constructor-arg>
</constructor-arg>
</bean>
</beans>
|
依赖对象类:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
|
;
;
;
{
;
;
{
;
;
;
}
{
;
}
{
;
}
{
;
}
{
;
}
{
;
;
}
}
|
使用属性setter方法注入
基本类型对象注入:
|
1
2
3
|
>
>
>
|
示例:
配置文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
?>
>
>
>
>
>
>
>
>
|
bean类:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
;
;
;
{
;
;
;
{
;
}
{
;
}
{
;
}
{
;
}
{
;
}
{
;
}
{
;
;
;
}
}
|
注入其他bean:
方式一
|
1
2
3
4
|
>
>
>
>
|
PS:其中name为属性名称,ref是要注入bean的名称
示例:
DAO层:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
;
{
;
}
;
;
{
{
;
}
}
|
业务层:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
;
;
;
{
;
{
;
}
{
;
}
{
;
}
}
|
测试:
|
1
2
3
4
|
;
;
;
;
|
配置文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
|
?>
>
</bean>
</property>
</bean>
</beans>
|
测试结果:执行dao的方法
方式二(使用内部bean,但该bean不能被其他bean使用,不推荐)
|
1
2
3
4
5
|
</property>
</bean>
|
集合类型的装配:
Spring可以对集合类型进行注入包括:Set集合,properties属性集合,Map集合以及List集合。
注入方式如下:
配置文件:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
|
<list>
</value>
</value>
</list>
</property>
<set>
</value>
</value>
</set>
</property>
<map>
</map>
</property>
<props>
</prop>
</prop>
</props>
</property>
</bean>
|
编码模拟Spring使用属性setter方法注入的原理:
简单模拟的Spring容器:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
|
;
;
;
;
;
;
;
;
;
;
;
;
;
;
;
/*
* 简单模拟Spring容器
*/
{
//保存bean的信息
//引用所有bean对象
{
;
;
//依赖注入
}
/*
* 为bean属性注入值
*/
{
{
//此时bean还没有注入
//下面开始进行依赖注入
{
//取得bean的属性描述
{
//bean的属性
//用户配置文件中定义的属性
{
//判断配置文件中属性的名称和bean中属性的名称是否相同
{
//获得属性的setter方法
{
;
{
;
{
;
//把引用对象注入到属性
}
{
.
}
/*
* 完成bean的实例化
*/
{
{
{
;
{
// TODO Auto-generated catch block
;
}
}
}
/*
* 读取XMl配置文件
* @param filename
*/
{
;
;
{
;
;
;
//加入命名空间
//创建beans/bean查询路径
//设置命名空间
;
{
;
;
;
//nodename(节点名称):表示选择该节点的所有子节点
;
;
{
;
;
;
;
}
;
}
}
{
;
}
}
/*
*获取bean实例
*/
{
;
}
}
|
Bean属性信息:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
|
;
;
;
{
;
;
;
{
;
}
{
;
}
{
;
}
{
;
;
;
}
{
;
}
{
;
}
{
;
}
{
;
}
}
|
Property信息:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
|
;
{
{
;
;
;
}
{
;
}
{
;
}
{
;
}
{
;
}
;
;
}
|
测试类:
|
1
2
3
4
5
6
7
8
|
@Test
{
;
;
;
}
|