成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久

您的位置:首頁技術文章
文章詳情頁

淺談spring DI 依賴注入方式和區別

瀏覽:211日期:2023-06-28 15:56:46
目錄spring DI3種DI注解的區別1 @Autowired2 @Inject3 @Resource3種注入方式的區別1 field注入2 構造器注入3 setter注入構造器注入的好處1 依賴不可變2 依賴不為空3 完全初始化狀態4 避免循環依賴5 總結spring DI

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

3種DI注解的區別1 @Autowired

使用特點

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

使用過程

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

b、 還可以寫在構造方法上、setter方法上

淺談spring DI 依賴注入方式和區別

c、@Qualifier@Qualifier('XXX') 中的 XX是 Bean 的名稱,所以 @Autowired 和 @Qualifier 結合使用時,自動注入的策略就從 byType 轉變成 byName 了。不過需要注意的是@Autowired 可以對成員變量、方法以及構造函數進行注釋,而 @Qualifier 的標注對象是成員變量、方法入參、構造函數入參。

淺談spring DI 依賴注入方式和區別

2 @Inject

使用特點

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

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

淺談spring DI 依賴注入方式和區別

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

淺談spring DI 依賴注入方式和區別

3 @Resource

使用特點

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

使用過程a、@Resource實例

淺談spring DI 依賴注入方式和區別

3種注入方式的區別

注意項

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

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

這種注入方式應該是最常見的注入方式。原因很簡單:

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

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

Spring4.x版本中推薦的注入方式,相較于field注入方式,就顯得有點難看,特別是當注入的依賴很多(5個以上)的時候,就會明顯的發現代碼臃腫。構造器注入的好處后面單獨討論。

3 setter注入

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

在Spring3.x剛推出的時候,推薦使用注入的就是這種,現在很少使用這種注解方式,寫起來麻煩,當初推薦Spring自然也有他的道理: 構造器注入參數太多了,顯得很笨重,另外setter的方式能用讓類在之后重新配置或者重新注入。

構造器注入的好處

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.

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

1 依賴不可變

屬性使用final關鍵字修飾

2 依賴不為空

(省去了我們對null的檢查)當要實例化類的時候,由于類已經實現了有參數的構造函數,所以不會調用默認構造函數,那么就需要Spring容器傳入所需要的參數,所以就兩種情況:1、有該類型的參數->傳入,OK 。2:無該類型的參數->報錯。所以保證不會為空,Spring不會傳一個null進去如果使用field注入,缺點顯而易見,因為你不調用將一直無法發現NPE的存在。

3 完全初始化狀態

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

4 避免循環依賴

使用field注入可能會導致循環依賴,即A里面注入B,B里面又注入A:

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

使用構造器注入,在spring項目啟動的時候,就會拋出:BeanCurrentlyInCreationException:Requested bean is currently in creation: Is there an unresolvable circular reference?從而提醒你避免循環依賴;如果是field注入的話,啟動的時候不會報錯,在使用那個bean的時候才會報錯。

5 總結 保證依賴不可變(final關鍵字) 保證依賴不為空(省去了我們對其檢查) 避免了循環依賴 當有一個依賴有多個實現的使用,推薦使用field注入或者setter注入的方式來指定注入的類型

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

