1. 程式人生 > >@Autowired和@Resource的區別是什麼?(根據注入物件的型別還是名稱來查詢容器池中物件注入?)

@Autowired和@Resource的區別是什麼?(根據注入物件的型別還是名稱來查詢容器池中物件注入?)

@Autowired 與@Resource:
1、@Autowired與@Resource都可以用來裝配bean. 都可以寫在欄位上,或寫在setter方法上。

2、@Autowired預設按型別裝配(這個註解是屬業spring的),預設情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false,如:
@Autowired(required=false) ,如果我們想使用名稱裝配可以結合@Qualifier註解進行使用,如下:
Java程式碼
@Autowired() @Qualifier("baseDao")    
private BaseDao baseDao;
3、@Resource 是JDK1.6支援的註解
預設按照名稱進行裝配,名稱可以通過name屬性進行指定,如果沒有指定name屬性,當註解寫在欄位上時,預設取欄位名,按照名稱查詢,如果註解寫在setter方法上預設取屬性名進行裝配。當找不到與名稱匹配的bean時才按照型別進行裝配。但是需要注意的是,如果name屬性一旦指定,就只會按照名稱進行裝配。
<img src="https://pic4.zhimg.com/50/1d434624eb4918db0814529bbcfbc6b7_hd.png" data-rawwidth="201" data-rawheight="392" class="content_image" width="201">

只不過註解處理器我們使用的是Spring提供的,是一樣的,無所謂解耦不解耦的說法,兩個在便利程度上是等同的。

Java程式碼
@Resource(name="baseDao")    
private BaseDao baseDao; 
他們的主要區別就是@Autowired是預設按照型別裝配的 @Resource預設是按照名稱裝配的
byName 通過引數名 自動裝配,如果一個bean的name 和另外一個bean的 property 相同,就自動裝配。
byType 通過引數的資料型別自動自動裝配,如果一個bean的資料型別和另外一個bean的property屬性的資料型別相容,就自動裝配
-----------------------------------------------------------------------------------------------------------------------------------------
我們可以通過 @Autowired 或 @Resource 在 Bean 類中使用自動注入功能,但是 Bean 還是在 XML 檔案中通過 <bean> 進行定義 —— 也就是說,在 XML 配置檔案中定義 Bean,通過@Autowired 或 @Resource 為 Bean 的成員變數、方法入參或建構函式入參提供自動注入的功能。
比如下面的beans.xml
package com.wuxinliulei;

public class Boss {
    private Car car;
    private Office office;

    // 省略 get/setter

    @Override
    public String toString() {
        return "car:" + car + "\n" + "office:" + office;
    }
}


<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xmlns:context="http://www.springframework.org/schema/context"
     xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
 http://www.springframework.org/schema/context 
 http://www.springframework.org/schema/context/spring-context-2.5.xsd">
 
    <context:annotation-config/> 

    <bean id="boss" class="com.wuxinliulei.Boss"/>
    <bean id="office" class="com.wuxinliulei.Office">
        <property name="officeNo" value="001"/>
    </bean>
    <bean id="car" class="com.wuxinliulei.Car" scope="singleton">
        <property name="brand" value=" 紅旗 CA72"/>
        <property name="price" value="2000"/>
    </bean>
</beans>
定義了三個bean物件,但是沒有了我們書序的ref指向的內容
比如
<?xml version="1.0" encoding="UTF-8" ?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
 http://www.springframework.org/schema/beans/spring-beans-2.5.xsd">
    <bean id="boss" class="com.wuxinliulei.Boss">
        <property name="car" ref="car"/>
        <property name="office" ref="office" />
    </bean>
    <bean id="office" class="com.wuxinliulei.Office">
        <property name="officeNo" value="002"/>
    </bean>
    <bean id="car" class="com.wuxinliulei.Car" scope="singleton">
        <property name="brand" value=" 紅旗 CA72"/>
        <property name="price" value="2000"/>
    </bean>
</beans>

-------------------------------------------------------------------------------------------------------

spring2.5提供了基於註解(Annotation-based)的配置,我們可以通過註解的方式來完成注入依賴。在Java程式碼中可以使用 @Resource或者@Autowired註解方式來經行注入。雖然@Resource和@Autowired都可以來完成注入依賴,但它們之間是有區 別的。首先來看一下:

