@Autowired注解是由Spring提供的,它可以用來對(duì)構(gòu)造方法、成員變量及方法參數(shù)進(jìn)行標(biāo)注,它能夠根據(jù)對(duì)象類型完成自動(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;
}
}
再來看@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無區(qū)別。與@Autowired不同的是,它適用于所有的Java框架,而@Autowired只適用于Spring??梢院唵蔚乩斫鉃椋珸Resource能夠支持對(duì)象類型注入,也能夠支持對(duì)象名稱注入。
@Resource和@Autowired之間具體有哪些區(qū)別呢?
可以從以下5個(gè)方面來分析。
1、注解內(nèi)部定義的參數(shù)不同
@Autowired只包含一個(gè)required參數(shù),默認(rèn)為true,表示開啟自動(dòng)注入。
public @interface Autowired {
// 是否開啟自動(dòng)注入,在不開啟自動(dòng)裝配時(shí),可設(shè)為false
boolean required() default true;
}
?@Resource 包含7個(gè)參數(shù),其中最重要的兩個(gè)是name和type。
public @interface Resource {
//資源的JNDI名稱。在spring的注入時(shí),指定bean的唯一標(biāo)識(shí)。
String name() default "";
//引用指向的資源的名稱。它可以使用全局JNDI名稱鏈接到任何兼容的資源。
String lookup() default "";
//Java類,被解析為Bean的類型
Class<?> type() default java.lang.Object.class;
//身份認(rèn)證的類型
enum AuthenticationType {
CONTAINER,
APPLICATION
}
//指定資源的身份驗(yàn)證類型。它只能為任何受支持類型的連接工廠的資源指定此選項(xiàng),而不能為其他類型的資源指定此選項(xiàng)。
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能用在類、成員變量和方法參數(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,則從上下文中查找與名稱(ID)匹配的Bean進(jìn)行裝配,如果找不到則拋出異常,具體流程如下圖所示。
3)如果指定type,則從上下文中找到與類型匹配的唯一Bean進(jìn)行裝配,如果找不到或者找到多個(gè)就會(huì)拋出異常,具體流程如下圖所示。?
4)如果既沒有指定name,也沒有指定type,則自動(dòng)按byName方式進(jìn)行裝配。如果沒有匹配成功,則仍按照type進(jìn)行匹配,具體流程如下圖所示。
?
下面這張表可以幫助更好地理解和區(qū)分@Autowired和@Resource。
?總結(jié)一下,兩者在功能上差別不大,使用起來也差不多。但是,在日常開發(fā)中建議使用@Autowired,有以下3個(gè)理由。
-
@Autowired功能略強(qiáng)大。支持優(yōu)先注入、可以配置允許Bean不存在。
-
若使用Spring框架,則使用其特有的注解更好一點(diǎn)。
-
有人認(rèn)為@Resource更加通用,因?yàn)樗且粋€(gè)規(guī)范,其他框架也會(huì)支持。目前后端都在用Spring,沒有必要考慮其他框架。文章來源:http://www.zghlxwxcb.cn/news/detail-517134.html
面試點(diǎn)評(píng):我們可以直接告訴面試官這兩個(gè)注解的差異,同時(shí)基于兩個(gè)注解的特性解釋更多的差異,這樣可以更好地體現(xiàn)自己對(duì)這方面知識(shí)的理解深度。面試官想考查求職者對(duì)Spring依賴注入方式的理解,以及對(duì)@Autowired和@Resource兩個(gè)注解底層實(shí)現(xiàn)方面的區(qū)別的理解。求職者在理解了底層實(shí)現(xiàn)的差異后,回答這個(gè)問題會(huì)比較容易。文章來源地址http://www.zghlxwxcb.cn/news/detail-517134.html
到了這里,關(guān)于五個(gè)維度,解析 Spring 中 @Autowired 和 @Resource 的區(qū)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!