到此這篇關于淺談spring DI 依賴注入方式和區別的文章就介紹到這了,更多相關spring DI 依賴注入內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
成人在线亚洲_国产日韩视频一区二区三区_久久久国产精品_99国内精品久久久久久久
制服丝袜成人动漫| 国产精品国产三级国产aⅴ入口| 精品福利av| 欧美色倩网站大全免费| 国产日韩精品一区二区三区 | 亚洲综合精品自拍| 成人白浆超碰人人人人| 一本色道久久加勒比精品 | 亚洲国产精品国自产拍av| 精品一区二区三区视频| 亚洲福利电影| 日韩免费看的电影| 久久国产福利国产秒拍| 亚洲国产网站| 久久精品在线观看| 国产成人h网站| 欧美性感一类影片在线播放| 亚洲人成网站精品片在线观看| 99精品视频一区二区三区| 欧美乱熟臀69xxxxxx| 亚洲国产精品久久久男人的天堂 | 国产精品乱人伦| 成人一级视频在线观看| 蜜桃久久av| 亚洲色图欧洲色图| 91亚洲国产成人精品一区二区三 | 欧美一级播放| 国产精品国产自产拍高清av| 成人小视频免费观看| 欧美剧情片在线观看| 日韩电影免费在线| aa国产精品| 国产亚洲精品资源在线26u| 国产一区久久久| 欧日韩精品视频| 视频一区免费在线观看| 国产日韩一区欧美| 中文字幕一区日韩精品欧美| 欧美激情成人在线| 久久夜色精品一区| 不卡高清视频专区| 欧美mv和日韩mv的网站| 国产成人精品aa毛片| 欧美在线你懂得| 日韩精品一级二级 | 欧美日韩国产一区精品一区| 日韩视频免费观看高清完整版 | 国产精品影视在线观看| 欧美艳星brazzers| 免费成人结看片| 91极品视觉盛宴| 水蜜桃久久夜色精品一区的特点| 亚洲国产99| 亚洲欧洲精品天堂一级| 国产一区二区三区四区老人| 久久精品人人爽人人爽| 成人一区二区三区视频在线观看| 3d成人h动漫网站入口| 久久国产精品一区二区| 欧美亚洲愉拍一区二区| 免费观看在线综合| 欧美午夜宅男影院| 国产一区二区视频在线| 欧美一级片在线| 国产成人精品网址| 日韩欧美久久一区| 成人av集中营| 久久精品视频一区二区| 欧美国产三区| 国产精品黄色在线观看| 海角社区69精品视频| 久久精品人人做人人综合| 午夜精品影院| 综合久久久久综合| 亚洲欧美卡通另类91av | 一区二区三区在线免费观看| 久久aⅴ乱码一区二区三区| 五月婷婷久久综合| 欧美午夜电影网| 国内成人自拍视频| 欧美一区二区成人| 国产91在线看| 国产欧美精品区一区二区三区| 欧美日韩综合久久| 一区二区三区日韩欧美精品| 亚洲欧美久久| 精品一区二区影视| 久久午夜电影网| 伊人久久婷婷| 亚洲综合色视频| 麻豆精品网站| 国内外成人在线视频| 久久久久久久网| 亚洲毛片av| 久久国产精品99久久久久久老狼| 欧美xxxxxxxx| 亚洲午夜精品久久久久久app| 一区二区在线免费| 91久久免费观看| 国产福利一区二区| 久久蜜臀中文字幕| 一本久道久久久| 蜜臀国产一区二区三区在线播放 | 欧美日本韩国在线| 亚洲已满18点击进入久久| 欧美亚洲免费在线一区| 午夜电影网亚洲视频| 欧美剧情片在线观看| 国产精品xnxxcom| 婷婷亚洲久悠悠色悠在线播放| 欧美一区二区三区不卡| 91麻豆产精品久久久久久 | 一区二区三区在线观看网站| 欧美视频在线不卡| 91视频在线观看| 亚洲综合在线免费观看| 欧美日韩国产综合一区二区| 99久精品国产| 亚洲超碰精品一区二区| 久久免费视频一区| 欧美老肥妇做.爰bbww视频| 亚洲深夜av| 97久久精品人人做人人爽50路| 久久精品国产99国产| 亚洲综合久久久久| 国产精品天美传媒| 精品国产乱码久久久久久浪潮| 欧美影院精品一区| 国产三区二区一区久久| 欧美体内she精视频在线观看| 国产91精品欧美| 久久国产乱子精品免费女| 亚洲一区在线观看免费观看电影高清| 久久蜜桃香蕉精品一区二区三区| 91精品麻豆日日躁夜夜躁| 久久久久se| 日韩午夜在线| 好吊视频一区二区三区四区| 91亚洲精品一区二区乱码| 国产成人av电影| 午夜av一区二区三区| 中文字幕一区在线观看视频| 久久精品人人做| 日韩欧美国产一区在线观看| 欧美三区在线观看| 色婷婷av一区二区三区大白胸| 国产日韩欧美三级| 亚洲午夜视频| 欧美日韩精品不卡| 91麻豆精东视频| av电影在线观看完整版一区二区| 国产在线观看一区二区| 蜜臀av一区二区三区| 日韩精品乱码免费| 亚洲大尺度视频在线观看| 亚洲人成网站在线| 亚洲日穴在线视频| 成人免费一区二区三区视频| 国产女主播一区| 欧美国产视频在线| 欧美国产精品一区| 亚洲国产精品成人综合色在线婷婷| 久久精品网站免费观看| 久久久国产精品午夜一区ai换脸| 2022国产精品视频| 日韩精品一区二区三区视频在线观看 | 欧美国产精品一区| 国产日产欧美一区二区三区| 国产亚洲精久久久久久| 久久久精品影视| 久久久久久电影| 欧美激情中文字幕一区二区| 国产三级三级三级精品8ⅰ区| 国产婷婷精品av在线| 国产人妖乱国产精品人妖| 国产免费观看久久| 中文字幕不卡的av| 中文字幕亚洲一区二区va在线| 国产精品三级av| 欧美极品aⅴ影院| 国产精品久久久一区麻豆最新章节| 国产片一区二区| 欧美国产激情一区二区三区蜜月| 中文字幕av一区二区三区高| 国产精品免费av| 亚洲青青青在线视频| 亚洲国产va精品久久久不卡综合| 图片区小说区国产精品视频| 日本大胆欧美人术艺术动态| 精品在线播放午夜| 高清在线不卡av| 97久久久精品综合88久久| 欧美久久久久| 99精品视频网| 色婷婷综合久久久中文字幕| 欧美亚洲高清一区| 日韩亚洲欧美一区| 久久精品亚洲精品国产欧美| 欧美高清在线精品一区| 亚洲人亚洲人成电影网站色|