[email protected]預設是按照名稱來裝配注入的,只有當找不到與名稱匹配的bean才會按照型別來裝配注入;
[email protected]預設是按照型別裝配注入的,如果想按照名稱來轉配注入,則需要結合@Qualifier一起使用;
[email protected]註解是由JDK提供,而@Autowired是由Spring提供
 
@Resource的方式;
d. @Resource和@Autowired都可以書寫標註在欄位或者該欄位的setter方法之上

2、使用註解的方式,我們需要修改spring配置檔案的頭資訊,修改部分紅色標註,如下

<?xml version="1.0" encoding="UTF-8"?>
<beans http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="Index of /schema/context"
       xsi:schemaLocation="Index of /schema/beans 
http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
Index of /schema/context
http://www.springframework.org/schema/context/spring-context-2.5.xsd">
               
<context:annotation-config/>
     
</beans>

PS:

----------------------PS開始-------------------------------

在基於主機方式配置Spring的配置檔案中,你可能會見到

<context:annotation-config/>

這樣一條配置,他的作用是式地向 Spring 容器註冊

AutowiredAnnotationBeanPostProcessor
CommonAnnotationBeanPostProcessor
PersistenceAnnotationBeanPostProcessor
RequiredAnnotationBeanPostProcessor

這 4 個BeanPostProcessor。

註冊這4個BeanPostProcessor的作用,就是為了你的系統能夠識別相應的註解。

例如:

如果你想使用@Autowired註解,那麼就必須事先在 Spring 容器中宣告 AutowiredAnnotationBeanPostProcessor Bean。傳統宣告方式如下

<bean class="org.springframework.beans.factory.annotation. AutowiredAnnotationBeanPostProcessor "/> 

如果想使用@ Resource 、@ PostConstruct、@ PreDestroy等註解就必須宣告CommonAnnotationBeanPostProcessor

<bean class="org.springframework.beans.factory.annotation. CommonAnnotationBeanPostProcessor"/> 

如果想使用@PersistenceContext註解,就必須宣告PersistenceAnnotationBeanPostProcessor的Bean。

<bean class="org.springframework.beans.factory.annotation.PersistenceAnnotationBeanPostProcessor"/> 

如果想使用 @Required的註解,就必須宣告RequiredAnnotationBeanPostProcessor的Bean。

同樣,傳統的宣告方式如下:

<bean class="org.springframework.beans.factory.annotation.RequiredAnnotationBeanPostProcessor"/> 


一般來說,這些註解我們還是比較常用,尤其是Antowired的註解,在自動注入的時候更是經常使用,所以如果總是需要按照傳統的方式一條一條配置顯得有些繁瑣和沒有必要,於是spring給我們提供<context:annotation-config/>的簡化配置方式,自動幫你完成宣告。

不過,呵呵,我們使用註解一般都會配置掃描包路徑選項

<context:component-scan base-package=”XX.XX”/>

該配置項其實也包含了自動注入上述processor的功能,因此當使用 <context:component-scan/> 後,就可以將 <context:annotation-config/> 移除了。

比如:

<context:component-scan base-package="carPoolingController, carPoolingService, carPoolingDao" />

就把controller包下 service包下 dao包下的註解全部掃描了


----------------------------------------------PS結束------------------------------

3、修改以上配置檔案的頭資訊後,我們就可以在Java程式碼通過註解方式來注入bean,看下面程式碼

(1)@Resource

public class StudentService3 implements IStudentService {
    //@Resource(name="studentDao")放在此處也是可行的
    private IStudentDao studentDao;

    private String id;


    public void setId(String id) {
    this.id = id;
    }

@Resource(name="studentDao") // 通過此註解完成從spring配置檔案中查詢名稱為studentDao的bean來裝配欄位studentDao,如果spring配置檔案中不存在 studentDao名稱的bean則轉向按照bean型別經行查詢

public void setStudentDao(IStudentDao studentDao) {
        this.studentDao = studentDao;
}
public void saveStudent() {
        studentDao.saveStudent();
        System.out.print(",ID 為:"+id);
}
}
 

配置檔案新增如下資訊

<bean id="studentDao" class="com.wch.dao.impl.StudentDao">
</bean>

<bean id="studentService3" class="com.wch.service.impl.StudentService3"></bean>

(2)@Autowired

public class StudentService3 implements IStudentService {
  //@Autowired放在此處也是可行的
  private IStudentDao studentDao;

  private String id;
  
  public void setId(String id) {
       this.id = id;
   }

@Autowired

//通過此註解完成從spring配置檔案中 查詢滿足studentDao型別的bean
//@Qualifier("studentDao")則按照名稱經行來查詢轉配的
 public void setStudentDao(IStudentDao studentDao) {
       this.studentDao = studentDao;
  }


