@Autowired注解是由Spring提供的,它可以用來(lái)對(duì)構(gòu)造方法、成員變量及方法參數(shù)進(jìn)行標(biāo)注,它能夠根據(jù)對(duì)象類(lèi)型完成自動(dòng)注入,代碼如下。
public class Service {
? // 構(gòu)造方法注入
? @Autowired
? public Service(Service service) {
? ? ? this.service = service;
? }
? // 成員變量注入
? @Autowired
? private Service service;
? // 方法參數(shù)注入
? @Autowired
? public void setService(Service service) {
? ? ? this.service = service;
? }
}
再來(lái)看@Resource注解,代碼如下。
public class Service {
@Resource(name = "service1")
private Service service1;
@Resource(name = "service2")
private Service service2;
@Reource
private Service service3;
@Reource
private Service service4;
}
它是由JDK提供的,遵循JSR-250規(guī)范,是JDK 1.6及以上加入的新特性。作為Java的標(biāo)準(zhǔn),它的作用和@Autowired無(wú)區(qū)別。與@Autowired不同的是,它適用于所有的Java框架,而@Autowired只適用于Spring。讀者可以簡(jiǎn)單地理解為,@Resource能夠支持對(duì)象類(lèi)型注入,也能夠支持對(duì)象名稱(chēng)注入。
@Resource和@Autowired之間具體有哪些區(qū)別呢?
可以從以下5個(gè)方面來(lái)分析。
1.注解內(nèi)部定義的參數(shù)不同
@Autowired只包含一個(gè)required參數(shù),默認(rèn)為true,表示開(kāi)啟自動(dòng)注入。
public @interface Autowired {
? ? // 是否開(kāi)啟自動(dòng)注入,在不開(kāi)啟自動(dòng)裝配時(shí),可設(shè)為false
? boolean required() default true;
}
@Resource?包含7個(gè)參數(shù),其中最重要的兩個(gè)是name和type。
public @interface Resource {
? // Bean的名稱(chēng)
?
? String name() default "";
? String lookup() default "";
? ? // Java類(lèi),被解析為Bean的類(lèi)型
? Class<?> type() default java.lang.Object.class;
? enum AuthenticationType {
? ? ? ? ? CONTAINER,
? ? ? ? ? APPLICATION
? }
? // 身份驗(yàn)證類(lèi)型
?
? AuthenticationType authenticationType() default AuthenticationType.CONTAINER;
? // 組件是否可以與其他組件共享
? boolean shareable() default true;
? String mappedName() default "";
? ? // 描述
? String description() default "";
}
2.裝配方式的默認(rèn)值不同
@Autowired默認(rèn)按type自動(dòng)裝配,而@Resource默認(rèn)按name自動(dòng)裝配。@Resource注解可以自定義選擇裝配方式,如果指定name,則按name自動(dòng)裝配。如果指定type,則按type自動(dòng)裝配。
3.注解應(yīng)用的范圍不同
@Autowired能夠用在構(gòu)造方法、成員變量、方法參數(shù)及注解上,而@Resource能用在類(lèi)、成員變量和方法參數(shù)上,源碼如下。
@Target({ElementType.CONSTRUCTOR, ElementType.METHOD, ElementType.PARAMETER, ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface Autowired { ... }
@Target({TYPE, FIELD, METHOD})
@Retention(RUNTIME)
public @interface Resource { ... }
4.出處不同
@Autowired是Spring定義的注解,而@Resource遵循JSR-250的規(guī)范,定義在JDK中。所以@Autowired只能在Spring框架下使用,而@Resource則可以與其他框架一起使用。
5.裝配順序不同
@Autowired默認(rèn)先與byType進(jìn)行匹配,如果發(fā)現(xiàn)找到多個(gè)Bean,則又按照byName方式進(jìn)行匹配,如果還有多個(gè)Bean,則報(bào)出異常。裝配順序如下圖所示。
而@Resource的裝載順序分為如下4種情況。
1)如果同時(shí)指定name和type,則從Spring上下文中找到與它們唯一匹配的Bean進(jìn)行裝配,如果找不到則拋出異常,具體流程如下圖所示。
2)如果指定name,則從上下文中查找與名稱(chēng)(ID)匹配的Bean進(jìn)行裝配,如果找不到則拋出異常,具體流程如下圖所示。
3)如果指定type,則從上下文中找到與類(lèi)型匹配的唯一Bean進(jìn)行裝配,如果找不到或者找到多個(gè)就會(huì)拋出異常,具體流程如下圖所示。
4)如果既沒(méi)有指定name,也沒(méi)有指定type,則自動(dòng)按byName方式進(jìn)行裝配。如果沒(méi)有匹配成功,則仍按照type進(jìn)行匹配,具體流程如下圖所示。
下面這張表可以幫助大家更好地理解和區(qū)分@Autowired和@Resource。
總結(jié)一下,兩者在功能上差別不大,使用起來(lái)也差不多。但是,在日常開(kāi)發(fā)中建議使用@Autowired,有以下3個(gè)理由。
第1:@Autowired功能略強(qiáng)大。支持優(yōu)先注入、可以配置允許Bean不存在。
第2:若使用Spring框架,則使用其特有的注解更好一點(diǎn)。
第3:有人認(rèn)為@Resource更加通用,因?yàn)樗且粋€(gè)規(guī)范,其他框架也會(huì)支持。目前后端都在用Spring,沒(méi)有必要考慮其他框架。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-532965.html
面試點(diǎn)評(píng):我們可以直接告訴面試官這兩個(gè)注解的差異,同時(shí)基于兩個(gè)注解的特性解釋更多的差異,這樣可以更好地體現(xiàn)自己對(duì)這方面知識(shí)的理解深度。面試官想考查求職者對(duì)Spring依賴(lài)注入方式的理解,以及對(duì)@Autowired和@Resource兩個(gè)注解底層實(shí)現(xiàn)方面的區(qū)別的理解。求職者在理解了底層實(shí)現(xiàn)的差異后,回答這個(gè)問(wèn)題會(huì)比較容易。文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-532965.html
到了這里,關(guān)于每日一面系列-spring中@Autowired 和 @Resource 區(qū)別?的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!