av一区二区在线观看_亚洲男人的天堂网站_日韩亚洲视频_在线成人免费_欧美日韩精品免费观看视频_久草视

您的位置:首頁技術(shù)文章
文章詳情頁

淺談spring DI 依賴注入方式和區(qū)別

瀏覽:132日期:2023-06-28 15:56:46
目錄spring DI3種DI注解的區(qū)別1 @Autowired2 @Inject3 @Resource3種注入方式的區(qū)別1 field注入2 構(gòu)造器注入3 setter注入構(gòu)造器注入的好處1 依賴不可變2 依賴不為空3 完全初始化狀態(tài)4 避免循環(huán)依賴5 總結(jié)spring DI

Spring框架對(duì)Java開發(fā)的重要性不言而喻,其核心特性就是IOC(Inversion of Control, 控制反轉(zhuǎn))和AOP,平時(shí)使用最多的就是其中的IOC,我們通過將組件交由Spring的IOC容器管理,將對(duì)象的依賴關(guān)系由Spring控制,避免硬編碼所造成的過度程序耦合。

3種DI注解的區(qū)別1 @Autowired

使用特點(diǎn)

Autowired注解是spring框架提供的 Autowired注解優(yōu)先byType獲取java bean,其次byName Autowired注解配合Qualifier注解區(qū)分java bean的名稱,主要用于同一個(gè)類型的javabean有多個(gè)實(shí) Autowired注解注入的對(duì)象,一般要求非null,如果允許為null,需要required=false屬性聲明 @Autowired可以作用在變量、setter方法、構(gòu)造函數(shù)上

使用過程

a、 將@autowored寫在被注入的成員變量上,就不用再xml文件中配置了,在程序中去掉相應(yīng)的setter和getter方法,

b、 還可以寫在構(gòu)造方法上、setter方法上

淺談spring DI 依賴注入方式和區(qū)別

c、@Qualifier@Qualifier('XXX') 中的 XX是 Bean 的名稱,所以 @Autowired 和 @Qualifier 結(jié)合使用時(shí),自動(dòng)注入的策略就從 byType 轉(zhuǎn)變成 byName 了。不過需要注意的是@Autowired 可以對(duì)成員變量、方法以及構(gòu)造函數(shù)進(jìn)行注釋,而 @Qualifier 的標(biāo)注對(duì)象是成員變量、方法入?yún)ⅰ?gòu)造函數(shù)入?yún)ⅰ?/p>

淺談spring DI 依賴注入方式和區(qū)別

2 @Inject

使用特點(diǎn)

@Inject是JSR330 (Dependency Injection for Java)中的規(guī)范,需要導(dǎo)入javax.inject.Inject; 實(shí)現(xiàn)注入 @Inject是根據(jù)類型進(jìn)行自動(dòng)裝配的,如果需要按名稱進(jìn)行裝配,則需要配合@Named @Inject可以作用在變量、setter方法、構(gòu)造函數(shù)上 與@Autowired使用類似,想比之下,采用spring提供的@Autowired更為普遍

使用過程a、 將@Inject可以作用在變量、setter方法、構(gòu)造函數(shù)上,和@Autowired一樣

淺談spring DI 依賴注入方式和區(qū)別

b、@Named@Named('XXX') 中的 XX是 Bean 的名稱,所以 @Inject和 @Named結(jié)合使用時(shí),自動(dòng)注入的策略就從 byType 轉(zhuǎn)變成 byName 了。

淺談spring DI 依賴注入方式和區(qū)別

3 @Resource

使用特點(diǎn)

esource注解是jdk提供的,屬于j2ee規(guī)范 Resource注解優(yōu)先byname獲取java bean,其次byType Resource注解的屬性名稱作為java bean的名稱進(jìn)行查找,如果有name參數(shù),則使用name參數(shù)查找java bean Resource注解如果聲明了name屬性,則必須按照name查找對(duì)象,不會(huì)再使用類型查找 @Resource可以作用在變量、setter方法上