  public void saveStudent() {
       studentDao.saveStudent();
       System.out.print(",ID 為:"+id);
  }
}
 

配置檔案新增如下資訊

<bean id="studentDao" class="com.wch.dao.impl.StudentDao"></bean>
<bean id="studentService3" class="com.wch.service.impl.StudentService3" />

在java程式碼中可以使用@Autowire或者@Resource註解方式進行裝配,這兩個註解的區別是:
@Autowire 預設按照型別裝配,預設情況下它要求依賴物件必須存在如果允許為null,可以設定它required屬性為false,如果我們想使用按照名稱裝配,可 以結合@Qualifier註解一起使用;


@Resource預設按照名稱裝配,當找不到與名稱匹配的bean才會按照型別裝配,可以通過name屬性指定,如果沒有指定name屬 性,當註解標註在欄位上,即預設取欄位的名稱作為bean名稱尋找依賴物件,當註解標註在屬性的setter方法上,即預設取屬性名作為bean名稱尋找 依賴物件.

注意:如果沒有指定name屬性,並且按照預設的名稱仍然找不到依賴的物件時候,會回退到按照型別裝配,但一旦指定了name屬性,就只能按照名稱 裝配了.


--------------------------

當我們在xml裡面為類配置注入物件時,會發現xml檔案會越來越臃腫,維護起來很麻煩。這時候我們可以使用註解這種機制來為類配置注入物件。

java為我們提供了 javax.annotation.Resource這個註解。

spring框架提供了org.springframework.beans.factory.annotation.Autowired。

一般情況下我們使用 javax.annotation.Resource這個註解,因為這樣我們就能實現和spring框架的解藕(不能認同,因為註解處理器還是Spring提供的)。

@Resource可以作用於欄位和函式上。當作用於欄位上的時候,如果我們只是簡單的這樣寫

@Resource
PersonDao  p;

這時候spring注入p的過程是 1:先查詢xml中是否有id為p的元素

2:如果沒有找到,則看是否有name屬性(@Resource name=“”),有則查詢name

3:否則查詢PersonDao型別的元素

@Resource可作用於set函式上。

例如:

@Resource
public void setP(PersonDao p) {
  this.p = p;
}

@Autowired註解是根據型別進行查詢,比如PersonDao p,他會去xml檔案裡查詢型別為PersonDao的元素

相關推薦

@Autowired@Resource的區別是什麼?根據注入物件型別還是名稱查詢容器物件注入

@Autowired 與@Resource:1、@Autowired與@Resource都可以用來裝配bean. 都可以寫在欄位上,或寫在setter方法上。 2、@Autowired預設按型別裝配(這個註解是屬業spring的),預設情況下必須要求依賴物件必須存在,如果要允許null值,可以設定它的requ

spring的@Autowired @Resource 兩種註解的區別

      在面試的時候,面試官問我@Autowired 和 @Resource 兩種註解的區別,當時懵逼了,雖然是經常用,但具體區別還真是不知道。然後搜百度記錄下。。。 一、相同點     1. 都是用來裝配 Bean,都可以

FactoryBean結合@Autowired@Resource的使用產生的問題深究

前一篇文章已經簡單介紹了一下FactoryBean的簡單使用,接下來講一下使用註解的時候遇到的問題。 先講一下背景(其實就是上一篇文章的例子):ToolFactory實現了FactoryBean的介面,併產生了Tool這個Bean,在xml檔案中也定義了ToolFactory這個be

Spring@Autowired@Resource區別

