@Resource
的作用相當(dāng)于 @Autowired
,只不過(guò) @Autowired
按 byType 自動(dòng)注入,面 @Resource
默認(rèn)按 byName 自動(dòng)注入罷了。@Resource
有兩個(gè)屬性是比較重要的,分別是 name 和 type,Spring 將 @Resource
注釋的 name 屬性解析為 Bean 的名字,而 type
屬性則解析為 Bean 的類(lèi)型。所以如果使用 name 屬性,則使用 byName 的自動(dòng)注入策略,而使用 type 屬性時(shí)則使用 byType
自動(dòng)注入策略。如果既不指定 name 也不指定 type 屬性,這時(shí)將通過(guò)反射機(jī)制使用 byName 自動(dòng)注入策略。
Resource 注釋類(lèi)位于 Spring 發(fā)布包的 lib/j2ee/common-annotations.jar
類(lèi)包中,因此在使用之前必須將其加入到項(xiàng)目的類(lèi)庫(kù)中。來(lái)看一個(gè)使用 @Resource
的例子:
清單 16. 使用 @Resource 注釋的
Boss.java
package com.baobaotao; import javax.annotation.Resource; public class Boss { // 自動(dòng)注入類(lèi)型為 Car 的 Bean @Resource private Car car; // 自動(dòng)注入 bean 名稱(chēng)為 office 的 Bean @Resource(name = "office") private Office office; } |
一般情況下,我們無(wú)需使用類(lèi)似于 @Resource(type=Car.class)
的注釋方式,因?yàn)?Bean 的類(lèi)型信息可以通過(guò)
Java 反射從代碼中獲取。
要讓 JSR-250 的注釋生效,除了在 Bean 類(lèi)中標(biāo)注這些注釋外,還需要在 Spring 容器中注冊(cè)一個(gè)負(fù)責(zé)處理這些注釋的 BeanPostProcessor
:
<bean
class="org.springframework.context.annotation.CommonAnnotationBeanPostProcessor"/> |
CommonAnnotationBeanPostProcessor
實(shí)現(xiàn)了 BeanPostProcessor
接口,它負(fù)責(zé)掃描使用了 JSR-250 注釋的
Bean,并對(duì)它們進(jìn)行相應(yīng)的操作。