内射老阿姨1区2区3区4区_久久精品人人做人人爽电影蜜月_久久国产精品亚洲77777_99精品又大又爽又粗少妇毛片

@AutoWired與@Resource-創(chuàng)新互聯(lián)

參考 :

創(chuàng)新互聯(lián)是一家網(wǎng)站設(shè)計公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營產(chǎn)品:響應(yīng)式網(wǎng)站設(shè)計、品牌網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動的體驗,以及在手機等移動端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站制作、成都網(wǎng)站設(shè)計、移動互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運營、VI設(shè)計、云產(chǎn)品.運維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價值服務(wù)。

@Qualifier - 搜索結(jié)果 - 知乎

@Autowired和@Resource的區(qū)別是什么? - 知乎

面試突擊78:@Autowired 和 @Resource 有什么區(qū)別? - 掘金

目錄

同一類型多個@Bean報錯問題

@Resource注解

@Resource的查找順序

@Resource注解實現(xiàn)依賴注入

@Resource的來源

@Resource的方法參數(shù)

@Resource注解的應(yīng)用范圍

@AutoWired

@AutoWired查找順序

@AutoWired依賴注入方式

@AutoWired來源

@AutoWired方法參數(shù)

@AutoWired注解作用范圍

@AutoWired與@Resource的區(qū)別

@Qualifier

@primary

解決同一類型Bean報錯的問題

使用Resource注解解決

使用@AutoWired注解 + @Qualifier注解解決

使用@primary注解解決


我們通過一個小栗子/一個問題,引出@AutoWired注解和@Resource注解還有@Qualifier注解,利用注解解決這個問題,然后在講解@AutoWired注解和@Resource注解以及有啥區(qū)別...

同一類型多個@Bean報錯問題

引出一個問題如果同一個類型有多個@Bean

換句話說就是在依賴注入的時候,我們注入一個Bean的時候,Spring中有多個Bean的類型與這個Bean的類型是一樣的,但名稱不同(Bean名稱是唯一的) 這樣會有什么問題呢?

這樣說可能還是有一點抽象,我們就來舉一個例子把.

比如我現(xiàn)在要注入一個名字為user的對象/Bean

@Autowired
private User user;

但是Spring中存在多個User類型的Bean. 比如下面:

@Configuration
public class UserBeans {
    @Bean(name = "user_1")
    public User user1(){
        User user = new User();
        user.setId(21);
        user.setAge(19);
        user.setName("UserBeans-->張三");
        return user;
    }
    @Bean(name = "user_2")
    public User user2(){
        User user = new User();
        user.setId(21);
        user.setAge(19);
        user.setName("UserBeans-->張三");
        return user;
    }
}
//------------StudentUserBeans與上面不是一個類---------
@Configuration
public class StudentUserBeans {
    @Bean(name = "stu_user1")
    public User user1(){
        User user = new User();
        user.setId(21);
        user.setAge(19);
        user.setName("StudentUserBeans-->張三");
        return user;
    }
}

現(xiàn)在有三個類型為User的Bean,但是三個Bean的名稱并不一樣,因為Spring中規(guī)定Bean的名稱(也就是id)是唯一的.

當(dāng)我們運行的時候會發(fā)生什么呢???

什么辦法可以解決呢 ?

最簡單最直接的辦法就是,你在存儲一個名稱為user的Bean,或者將一個Bean的名稱修改為Bean.

如果我非要使用那三個其中一個Bean呢?該怎么辦?

有兩種方法 :

  • 第一種方法 : 使用Resource注解使用自帶的name參數(shù)來指定使用的Bean名稱
  • 第二種方法 : 使用AutoWired注解注入,并且使用Qualifier來進行篩選
  • 第三種方法 : 使用primary注解

我先分別講解這幾個注解,然后在來解決這個問題

@Resource注解 @Resource的查找順序

既指定name又指定type

如果既指定name又指定type,他就會在Spring查找name和type唯一匹配的bean,如果沒有找到就會拋出異常.

只指定name

如果只指定了name的情況,他就會在Spring中查找name唯一匹配的bean,如果找到了則自動裝配,沒有找到則拋出異常,

只指定type

