@Autowired與@Resource的區別及其bean裝配詳解


            在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類在容器中進行查找。

  

發佈了33 篇原創文章 · 獲贊 88 · 訪問量 16萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章