注入依赖对象可以采用手工装配或自动装配,在实际应用中建议使用手工装配,因为自动装配会产生未知情况,开发人员无法预见最终的装配结果。

手工装配依赖对象 

手工装配依赖对象,在这种方式中又有两种编程方式

  1. 在xml配置文件中,通过在bean节点下配置,上边博客已经讲解,再次不在缀余。
  1. 在java代码中使用@Autowired或@Resource注解方式进行装配。但我们需要在xml配置文件中配置以下信息:

 

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
 
 
 
           http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 
           http://www.springframework.org/schema/context
 
>
 
<context:annotation-config/>
 
</beans>

PS:

 
1
<context:annotation-config/>

这个配置隐式注册了多个对注解进行解析处理的处理器:AutowiredAnnotationBeanPostProcessor,CommonAnnotationBeanPostProcessor,PersistenceAnnotationBeanPostProcessor,RequiredAnnotationBeanPostProcessor

PS:之前我写过注解原理的博客,再此多说一句,注解本身和xml一样都是用于配置的,本身并不能干活,它之所以能干活,是因为它背后存在着处理器(也就是对应api)。

PS: 需要引入common-annotations.jar文件。

@Autowired和@Resource注解详解

在java代码中使用@Autowired或@Resource注解方式进行装配,这两个注解的区别是:@Autowired 默认按类型装配,@Resource默认按名称装配,当找不到与名称匹配的bean才会按类型装配。

 
1
2
3
4
5
6
@Autowired 
//用于字段上
@Autowired
//用于属性的setter方法上
;
}

@Autowired注解是按类型装配依赖对象,默认情况下它要求依赖对象必须存在,如果允许null值,可以设置它required属性为false。如果我们想使用按名称装配,可以结合@Qualifier注解一起使用。如下:

 
1
2
)
;

@Resource注解和@Autowired一样,也可以标注在字段或属性的setter方法上,但它默认按名称装配。名称可以通过@Resource的name属性指定,如果没有指定name属性,当注解标注在字段上,即默认取字段的名称作为bean名称寻找依赖对象,当注解标注在属性的setter方法上,即默认取属性名作为bean名称寻找依赖对象。

 
1
2
)
//用于字段上

注意:如果没有指定name属性,并且按照默认的名称仍然找不到依赖对象时, @Resource注解会回退到按类型装配。但一旦指定了name属性,就只能按名称装配了。

PS:@Resource在jdk中已经存在,不属于Spring,所以尽量使用这个注解。

编码剖析@Resource的原理:

自定义注解(模仿@Resource):

 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
;
 
;
;
;
;
 
;
/*
* 现在没法工作,只是一些配置信息
*/
)
)
{
;
}

PersonSevicebean:

 
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
;
 
;
;
;
 
{
 
;
 
;
{
  
}
{
;
;
;
}
 
{
;
}
 
{
;
}
 
{
;
}
@zmcResource
{
;
}
 
{
;
}
}

自定义注解(zmcResource)处理器:

 
 
 
 
 
 
Java
 
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
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
;
 
;
;
;
;
;
;
;
;
;
;
;
 
;
;
;
;
/*
* 简单模拟Spring容器
*/
{
    
;
;
 
{
;
;
;
//依赖注入
}
/*
* 暂且把zmcResouce处理器写在这里
*/
{
{
;
{
{
;
{
//获得属性的setter方法
;
//判断是否存在zmcResource注解
;
{
;
 
//没有设置name属性,即取得属性名称
;
//这时按类型
{
//两者类型是否匹配,前者类型是否是后者的父类或接口
;
;
}
}
}
}
;
 
}
}
;
{
{
;
;
{
;
{
;
{
{
{
;
;
}
}
}
}
;
;
 
}
 
}
}
{
;
}
}
}
 
}
/*
* 为bean属性注入值
*/
{
 
{
//此时bean还没有注入
//下面开始进行依赖注入
{
//取得bean的属性描述
{
//bean的属性
//用户配置文件中定义的属性
{
//判断配置文件中属性的名称和bean中属性的名称是否相同
{
;
{
{
;
{
;
{
// TODO Auto-generated catch block
;
{
// TODO Auto-generated catch block
;
{
// TODO Auto-generated catch block
;
//把引用对象注入到属性
}
}
 
}
}
}
 
{
// TODO Auto-generated catch block
;
}
}
}
}
 
/*
* 完成bean的实例化
*/
{
{
{
;
{
// TODO Auto-generated catch block
;
{
// TODO Auto-generated catch block
;
{
// TODO Auto-generated catch block
;
}
}
}
 
/*
* 读取XMl配置文件
* @param filename
*/
{
;
;
{
;
;
;
//加入命名空间
//创建beans/bean查询路径
//设置命名空间
;
{
;
;
;
       
//nodename(节点名称):表示选择该节点的所有子节点
;
;
{
;
;
;
;
;
}
;
}
}
{
;
}
}
 
/*
* 获取bean实例
*/
{
;
}
}

相关文章:

  • 2021-06-15
  • 2022-01-20
  • 2021-07-21
  • 2021-05-27
  • 2021-07-01
猜你喜欢
  • 2021-06-28
  • 2021-12-19
  • 2021-11-09
  • 2022-12-23
  • 2022-12-23
  • 2021-09-12
相关资源
相似解决方案