@Resource、@Autowired、@Qualifier的註解注入及區別

在Java代碼中能夠使用 @Resource  或者 @Autowired 註解方式來進行注入。 雖然 @Resource 和 @Autowried 均可以完成依賴注入,可是他們是有區別的java

@Resource

默認是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean纔會按照類型來注入。spring

它有兩個屬性是比較重要的:ui

  1. name: Spring 將 name 的屬性值解析爲 bean 的名稱, 使用 byName 的自動注入策略
  2. type: Spring 將 type的屬性值解析爲 bean 的類型,使用 byType 的自動注入策略

若是既不指定 name 屬性又不指定 type 屬性,Spring這時經過反射機制使用 byName 自動注入策略this

@Resource 的裝配順序spa

  1. 若是同時指定了 name 屬性和 type 屬性,那麼 Spring 將從容器中找惟一匹配的 bean 進行裝配,找不到則拋出異常
  2. 若是指定了 name 屬性值,則從容器中查找名稱匹配的 bean 進行裝配,找不到則拋出異常
  3. 若是指定了 type 屬性值,則從容器中查找類型匹配的惟一的 bean 進行裝配,找不到或者找到多個都會拋出異常
  4. 若是都不指定,則會自動按照 byName 方式進行裝配, 若是沒有匹配,則回退一個原始類型進行匹配,若是匹配則自動裝配

@Autowried

默認是按照類型進行裝配注入,默認狀況下,它要求依賴對象必須存在,若是容許 null 值,能夠設置它 required 爲false。.net

若是咱們想要按名稱進行裝配的話,能夠添加一個 @Qualifier 註解解決。code

@Autowried
@Qualifier("adminDAO")
private AdminDAO adminDAO;

@Resource 註解是 J2EE 提供的, 而 @Autowried 是 Spring 提供的,若是想減小對 Spring 的依賴建議使用 @Resource 方法。對象

@Resource 和 @Autowried 均可以加在字段的 setter 方法上。blog

@Autowired是根據類型進行自動裝配的。若是當spring上下文中存在不止一個UserDao類型的bean時,就會拋出BeanCreationException異常;若是Spring上下文中不存在UserDao類型的bean,也會拋出BeanCreationException異常。咱們能夠使用@Qualifier配合@Autowired來解決這些問題。以下代碼所示:get

①可能存在多個UserDao實例

@Autowired   
@Qualifier("userServiceImpl")   
public IUserService userService;

或者

@Autowired   
public void setUserDao(@Qualifier("userDao") UserDao userDao) {   
    this.userDao = userDao;   
} 

這樣Spring會直接找id爲userServiceImpl和userDao的bean進行裝配,從而解決多個bean形成的異常問題。

相關文章
相關標籤/搜索