參考 :
創(chuàng)新互聯(lián)是一家網(wǎng)站設(shè)計(jì)公司,集創(chuàng)意、互聯(lián)網(wǎng)應(yīng)用、軟件技術(shù)為一體的創(chuàng)意網(wǎng)站建設(shè)服務(wù)商,主營產(chǎn)品:響應(yīng)式網(wǎng)站設(shè)計(jì)、品牌網(wǎng)站建設(shè)、營銷型網(wǎng)站建設(shè)。我們專注企業(yè)品牌在網(wǎng)站中的整體樹立,網(wǎng)絡(luò)互動(dòng)的體驗(yàn),以及在手機(jī)等移動(dòng)端的優(yōu)質(zhì)呈現(xiàn)。成都網(wǎng)站制作、成都網(wǎng)站設(shè)計(jì)、移動(dòng)互聯(lián)產(chǎn)品、網(wǎng)絡(luò)運(yùn)營、VI設(shè)計(jì)、云產(chǎn)品.運(yùn)維為核心業(yè)務(wù)。為用戶提供一站式解決方案,我們深知市場的競爭激烈,認(rèn)真對待每位客戶,為客戶提供賞析悅目的作品,網(wǎng)站的價(jià)值服務(wù)。@Qualifier - 搜索結(jié)果 - 知乎
@Autowired和@Resource的區(qū)別是什么? - 知乎
面試突擊78:@Autowired 和 @Resource 有什么區(qū)別? - 掘金
目錄
同一類型多個(gè)@Bean報(bào)錯(cuò)問題
@Resource注解
@Resource的查找順序
@Resource注解實(shí)現(xiàn)依賴注入
@Resource的來源
@Resource的方法參數(shù)
@Resource注解的應(yīng)用范圍
@AutoWired
@AutoWired查找順序
@AutoWired依賴注入方式
@AutoWired來源
@AutoWired方法參數(shù)
@AutoWired注解作用范圍
@AutoWired與@Resource的區(qū)別
@Qualifier
@primary
解決同一類型Bean報(bào)錯(cuò)的問題
使用Resource注解解決
使用@AutoWired注解 + @Qualifier注解解決
使用@primary注解解決
我們通過一個(gè)小栗子/一個(gè)問題,引出@AutoWired注解和@Resource注解還有@Qualifier注解,利用注解解決這個(gè)問題,然后在講解@AutoWired注解和@Resource注解以及有啥區(qū)別...
同一類型多個(gè)@Bean報(bào)錯(cuò)問題引出一個(gè)問題如果同一個(gè)類型有多個(gè)@Bean
換句話說就是在依賴注入的時(shí)候,我們注入一個(gè)Bean的時(shí)候,Spring中有多個(gè)Bean的類型與這個(gè)Bean的類型是一樣的,但名稱不同(Bean名稱是唯一的) 這樣會(huì)有什么問題呢?
這樣說可能還是有一點(diǎn)抽象,我們就來舉一個(gè)例子把.
比如我現(xiàn)在要注入一個(gè)名字為user的對象/Bean
@Autowired private User user;
但是Spring中存在多個(gè)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與上面不是一個(gè)類--------- @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)在有三個(gè)類型為User的Bean,但是三個(gè)Bean的名稱并不一樣,因?yàn)镾pring中規(guī)定Bean的名稱(也就是id)是唯一的.
當(dāng)我們運(yùn)行的時(shí)候會(huì)發(fā)生什么呢???
什么辦法可以解決呢 ?
最簡單最直接的辦法就是,你在存儲(chǔ)一個(gè)名稱為user的Bean,或者將一個(gè)Bean的名稱修改為Bean.
如果我非要使用那三個(gè)其中一個(gè)Bean呢?該怎么辦?
有兩種方法 :
我先分別講解這幾個(gè)注解,然后在來解決這個(gè)問題
@Resource注解 @Resource的查找順序既指定name又指定type
如果既指定name又指定type,他就會(huì)在Spring查找name和type唯一匹配的bean,如果沒有找到就會(huì)拋出異常.
只指定name
如果只指定了name的情況,他就會(huì)在Spring中查找name唯一匹配的bean,如果找到了則自動(dòng)裝配,沒有找到則拋出異常,
只指定type
如果只指定了type,那么在Spring中查找type唯一匹配的bean,如果沒有找到就拋出異常.
既沒有指定name,也沒有指定type
好我們在來整體總結(jié)一下 :
依賴注入的功能,是通過先在 Spring IoC 容器中查找對象(分為類型和名稱兩種查找方式),再將對象注入引入到當(dāng)前類中
@Resource的查找順序分為如下四種方式 :
接著我們趁熱打鐵繼續(xù)講解@Resource注解
@Resource注解也可以實(shí)現(xiàn)依賴注入(@Resource注解是JDK提供的),但是也與AutoWired有一些區(qū)別.
@Resource注解實(shí)現(xiàn)依賴注入@Resource注解實(shí)現(xiàn)屬性注入
@Resource注解實(shí)現(xiàn)setter注入
@Resource注解并不能實(shí)現(xiàn)構(gòu)造方法注入
@Resource注解不能實(shí)現(xiàn)構(gòu)造方法注入,原因是Resource的執(zhí)行時(shí)機(jī)比構(gòu)造方法執(zhí)行時(shí)機(jī)晚一些.
@Resource的來源@Resource是JDK提供的一個(gè)注解,遵循JSR-250規(guī)范(Java 250 規(guī)范提案.
所以@Resource注解適用于所有的Java框架
@Resource的方法參數(shù)@Resource注解提供多個(gè)參數(shù),最重要的就是name和type.
@Resource注解的應(yīng)用范圍@AutoWired@AutoWired注解也是可以將依賴的對象注入到當(dāng)前對象中.
我們接下來詳細(xì)分析一下@AutoWired重要的幾點(diǎn)
@AutoWired查找順序@AutoWired默認(rèn)是先按照類型進(jìn)行匹配Bean,如果匹配了多個(gè)Bean就按照name進(jìn)行匹配,如果還是匹配了多個(gè)Bean就會(huì)拋出異常.
我們仔細(xì)分析@AutoWired的裝配順序
使用@AutoWired可以實(shí)現(xiàn)三種注入,屬性注入,setter注入,構(gòu)造方法注入.
屬性注入
@Autowired //使用一個(gè)AutoWired這樣的一個(gè)注解---->自動(dòng)裝配的意思 private UserService userService;//UserService成員屬性
屬性注入的優(yōu)點(diǎn)和缺點(diǎn)
優(yōu)點(diǎn) :
缺點(diǎn) :
為啥呢 ?
所以,是因?yàn)椴粷M足Java的規(guī)范
啥是單一職責(zé)原則呢 ?
單一職責(zé)原則的核心思想 : 一個(gè)類最好只做一件事,只有一個(gè)引起它變化的原因
換句話說,類只有單一功能,不要為類實(shí)現(xiàn)過多的功能點(diǎn),以保證實(shí)體只有一個(gè)引起職責(zé)變化的原因
一個(gè)類只做一件事,要么做A事情,要么做B事情.只做一件事情
為什么說屬性注入更容易違背單一職責(zé)原則呢 ?
setter注入
Setter注入的優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
因?yàn)閟etter方法的特性,一個(gè)setter方法只對應(yīng)一個(gè)對象,不會(huì)有注入多個(gè)對象的可能性,所以滿足單一設(shè)計(jì)/職責(zé)原則
缺點(diǎn) :
還是與屬性注入的解釋是一樣的,原因就是JDK是我們最底層的框架,Spring作為上層,要基于JDK/Java的,所以要滿足Java的規(guī)范,java規(guī)定,被final修飾的屬性1.在定義的時(shí)候進(jìn)行賦值2.在構(gòu)造方法內(nèi)部進(jìn)行賦值
由于setter方法是可以被多次調(diào)用的,有修改的風(fēng)險(xiǎn),所以注入的對象就可能被修改.
構(gòu)造方法注入
構(gòu)造方法注入的優(yōu)缺點(diǎn)
優(yōu)點(diǎn) :
構(gòu)造方法最牛,上面的缺點(diǎn),都是俺構(gòu)造方法的優(yōu)點(diǎn).
就比如,屬性注入和setter注入都不能解決注入final修飾的屬性問題,那對于構(gòu)造方法注入就能夠解決
為什么構(gòu)造方法可以注入final修飾的屬性呢?
原因還是一樣的,因?yàn)闈M足Java的規(guī)范,被final修飾的屬性 一個(gè)是定義的時(shí)候就進(jìn)行賦值,一個(gè)是在構(gòu)造方法內(nèi)部進(jìn)行賦值.滿足第二條,所以可以注入final修飾的屬性.
構(gòu)造方法注入 注入的對象不會(huì)被修改,因?yàn)闃?gòu)造方法只會(huì)執(zhí)行一次.
因?yàn)橐蕾囎⑷胧窃跇?gòu)造方法內(nèi)部執(zhí)行的,而構(gòu)造方法又是在類起初創(chuàng)建的時(shí)候就執(zhí)行的,所以會(huì)被完全初始化
構(gòu)造方法注入因?yàn)榛趈ava的,JDK是最底層框架,所以無論在哪一個(gè)容器/框架都可以適用
缺點(diǎn) :
官方建議
在Spring4.2之前推薦的注入用法就是setter注入,因?yàn)閟etter注入更加符合單一設(shè)計(jì)/職責(zé)原則
在Spring4.2之后官方就推薦使用構(gòu)造方法注入的方式(因?yàn)樗膬?yōu)點(diǎn)).如果要傳入太多參數(shù)就需要考慮單一設(shè)計(jì)原則問題了.
但是我們在開發(fā)的時(shí)候依然會(huì)使用屬性注入的方式,因?yàn)閷懛ê芎啽?
@AutoWired來源@AutoWired注解是來自于Spring的,也就是來自于IOC容器,換句話說,@AutoWired注解只支持spring框架,不能在其他框架使用@AutoWired
@AutoWired方法參數(shù)@AutoWired就只有一個(gè)required的參數(shù).
required參數(shù) : 設(shè)置為true的時(shí)候認(rèn)為可以自動(dòng)注入 ,false就是關(guān)閉自動(dòng)注入
@AutoWired注解作用范圍這個(gè)源碼可以看的出來.
根據(jù)源碼可以看的出來,@AutoWired注解支持構(gòu)造方法,成員變量,成員方法以及注解上..
@AutoWired與@Resource的區(qū)別@AutoWired注解來自于Spring,只支持Spring框架,不能在其他框架中使用
@Resource注解是JDK提供的遵循JSR-250規(guī)范,可以適用于所有的Java框架
@AutoWired默認(rèn)裝配順序是先按照類型進(jìn)行匹配,如果匹配了多個(gè)Bean就在按照名稱進(jìn)行匹配,如果沒有找到或者匹配到多個(gè)就會(huì)拋出異常,如果期間配置了@Qualifier注解就會(huì)按照它的參數(shù)進(jìn)行匹配,如果匹配到了則進(jìn)行自動(dòng)裝配,沒有匹配就拋出異常
@Resource注解默認(rèn)的裝配順序是先按照名稱進(jìn)行匹配,如果沒有匹配或者匹配多個(gè),則按照類型進(jìn)行匹配,如果還沒有匹配到或者匹配出多個(gè)則拋出異常.如果指定name則按照name進(jìn)行唯一匹配,如果指定type則按照type進(jìn)行唯一匹配,沒有匹配到就拋出異常,如果既指定name也指定type那么就按照name和type進(jìn)行唯一匹配,匹配到了則自動(dòng)裝配,沒有匹配到則拋出異常.
@AutoWired注解只有一個(gè)required參數(shù),表示是否開啟自動(dòng)注入
@Resource注解有多個(gè)方法參數(shù),最重要的2個(gè)參數(shù)是name和type
@AutoWired注解可以加在成員變量,成員方法,方法參數(shù)及注解上
@Resource注解可以加在 類,成員變量,方法上.
@AutoWired注解支持屬性注入,setter注入,構(gòu)造方法注入
@Resource注解支持屬性注入,setter注入,但是不支持構(gòu)造方法注入
@QualifierQualifier意思是合格者,一般跟Autowired配合使用,需要指定一個(gè)bean的名稱,通過bean名稱就能找到需要裝配的bean。
我們一般是使用@AutoWired進(jìn)行Bean的注入的,但是當(dāng)有同一個(gè)類型多個(gè)Bean的時(shí)候,Spring就會(huì)拋出異常NoUniqueBeanDefinitionException
如下 :
我們就可以使用注解@Qualifier注解中填入我們想要裝配Bean的名稱,所以,通過將 @Qualifier 注解與我們想要指定特定的Bean名稱一起裝配,這樣Spring就會(huì)從多個(gè)相同類型并滿足裝配的要求找出我們想要的Bean
如果@Primary和@Qualifier注解都在那么會(huì)優(yōu)先執(zhí)行@Qualifier
@primary當(dāng)我們使用自動(dòng)配置的方式裝配Bean時(shí),如果這個(gè)Bean有多個(gè)候選者,假如其中一個(gè)候選者具有@Primary注解修飾,該候選者會(huì)被選中,作為自動(dòng)配置的值。
如果@Primary和@Qualifier注解都在那么會(huì)優(yōu)先執(zhí)行@Qualifier
解決同一類型Bean報(bào)錯(cuò)的問題 使用Resource注解解決使用Resource注解來解決上述問題,并仔細(xì)講解Resource注解
使用@AutoWired注解 + @Qualifier注解解決Qualifier意思是合格者,一般跟Autowired配合使用,需要指定一個(gè)bean的名稱,通過bean名稱就能找到需要裝配的bean。
使用@primary注解解決當(dāng)我們使用自動(dòng)配置的方式裝配Bean時(shí),如果這個(gè)Bean有多個(gè)候選者,假如其中一個(gè)候選者具有@Primary注解修飾,該候選者會(huì)被選中,作為自動(dòng)配置的值。
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動(dòng)首月15元起,快前往官網(wǎng)查看詳情吧
文章標(biāo)題:@AutoWired與@Resource-創(chuàng)新互聯(lián)
文章分享:http://aaarwkj.com/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)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容