如果只指定了type,那么在Spring中查找type唯一匹配的bean,如果沒有找到就拋出異常.

既沒有指定name,也沒有指定type

好我們在來整體總結(jié)一下 :

依賴注入的功能,是通過先在 Spring IoC 容器中查找對象(分為類型和名稱兩種查找方式),再將對象注入引入到當(dāng)前類中

@Resource的查找順序分為如下四種方式 :

  • 當(dāng)指定name的時候,按照name唯一匹配的bean進行查找,如果查找到了則進行自動裝配,否則拋出異常
  • 當(dāng)執(zhí)行type的時候,按照type唯一匹配的bean進行查找,如果查找到了則進行自動裝配,否則拋出異常
  • 當(dāng)既指定name又指定type的時候,按照name和type進行唯一匹配bean進行查找,如果查找到了則進行自動裝配,否則拋出異常
  • 當(dāng)既沒有指定name,也沒有指定type的時候,先按照name進行查找,如果查找到了就進行自動裝配,如果沒有查找到,繼續(xù)按照類型去查找,如果查找到了則進行自動裝配,如果沒有查找到或者查找出多個bean,那么就拋出異常---->@Resource默認裝配順序

接著我們趁熱打鐵繼續(xù)講解@Resource注解

@Resource注解也可以實現(xiàn)依賴注入(@Resource注解是JDK提供的),但是也與AutoWired有一些區(qū)別.

@Resource注解實現(xiàn)依賴注入

@Resource注解實現(xiàn)屬性注入

@Resource注解實現(xiàn)setter注入

@Resource注解并不能實現(xiàn)構(gòu)造方法注入

@Resource注解不能實現(xiàn)構(gòu)造方法注入,原因是Resource的執(zhí)行時機比構(gòu)造方法執(zhí)行時機晚一些.

@Resource的來源

