參考 :
創(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注解 @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的查找順序分為如下四種方式 :
接著我們趁熱打鐵繼續(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的裝配順序
使用@AutoWired可以實現(xiàn)三種注入,屬性注入,setter注入,構(gòu)造方法注入.
屬性注入
@Autowired //使用一個AutoWired這樣的一個注解---->自動裝配的意思 private UserService userService;//UserService成員屬性
屬性注入的優(yōu)點和缺點
優(yōu)點 :
缺點 :
為啥呢 ?
所以,是因為不滿足Java的規(guī)范
啥是單一職責(zé)原則呢 ?
單一職責(zé)原則的核心思想 : 一個類最好只做一件事,只有一個引起它變化的原因
換句話說,類只有單一功能,不要為類實現(xiàn)過多的功能點,以保證實體只有一個引起職責(zé)變化的原因
一個類只做一件事,要么做A事情,要么做B事情.只做一件事情
為什么說屬性注入更容易違背單一職責(zé)原則呢 ?
setter注入
Setter注入的優(yōu)缺點
優(yōu)點 :
因為setter方法的特性,一個setter方法只對應(yīng)一個對象,不會有注入多個對象的可能性,所以滿足單一設(shè)計/職責(zé)原則
缺點 :
還是與屬性注入的解釋是一樣的,原因就是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)造方法注入就能夠解決
為什么構(gòu)造方法可以注入final修飾的屬性呢?
原因還是一樣的,因為滿足Java的規(guī)范,被final修飾的屬性 一個是定義的時候就進行賦值,一個是在構(gòu)造方法內(nèi)部進行賦值.滿足第二條,所以可以注入final修飾的屬性.
構(gòu)造方法注入 注入的對象不會被修改,因為構(gòu)造方法只會執(zhí)行一次.
因為依賴注入是在構(gòu)造方法內(nèi)部執(zhí)行的,而構(gòu)造方法又是在類起初創(chuàng)建的時候就執(zhí)行的,所以會被完全初始化
構(gòu)造方法注入因為基于java的,JDK是最底層框架,所以無論在哪一個容器/框架都可以適用
缺點 :
官方建議
在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進行唯一匹配,匹配到了則自動裝配,沒有匹配到則拋出異常.
@AutoWired注解只有一個required參數(shù),表示是否開啟自動注入
@Resource注解有多個方法參數(shù),最重要的2個參數(shù)是name和type
@AutoWired注解可以加在成員變量,成員方法,方法參數(shù)及注解上
@Resource注解可以加在 類,成員變量,方法上.
@AutoWired注解支持屬性注入,setter注入,構(gòu)造方法注入
@Resource注解支持屬性注入,setter注入,但是不支持構(gòu)造方法注入
@QualifierQualifier意思是合格者,一般跟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)
猜你還喜歡下面的內(nèi)容