還在使用@Autowired 嗎?
既然標(biāo)題說了不推薦使用 @Autowired 那肯定有好的代替它的啦,那就是@Resource 。那 @Resource 是什么呢?下面我們?nèi)Ρ认?@Resource 和 @Autowired 的區(qū)別吧!
區(qū)別一
@Autowired 是 Spring 自帶的注解 @Resource 是 J2EE提供,Spring 支持
區(qū)別二
@Autowired 默認(rèn)按類型裝配 @Resource 默認(rèn)按照名稱進(jìn)行裝配
我們一起看看 @Resource 的源碼。
@Target({ElementType.TYPE, ElementType.METHOD, ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
public @interface Resource {
String name() default "";
Class<?> type() default Object.class;
Resource.AuthenticationType authenticationType() default Resource.AuthenticationType.CONTAINER;
boolean shareable() default true;
String description() default "";
String mappedName() default "";
String lookup() default "";
public static enum AuthenticationType {
CONTAINER,
APPLICATION;
private AuthenticationType() {
}
}
}
從上面看到 @Resource 有兩個重要的屬性:name 和 type 。
上面雖然說了 "默認(rèn)按照名稱進(jìn)行裝配" 但是可以按照類型處理。
Spring 將 @Resource 注解的 name 屬性解析為 bean 的名字,type 屬性則解析為 bean 的類型。所以如果使用 name 屬性,則使用 byName 的自動注入策略,而使用 type 屬性則使用 byType 自動注入策略。如果既不指定 name 也不指定 type 屬性,這時將通過反射機制使用 byName 自動注入策略。
上面的話就是介紹了 @Resource 裝配順序:
1 如果同時指定了 name 和 type ,則從 Spring 上下文中找到唯一匹配的 bean 進(jìn)行裝配,找不到則拋出異常 2 如果指定了 name ,則從 Spring 上下文中查找名稱(id)匹配的 bean 進(jìn)行裝配,找不到則拋出異常 3 如果指定了 type ,則從 Spring 上下文中找到類型匹配的唯一 bean 進(jìn)行裝配,找不到或找到多個,都拋出異常 4 如果既沒指定 name ,也沒指定 type ,則自動按照 byName 方式進(jìn)行裝配。如果沒有匹配,則回退為一個原始類型進(jìn)行匹配,如果匹配則自動裝配。
@Resource 大致講完了,是不是感覺 @Autowired 和 @Resource 都差不多,只不過一個是根絕類型,一個是根據(jù)名稱注入,什么建議使用 @Resource 呢?
這么說吧,因為 @Resource 是 java 自帶的!以及在 idea 中不會有黃色提示線。而如果用 @Autowired 則 idea 會提示 "不建議使用字段注入 "。這可是喜歡干凈的人的福利呀,為什么你還不用上呢?

評論
圖片
表情
