@Autowird
@Autowird 屬於spring框架,默認使用類型(byType)進行注入,例如下面代碼:
@Autowired
public IUserService userService
系統會根據IUserService接口進行注入,如果這個接口只有一個實現類,那麼會正常注入,如果有多個實現類,他會報錯,如果沒有實現類,它也會報錯。可以對這個問題進行限定,如下面的代碼:
@Autowired(required = false)
public IUserService userService
如果找不到對應的bean時候,不會拋出錯誤,如果required = true,當不存在bean時候,就會拋出異常
可以使用 @Qualifier 配合 @Autowird
使用,@Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName。 如下面代碼
@Autowired
@Qualifier("userServiceImpl")
public IUserService userService;
// 或者
@Autowired
public void setUserDao(@Qualifier("userDao") UserDao userDao) {
this.userDao = userDao;
}
這樣spring會根據@Qualifier指定的id進行注入(依據ID查詢對應的bean)
@Resource
@Resource是JavaEE自帶的註解,根據ID進行注入的。@Resource的作用相當於@Autowired,只不過@Autowired按byType自動注入,而@Resource默認按byName自動注入
罷了。
@Resource有兩個屬性是比較重要的,分是name和type,Spring將@Resource註解的name屬性解析爲bean的名字,而type屬性則解析爲bean的類型。所以如果使用name屬性,則使用byName的自動注入策略,而使用type屬性時則使用byType自動注入策略。如果既不指定name也不指定type屬性,這時將通過反射機制使用byName自動注入策略。
@Resource裝配順序
-
如果同時指定了name和type,則從Spring上下文中找到唯一匹配的bean進行裝配,找不到則拋出異常
-
如果指定了name,則從上下文中查找名稱(id)匹配的bean進行裝配,找不到則拋出異常
-
如果指定了type,則從上下文中找到類型匹配的唯一bean進行裝配,找不到或者找到多個,都會拋出異常
-
如果既沒有指定name,又沒有指定type,則自動按照byName方式進行裝配;如果沒有匹配,則回退爲一個原始類型進行匹配
總結
-
@Autowired註解是按類型裝配依賴對象,默認情況下它要求依賴對象必須存在,如果允許null值,可以設置它required屬性爲false。
-
@Resource 註解和 @Autowired 一樣,也可以標註在字段或屬性的setter方法上,但它默認按名稱裝配。名稱可以通過@Resource的name屬性指定,如果沒有指定name屬性,當註解標註在字段上,即默認取字段的名稱作爲bean名稱尋找依賴對象,當註解標註在屬性的setter方法上,即默認取屬性名作爲bean名稱尋找依賴對象。
-
@Resources按名字裝配對象,是 JDK 自帶的;而@Autowired按類型裝配對象,是 Spring 框架的。