使用過程a、@Resource實(shí)例

淺談spring DI 依賴注入方式和區(qū)別

3種注入方式的區(qū)別

注意項(xiàng)

注入方式:field注入、setter注入與構(gòu)造器注入 spring推薦使用setter方法和構(gòu)造器注入Autowired的bean對(duì)象,因此IDEA等工具中私有屬性使用Autowired注入會(huì)提示警告。setter方法和構(gòu)造器注入的方式,可以讓對(duì)象不依賴于spring而獨(dú)立使用,更加靈活;私有屬性則只能通過spring上下文自動(dòng)注入,一旦注入失敗,沒有重新注入的方式。 @Resource不能用于構(gòu)造器注入1 field注入

@Controllerpublic class FooController { @Autowired //@Inject private FooService fooService; //簡(jiǎn)單的使用例子,下同 public List<Foo> listFoo() { return fooService.list(); }}

這種注入方式應(yīng)該是最常見的注入方式。原因很簡(jiǎn)單:

注入方式簡(jiǎn)單:加入要注入的字段,附上@Autowired,即可完成。 使得整體代碼簡(jiǎn)潔明了,看起來美觀大方。2 構(gòu)造器注入

@Controllerpublic class FooController { private final FooService fooService; @Autowired public FooController(FooService fooService) { this.fooService = fooService; } //使用方式上同,略}

Spring4.x版本中推薦的注入方式,相較于field注入方式,就顯得有點(diǎn)難看,特別是當(dāng)注入的依賴很多(5個(gè)以上)的時(shí)候,就會(huì)明顯的發(fā)現(xiàn)代碼臃腫。構(gòu)造器注入的好處后面單獨(dú)討論。

3 setter注入

@Controllerpublic class FooController { private FooService fooService; //使用方式上同,略 @Autowired public void setFooService(FooService fooService) { this.fooService = fooService; }}

在Spring3.x剛推出的時(shí)候,推薦使用注入的就是這種,現(xiàn)在很少使用這種注解方式,寫起來麻煩,當(dāng)初推薦Spring自然也有他的道理: 構(gòu)造器注入?yún)?shù)太多了,顯得很笨重,另外setter的方式能用讓類在之后重新配置或者重新注入。

構(gòu)造器注入的好處

Spring在文檔里怎么說:

The Spring team generally advocates constructor injection as it enables one to implement application components as immutable objects and to ensure that required dependencies are not null. Furthermore constructor-injected components are always returned to client (calling) code in a fully initialized state.

簡(jiǎn)單的翻譯一下:構(gòu)造器注入的方式,能夠保證注入的組件不可變,并且確保需要的依賴不為空。此外,構(gòu)造器注入的依賴總是能夠在返回客戶端(組件)代碼的時(shí)候保證完全初始化的狀態(tài)。

1 依賴不可變

屬性使用final關(guān)鍵字修飾

2 依賴不為空

(省去了我們對(duì)null的檢查)當(dāng)要實(shí)例化類的時(shí)候,由于類已經(jīng)實(shí)現(xiàn)了有參數(shù)的構(gòu)造函數(shù),所以不會(huì)調(diào)用默認(rèn)構(gòu)造函數(shù),那么就需要Spring容器傳入所需要的參數(shù),所以就兩種情況:1、有該類型的參數(shù)->傳入,OK 。2:無該類型的參數(shù)->報(bào)錯(cuò)。所以保證不會(huì)為空,Spring不會(huì)傳一個(gè)null進(jìn)去如果使用field注入,缺點(diǎn)顯而易見,因?yàn)槟悴徽{(diào)用將一直無法發(fā)現(xiàn)NPE的存在。

3 完全初始化狀態(tài)

這個(gè)可以跟上面的依賴不為空結(jié)合起來,向構(gòu)造器傳參之前,要確保注入的內(nèi)容不為空,那么肯定要調(diào)用依賴組件的構(gòu)造方法完成實(shí)例化。而在Java類加載實(shí)例化的過程中,構(gòu)造方法是最后一步(之前如果有父類先初始化父類,然后自己的成員變量,最后才是構(gòu)造方法)。所以返回來的都是初始化之后的狀態(tài)。

4 避免循環(huán)依賴

使用field注入可能會(huì)導(dǎo)致循環(huán)依賴,即A里面注入B,B里面又注入A:

public class A { @Autowired private B b;}​public class B { @Autowired private A a;}

使用構(gòu)造器注入,在spring項(xiàng)目啟動(dòng)的時(shí)候,就會(huì)拋出:BeanCurrentlyInCreationException:Requested bean is currently in creation: Is there an unresolvable circular reference?從而提醒你避免循環(huán)依賴;如果是field注入的話,啟動(dòng)的時(shí)候不會(huì)報(bào)錯(cuò),在使用那個(gè)bean的時(shí)候才會(huì)報(bào)錯(cuò)。

5 總結(jié) 保證依賴不可變(final關(guān)鍵字) 保證依賴不為空(省去了我們對(duì)其檢查) 避免了循環(huán)依賴 當(dāng)有一個(gè)依賴有多個(gè)實(shí)現(xiàn)的使用,推薦使用field注入或者setter注入的方式來指定注入的類型

Q1:跟3.x里說的一樣,我要是有大量的依賴要注入,構(gòu)造方法不會(huì)顯得很臃腫嗎?對(duì)于這個(gè)問題,說明你的類當(dāng)中有太多的責(zé)任,那么你要好好想一想是不是自己違反了類的單一性職責(zé)原則,從而導(dǎo)致有這么多的依賴要注入。Q2:是不是其他的注入方式都不適合用了呢?存在即是合理!setter的方式既然一開始被Spring推薦肯定是有它的道理,像之前提到的setter的方式能用讓類在之后重新配置或者重新注入,就是其優(yōu)點(diǎn)之一。除此之外,如果一個(gè)依賴有多種實(shí)現(xiàn)方式,我們可以使用@Qualifier,在構(gòu)造方法里選擇對(duì)應(yīng)的名字注入,也可以使用field或者setter的方式來手動(dòng)配置要注入的實(shí)現(xiàn)。

到此這篇關(guān)于淺談spring DI 依賴注入方式和區(qū)別的文章就介紹到這了,更多相關(guān)spring DI 依賴注入內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Spring
相關(guān)文章:
主站蜘蛛池模板: 日本黄色的视频 | 美女一级毛片 | 国产免费av在线 | 日韩精品久久久 | 久久精品国内 | www.亚洲精品 | 精精精精xxxx免费视频 | 一区二区三区欧美在线观看 | 精品国产一二三区 | 91香蕉嫩草 | 日日操天天射 | 91久久精品国产 | 国内精品久久久久 | 亚洲精品美女在线观看 | 最近中文字幕第一页 | 久草综合在线视频 | 天天玩夜夜操 | 久久久www成人免费精品 | 日本久久网 | 午夜精品在线观看 | 欧美一级高潮片免费的 | 精品久久久久久久人人人人传媒 | 亚洲一区在线日韩在线深爱 | 热99在线| 国产精品99久久久久久久久 | 国产欧美一区二区三区在线播放 | 欧美精品一区二区三区四区五区 | 欧美日韩国产在线观看 | 人人玩人人添人人澡欧美 | 欧美日一区 | 涩爱av一区二区三区 | 国产乡下妇女做爰 | 日韩精品免费 | www.国产视频| 91资源在线| 日本精品一区 | 一区二区三区国产 | 欧美一级片在线看 | 国产精品高清在线 | 欧美高清视频在线观看 | 日韩午夜电影 |