@Autowired 與@Resource註解的區別

區別:

@Autowired默認是按類型裝配,且這個註解是屬於spring的,默認情況下必須要求依賴對象必須存在,如果要運行null值,可以設置它的required屬性爲false,即@Autowired(required=false)。如果我們想使用名稱裝配可以結合@Qualifier註解進行使用,如下:

@Resource默認是按照名稱來進行裝配。名稱可以通過name屬性進行指定,如果沒有指定name屬性,當註解寫在字段上時,默認取字段名,按照名稱查找,如果註解寫在setter方法上默認取屬性名進行裝配。當找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。

怎麼理解按類型裝配還是按照名稱轉配?

比如我們定義兩個class爲com.test.User類的bean,其中一個beanid爲user1,另一個beanid爲user2。

<beanid="staff"class="com.test.Staff"/>
 
<beanid="user1"class="com.test.User">
<property name="name"value="zhangsan"/></bean>
 
<beanid="user2"class="com.test.User">
<property name="name"value="lisi"/></bean>

下面我們爲bean staff注入bean User

public class Staff{    
    @Autowired    
    private User user;
}

上面我們說過@Autowired是按類型裝配,那麼此時它就會根據com.test.User,找到兩個bean,user1和user2,當我們運行上面的例子,則會拋出異常,Caused by: org.springframework.beans.factory.NoSuchBeanDefinitionException:    No unique bean of type [com.test.User] is defined:       expected single matching bean but found2: [user1, user2],此時我們需要使用@Qualifier,標註具體是注入哪個bean。

public class Staff{    
    @Resource(name="user1") 
    private User user;
}

而@Resource是按名稱裝配,我們只需要通過name指定bean即可。

public class Staff{    
    @Resource(name="user1") 
    private User user;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章