兩者都是Spring中注入Bean的一種方式。 其實@Resource並不是Spring的註解,它的包是javax.annotation.Resource,需要匯入,但是Spring支援該註解的注入。 共同點 兩者都可以寫在欄位和setter方法上。(寫在欄位上就不用再寫setter

Spring 註釋 @Autowired @Resource區別

一、 @Autowired和@Resource都可以用來裝配bean,都可以寫在欄位上,或者方法上。 二、 @Autowired屬於Spring的;@Resource為JSR-250標準的註釋,屬於J2EE的。 三、 @Autowired預設按型別裝

@Autowired@Resource區別

1、@Autowired預設按型別裝配(這個註解是屬於spring的),預設情況下要求依賴物件必須存在,如果要允許null值,可以設定它的required屬性為false,如: @Autowired(required=false) ,如果我們想使用名稱裝配可以結

@ Autowired@Resource區別

一. @Autowired  (Spring中的註解)       1.它預設是按照型別進行匹配的,預設情況下必須要求依賴物件必須存在,如果要允許null 值,可以設定它的required屬性為false;       &

Spring註解autowiredresource區別

1、@Autowired與@Resource都可以用來裝配bean. 都可以寫在欄位上,或寫在setter方法上。 2、@Autowired預設按型別裝配(這個註解是屬業spring的),預設情況下必須要求依賴物件必須存在,如果要允許null 值,可以設定它的required屬性為false,如:@Auto

抽象介面的區別根據知乎大佬的討論整理

1、抽象類和介面都不能直接例項化。如果要例項化,涉及到多型。抽象類要例項化,抽象類定義的變數必須指向一個子類變數,這個子類繼承並實現了抽象類所有的抽象方法。介面要例項化,介面定義的變數必須指向一個子類變數,這個子類繼承並實現了介面所有的方法。2、抽象要被子類繼承,介面要被子類

FactoryBean結合@Autowired@Resource的使用產生的問題深究

前言 最近在使用FactoryBean的時候遇到了一些問題,在這裡記錄一下:首先是不明白FactoryBean的使用,查詢了資料很快也明白了它的原理,然後就是結合@Autowired和@Resource註解使用的時候出現了一些問題。 FactoryBean的使用

@Autowired@resource注入類的靜態屬性以及父類屬性

     靜態變數/類變數不是物件的屬性,而是一個類的屬性,spring則是基於物件層面上的依賴注入。 所以我們不能@Autowired(不報錯也不起作用)或者@resource(報錯)一個靜態變數,使之成為一個spring bean。 需要注意的是:@Autowired

Spring註解的實現原理-AutowiredResource區別

@Autowired和@Resource的區別: 在Java中使用@Autowired和@Resource註解進行裝配,這兩個註解分別是: 1、@Autowired按照預設型別(類名稱)裝配依賴物件,預設情況下它要求依賴物件必須存在,如果允許為null,可以

HTML提交方式postget區別實驗

des url action 通過 性別 清除數據 map pass pack HTML提交方式post和get區別(實驗) 一、post和get區別 get提交,提交的信息都顯示在地址欄中。 post提交,提交的信息不顯示地址欄中,顯示在消息體中。 二、客戶端代碼

IDEA 使用 @Autowired @Resource 時報錯

-1 autowire spa dea 報錯 方法 eid auto 使用 2017-07-12 解決方法: File -- Settings -- Eidtor -- Inspections --> Spring -- Spring Core -- Co

classmethodstaticmethod區別轉載

轉載 eth -a lan targe tween 內部 pytho -s 主要classmethod是被類直接調用使用 statifcmethod是在類內部訪問時候並且是能被類直接調用時候使用 原文鏈接地址:click classmethod和staticmethod區

mysqlvarcharchar區別思維導圖整理

var 但是 系統 mysql 由於 varchar .html nbsp 了解   由於mysql一直是我的弱項(其實各方面我都是很弱的),所以最近在看msyql,正好看到varchar和char區別,所以整理一下,便於以後遺忘。      0.0圖片已經說明一切,但是系

滲透日記20180125--每日點滴--URL?#的區別關於SSRF以及mysql的secure-file-priv

mysq www. transport post 這樣的 pan .com 並不是 aaa 零,緒論 20180125日,忙! 瞎比比總結一下,來滿足這是個日記的樣子。 1、今天談的並不是什麽技術【當然也不是沒有技術(都很基礎)】而是瞎幾把扯。 一、關於一種SSRF的檢測繞

JavaArrayListLinkedList區別

java linked .com -s lan font array href spa 具體詳情參考原博客: http://pengcqu.iteye.com/blog/502676Java中ArrayList和LinkedList區別(轉)

getParametergetAttribute區別超詳細分析

list 共享 ava 多個 設置 png 過程 技術分享 對象 getParameter和getAttribute區別(超詳細分析) (一)對getParameter過程,如下圖: (二)對getAttribute過程,如下圖 兩者區別: ①getPa

python實現城市省份字典根據城市判斷屬於哪個省份

lam ret pandas csv style .data 一份 輸出 以及 首先,在網上拿到一份數據,省份和城市的對應表: 第一張圖是省份以及對應的ID 第二張圖是省份和城市,以及分別對應的ID 基本的思路是:實現一個字典,省份作為鍵,省份包含的城市作為