@Resource是JDK提供的一個注解,遵循JSR-250規(guī)范(Java 250 規(guī)范提案.

所以@Resource注解適用于所有的Java框架

@Resource的方法參數(shù)

@Resource注解提供多個參數(shù),最重要的就是name和type.

@Resource注解的應(yīng)用范圍

@AutoWired

@AutoWired注解也是可以將依賴的對象注入到當(dāng)前對象中.

我們接下來詳細分析一下@AutoWired重要的幾點

@AutoWired查找順序

@AutoWired默認是先按照類型進行匹配Bean,如果匹配了多個Bean就按照name進行匹配,如果還是匹配了多個Bean就會拋出異常.

我們仔細分析@AutoWired的裝配順序

  • 首先先會按照類型進行匹配,如果匹配到了一個唯一Bean就進行自動裝配,如果沒有匹配到則拋出異常
  • 如果根據(jù)類型匹配出多個Bean,就看是否配置了@Qualifier注解
  • 如果沒有配置,則默認會按照名稱進行匹配,如果查找到了,則會進行自動裝配,如果沒有查找到就會拋出異常
  • 如果配置了@Qualifier注解則會根據(jù)它的參數(shù)的名稱進行匹配,如果匹配到了則進行自動裝配,否則就會拋出異常
@AutoWired依賴注入方式

使用@AutoWired可以實現(xiàn)三種注入,屬性注入,setter注入,構(gòu)造方法注入.

屬性注入

@Autowired //使用一個AutoWired這樣的一個注解---->自動裝配的意思
private UserService userService;//UserService成員屬性

屬性注入的優(yōu)點和缺點

優(yōu)點 :

  • 屬性注入只需要在屬性上加一個@AutoWired注解,寫法簡便,可讀性高,易維護.

缺點 :

  • 1.不能注入final修飾的屬性.

為啥呢 ?

  • 因為我們知道JDK是我們最底層的框架,spring是上層,使用spring也要依賴java的,所以要遵循Java的規(guī)范,Java固定被final修飾的屬性1.在定義的時候就進行賦值 2.在構(gòu)造方法內(nèi)部進行賦值.

所以,是因為不滿足Java的規(guī)范

  • 2.屬性注入只能在IOC容器才能使用(類與IOC容器高度耦合),使用其他容器/框架的時候不能使用屬性注入(通用性不好)

  • 3.更容易違背單一職責(zé)原則

啥是單一職責(zé)原則呢 ?

單一職責(zé)原則的核心思想 : 一個類最好只做一件事,只有一個引起它變化的原因

換句話說,類只有單一功能,不要為類實現(xiàn)過多的功能點,以保證實體只有一個引起職責(zé)變化的原因

一個類只做一件事,要么做A事情,要么做B事情.只做一件事情

為什么說屬性注入更容易違背單一職責(zé)原則呢 ?

  • 由于屬性注入使用起來簡便,這樣就更容易使得開發(fā)者在類中注入多個對象,就可能會導(dǎo)致濫用的概率大大提高,所以違背單一職責(zé)原則的概率就大大提高-->更容易違背 不是一定違背,

setter注入

Setter注入的優(yōu)缺點

優(yōu)點 :

  • setter注入滿足單一設(shè)計/職責(zé)原則.

因為setter方法的特性,一個setter方法只對應(yīng)一個對象,不會有注入多個對象的可能性,所以滿足單一設(shè)計/職責(zé)原則

缺點 :

  • 不能注入final修飾的對象

還是與屬性注入的解釋是一樣的,原因就是JDK是我們最底層的框架,Spring作為上層,要基于JDK/Java的,所以要滿足Java的規(guī)范,java規(guī)定,被final修飾的屬性1.在定義的時候進行賦值2.在構(gòu)造方法內(nèi)部進行賦值

  • 注入的對象可能會被修改

由于setter方法是可以被多次調(diào)用的,有修改的風(fēng)險,所以注入的對象就可能被修改.

構(gòu)造方法注入

構(gòu)造方法注入的優(yōu)缺點

優(yōu)點 :

構(gòu)造方法最牛,上面的缺點,都是俺構(gòu)造方法的優(yōu)點.

就比如,屬性注入和setter注入都不能解決注入final修飾的屬性問題,那對于構(gòu)造方法注入就能夠解決

  • 能夠注入final修飾的屬性

為什么構(gòu)造方法可以注入final修飾的屬性呢?

原因還是一樣的,因為滿足Java的規(guī)范,被final修飾的屬性 一個是定義的時候就進行賦值,一個是在構(gòu)造方法內(nèi)部進行賦值.滿足第二條,所以可以注入final修飾的屬性.

  • 注入的對象不會被修改.

構(gòu)造方法注入 注入的對象不會被修改,因為構(gòu)造方法只會執(zhí)行一次.

  • 構(gòu)造方法注入是完全初始化的.

因為依賴注入是在構(gòu)造方法內(nèi)部執(zhí)行的,而構(gòu)造方法又是在類起初創(chuàng)建的時候就執(zhí)行的,所以會被完全初始化

  • 它的通用性會更好

構(gòu)造方法注入因為基于java的,JDK是最底層框架,所以無論在哪一個容器/框架都可以適用

缺點 :

  • 構(gòu)造方法可以注入多個對象,也就違背了單一設(shè)計原則
  • 寫法不簡便

官方建議

在Spring4.2之前推薦的注入用法就是setter注入,因為setter注入更加符合單一設(shè)計/職責(zé)原則

在Spring4.2之后官方就推薦使用構(gòu)造方法注入的方式(因為它的優(yōu)點).如果要傳入太多參數(shù)就需要考慮單一設(shè)計原則問題了.

但是我們在開發(fā)的時候依然會使用屬性注入的方式,因為寫法很簡便.

@AutoWired來源

@AutoWired注解是來自于Spring的,也就是來自于IOC容器,換句話說,@AutoWired注解只支持spring框架,不能在其他框架使用@AutoWired

@AutoWired方法參數(shù)

@AutoWired就只有一個required的參數(shù).

required參數(shù) : 設(shè)置為true的時候認為可以自動注入 ,false就是關(guān)閉自動注入

@AutoWired注解作用范圍

這個源碼可以看的出來.

根據(jù)源碼可以看的出來,@AutoWired注解支持構(gòu)造方法,成員變量,成員方法以及注解上..

@AutoWired與@Resource的區(qū)別
  • 來源不同

@AutoWired注解來自于Spring,只支持Spring框架,不能在其他框架中使用

@Resource注解是JDK提供的遵循JSR-250規(guī)范,可以適用于所有的Java框架

  • 裝配順序不同

@AutoWired默認裝配順序是先按照類型進行匹配,如果匹配了多個Bean就在按照名稱進行匹配,如果沒有找到或者匹配到多個就會拋出異常,如果期間配置了@Qualifier注解就會按照它的參數(shù)進行匹配,如果匹配到了則進行自動裝配,沒有匹配就拋出異常

@Resource注解默認的裝配順序是先按照名稱進行匹配,如果沒有匹配或者匹配多個,則按照類型進行匹配,如果還沒有匹配到或者匹配出多個則拋出異常.如果指定name則按照name進行唯一匹配,如果指定type則按照type進行唯一匹配,沒有匹配到就拋出異常,如果既指定name也指定type那么就按照name和type進行唯一匹配,匹配到了則自動裝配,沒有匹配到則拋出異常.

  • 方法的參數(shù)不同

@AutoWired注解只有一個required參數(shù),表示是否開啟自動注入

@Resource注解有多個方法參數(shù),最重要的2個參數(shù)是name和type

  • 注解應(yīng)用的范圍不同

@AutoWired注解可以加在成員變量,成員方法,方法參數(shù)及注解上

@Resource注解可以加在 類,成員變量,方法上.

  • 依賴注入的方式不同

@AutoWired注解支持屬性注入,setter注入,構(gòu)造方法注入

@Resource注解支持屬性注入,setter注入,但是不支持構(gòu)造方法注入

@Qualifier

Qualifier意思是合格者,一般跟Autowired配合使用,需要指定一個bean的名稱,通過bean名稱就能找到需要裝配的bean。

我們一般是使用@AutoWired進行Bean的注入的,但是當(dāng)有同一個類型多個Bean的時候,Spring就會拋出異常NoUniqueBeanDefinitionException

如下 :

我們就可以使用注解@Qualifier注解中填入我們想要裝配Bean的名稱,所以,通過將 @Qualifier 注解與我們想要指定特定的Bean名稱一起裝配,這樣Spring就會從多個相同類型并滿足裝配的要求找出我們想要的Bean

如果@Primary和@Qualifier注解都在那么會優(yōu)先執(zhí)行@Qualifier

@primary

當(dāng)我們使用自動配置的方式裝配Bean時,如果這個Bean有多個候選者,假如其中一個候選者具有@Primary注解修飾,該候選者會被選中,作為自動配置的值。

如果@Primary和@Qualifier注解都在那么會優(yōu)先執(zhí)行@Qualifier

解決同一類型Bean報錯的問題 使用Resource注解解決

使用Resource注解來解決上述問題,并仔細講解Resource注解

使用@AutoWired注解 + @Qualifier注解解決

Qualifier意思是合格者,一般跟Autowired配合使用,需要指定一個bean的名稱,通過bean名稱就能找到需要裝配的bean。

使用@primary注解解決

當(dāng)我們使用自動配置的方式裝配Bean時,如果這個Bean有多個候選者,假如其中一個候選者具有@Primary注解修飾,該候選者會被選中,作為自動配置的值。

你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧

文章標題:@AutoWired與@Resource-創(chuàng)新互聯(lián)
文章分享:http://www.rwnh.cn/article6/gdpig.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、云服務(wù)器App開發(fā)、微信小程序、定制網(wǎng)站、軟件開發(fā)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)

成都app開發(fā)公司
黑龙江省| 横峰县| 东丽区| 香格里拉县| 杭州市| 遵义县| 四子王旗| 巨野县| 杭锦旗| 醴陵市| 巨野县| 湘乡市| 洪洞县| 永昌县| 芒康县| 台南县| 定远县| 彭泽县| 马尔康县| 孝义市| 海宁市| 扶沟县| 洪泽县| 宕昌县| 嘉善县| 夏邑县| 克拉玛依市| 江阴市| 玉溪市| 南昌市| 邹城市| 米林县| 汪清县| 房山区| 蓝田县| 阿拉善左旗| 古田县| 北票市| 鄂州市| 太仆寺旗| 怀化市|