在Java的web開發中,經常會用到spring框架中的bean注入。而其中bean注入可以通過類型查找或者名稱查找。就會用到了@Autowired和@Resource註解。
兩者有時候會比較容易混淆,在此,就將兩者進行簡單的大體上的區分。
===================================
1、@Autowired與@Resource都可以用來裝配bean. 都可以寫在字段上,或寫在setter方法上。 @Autowired也可以直接寫在需要注入的屬性上。
@Autowired
private TestXlService testXlService; //通過屬性類型進行裝配
@Autowired
private DemoService demoService;
2、@Autowired默認按類型裝配(這個註解是屬業spring的),默認情況下必須要求依賴對象必須存在,如果要允許null 值,
可以設置它的required屬性爲false,如:@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier註解進行使用,如下:
@Autowired() @Qualifier("baseDao")
private BaseDao baseDao;
3、@Resource(這個註解屬於J2EE的),默認安照名稱進行裝配,名稱可以通過name屬性進行指定,
如果沒有指定name屬性,當註解寫在字段上時,默認取字段名進行按照名稱查找,如果註解寫在setter方法上默認取屬性名進行裝配。
當找不到與名稱匹配的bean時才按照類型進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。
@Resource(name="baseDao") //在字段上的注入,先按照名字裝配
private BaseDao baseDao;
@Resource(name = "entityManagerFactory")
public void setEMF(EntityManagerFactory entityManagerFactory) {
super.setEntityManagerFactory(entityManagerFactory);
}
其中,還是比較建議使用@Resource註解,且這個註解是屬於J2EE規範的。減少了與其他框架如spring的耦合。
那麼,在結合spring框架對bean進行注入的時候,通過bean名稱查找和通過類型查找有什麼區別?
例如:
private UserDao userdao;
名稱查找:就是通過userdao該屬性名稱在容器中查找id爲userdao的bean。
類型查找:在容器中查找類型爲UserDao的bean實體類。【通過全限定名】
@Resource註解在字段上好在set方法上的註解區別?
1.@Resource應用在字段上,則注入規則是:
a.先使用字段名字匹配bean,查找到bean則注入,如果類型不匹配則此時有異常,注入失敗。
b.如果字段名字沒有匹配到Bean則spring會嘗試採用字段類型匹配,如果找打bean則注入,如果字段類型是接口則有可能會匹配到多個類型,則會拋出匹配到多個bean的異常, 注入失敗。
2.@Resource應用在setter上(應用到屬性),則注入規則是:
a.先使用屬性名字匹配bean,查找到bean則注入,如果類型不匹配則此時有異常,注入失敗。
b.如果屬性名字沒有匹配到Bean則spring會嘗試採用屬性參數類型匹配,如果找打bean則注入,如果屬性參數類型是接口則有可能會匹配到多個類型,則會拋出匹配到多個bean的異常.注入失敗。
注意是屬性的參數類型,並不是屬性的類型,注意區別 例如:
@Resource
private void setUserDao(Dao dao);
當先使用字段名字UserDao查找bean,找不到時候,就用參數類型Dao類在容器中進行查找。