面向?qū)ο缶幊桃蕾囎⑷朐斀?/h1>
更新時(shí)間:2016年08月31日 11:18:58 投稿:lqh
本文主要介紹面向?qū)ο缶幊桃蕾囎⑷氲闹R(shí)資料,這里對(duì)依賴注入的資料做了詳細(xì)介紹,有興趣的小伙伴可以參考下
說說依賴注入
在面向?qū)ο缶幊讨?,我們?jīng)常處理處理的問題就是解耦,程序的耦合性越低表明這個(gè)程序的可讀性以及可維護(hù)性越高??刂品崔D(zhuǎn)(Inversion of Control或IoC)就是常用的面向?qū)ο缶幊痰脑O(shè)計(jì)原則,使用這個(gè)原則我們可以降低耦合性。其中依賴注入是控制反轉(zhuǎn)最常用的實(shí)現(xiàn)。
什么是依賴
依賴是程序中常見的現(xiàn)象,比如類Car中用到了GasEnergy類的實(shí)例energy,通常的做法就是在Car類中顯式地創(chuàng)建GasEnergy類的實(shí)例,并賦值給energy。如下面的代碼
interface Energy {
}
class GasEnergy implements Energy {
}
class Car {
Energy energy = new GasEnergy();
}
存在問題
類Car承擔(dān)了多余的責(zé)任,負(fù)責(zé)energy對(duì)象的創(chuàng)建,這必然存在了嚴(yán)重的耦合性。舉一個(gè)現(xiàn)實(shí)中的例子,一輛汽車使用哪種能源不是由汽車來決定,而是由汽車制造商(CarMaker)來決定,這是汽車制造商的責(zé)任。
可擴(kuò)展性,假設(shè)我們想修改能源為電動(dòng)力,那么我們必然要修改Car這個(gè)類,明顯不符合開放閉合原則。
不利于單元測試。
依賴注入
依賴注入是這樣的一種行為,在類Car中不主動(dòng)創(chuàng)建GasEnergy的對(duì)象,而是通過外部傳入GasEnergy對(duì)象形式來設(shè)置依賴。 常用的依賴注入有如下三種方式
構(gòu)造器注入
將需要的依賴作為構(gòu)造方法的參數(shù)傳遞完成依賴注入。
class Car {
Energy mEnergy;
public Car(Energy energy) {
mEnergy = energy;
}
}
Setter方法注入
增加setter方法,參數(shù)為需要注入的依賴亦可完成依賴注入。
class Car {
Energy mEnergy;
public void setEnergy(Energy energy) {
mEnergy = energy;
}
}
接口注入
接口注入,聞其名不言而喻,就是為依賴注入創(chuàng)建一套接口,依賴作為參數(shù)傳入,通過調(diào)用統(tǒng)一的接口完成對(duì)具體實(shí)現(xiàn)的依賴注入。
interface EnergyConsumerInterface {
public void setEnergy(Energy energy);
}
class Car implements EnergyConsumerInterface {
Energy mEnergy;
public void setEnergy(Energy energy) {
mEnergy = energy;
}
}
接口注入和setter方法注入類似,不同的是接口注入使用了統(tǒng)一的方法來完成注入,而setter方法注入的方法名稱相對(duì)比較隨意。
框架取舍
依賴注入有很多框架,最有名的就是Guice,當(dāng)然Spring也支持依賴注入。Guice采用的是運(yùn)行時(shí)讀取注解,通過反射的形式生成依賴并進(jìn)行注入。這種形式不太適合Android移動(dòng)設(shè)備,畢竟這些操作都在運(yùn)行時(shí)處理,對(duì)性能要求較高。
Dagger則是Android開發(fā)適合的依賴注入庫,其同樣采用類注解的形式,不同的是它是在編譯時(shí)生成輔助類,等到在運(yùn)行時(shí)使用生成的輔助類完成依賴注入。
用還是不用
其實(shí)注入框架用還是不用,是一個(gè)問題,如若使用框架,則要求團(tuán)隊(duì)每一個(gè)人都要遵守說明來編寫代碼解決依賴注入。而這些框架其實(shí)也并非很容易就能上手,學(xué)習(xí)系數(shù)相對(duì)復(fù)雜,難以掌握,這也是需要考慮的問題。
個(gè)人觀點(diǎn)為不推薦也不反對(duì)使用這些框架,但是覺得有些時(shí)候我們寄希望于一個(gè)框架,不如平時(shí)注意這些問題,人為避免何嘗不是對(duì)自己的一種基本要求呢?
依賴查找
依賴查找和依賴注入一樣屬于控制反轉(zhuǎn)原則的具體實(shí)現(xiàn),不同于依賴注入的被動(dòng)接受,依賴查找這是主動(dòng)請(qǐng)求,在需要的時(shí)候通過調(diào)用框架提供的方法來獲取對(duì)象,獲取時(shí)需要提供相關(guān)的配置文件路徑、key等信息來確定獲取對(duì)象的狀態(tài)。
以上就是對(duì)依賴注入的資料詳細(xì)介紹,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!
您可能感興趣的文章:- AngularJs動(dòng)態(tài)加載模塊和依賴注入詳解
- 深入理解Javascript里的依賴注入
- 詳解AngularJS中的依賴注入機(jī)制
- 淺析依賴注入框架Autofac的使用
- 詳解Java Spring各種依賴注入注解的區(qū)別
- 擴(kuò)展ASP.NET MVC三層框架且使用StructureMap實(shí)現(xiàn)依賴注入1-Model層
- Laravel實(shí)現(xiàn)構(gòu)造函數(shù)自動(dòng)依賴注入的方法
- Javascript技術(shù)棧中的四種依賴注入詳解
- 深入解析Java的Spring框架中bean的依賴注入
- 如何用js 實(shí)現(xiàn)依賴注入的思想,后端框架思想搬到前端來
相關(guān)文章
-
Java 使用Socket正確讀取數(shù)據(jù)姿勢
這篇文章主要介紹了Java 使用Socket正確讀取數(shù)據(jù)姿勢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2021-10-10
-
解決java idea新建子目錄時(shí)命名不是樹形結(jié)構(gòu)的問題
這篇文章主要介紹了解決java idea新建子目錄時(shí)命名不是樹形結(jié)構(gòu)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧 2020-08-08
-
關(guān)于Java?float和double精度范圍大小
這篇文章主要介紹了關(guān)于Java?float和double精度范圍大小,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2021-12-12
-
Java并發(fā)編程中的volatile關(guān)鍵字詳解
這篇文章主要介紹了Java并發(fā)編程中的volatile關(guān)鍵字詳解,volatile?用于保證我們某個(gè)變量的可見性,使其一直存放在主存中,不被移動(dòng)到某個(gè)線程的私有工作內(nèi)存中,需要的朋友可以參考下 2023-08-08
-
在SpringBoot項(xiàng)目中實(shí)現(xiàn)給所有請(qǐng)求加固定前綴
這篇文章主要介紹了在SpringBoot項(xiàng)目中實(shí)現(xiàn)給所有請(qǐng)求加固定前綴,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教 2022-02-02
最新評(píng)論
說說依賴注入
在面向?qū)ο缶幊讨?,我們?jīng)常處理處理的問題就是解耦,程序的耦合性越低表明這個(gè)程序的可讀性以及可維護(hù)性越高??刂品崔D(zhuǎn)(Inversion of Control或IoC)就是常用的面向?qū)ο缶幊痰脑O(shè)計(jì)原則,使用這個(gè)原則我們可以降低耦合性。其中依賴注入是控制反轉(zhuǎn)最常用的實(shí)現(xiàn)。
什么是依賴
依賴是程序中常見的現(xiàn)象,比如類Car中用到了GasEnergy類的實(shí)例energy,通常的做法就是在Car類中顯式地創(chuàng)建GasEnergy類的實(shí)例,并賦值給energy。如下面的代碼
interface Energy {
}
class GasEnergy implements Energy {
}
class Car {
Energy energy = new GasEnergy();
}
存在問題
類Car承擔(dān)了多余的責(zé)任,負(fù)責(zé)energy對(duì)象的創(chuàng)建,這必然存在了嚴(yán)重的耦合性。舉一個(gè)現(xiàn)實(shí)中的例子,一輛汽車使用哪種能源不是由汽車來決定,而是由汽車制造商(CarMaker)來決定,這是汽車制造商的責(zé)任。
可擴(kuò)展性,假設(shè)我們想修改能源為電動(dòng)力,那么我們必然要修改Car這個(gè)類,明顯不符合開放閉合原則。
不利于單元測試。
依賴注入
依賴注入是這樣的一種行為,在類Car中不主動(dòng)創(chuàng)建GasEnergy的對(duì)象,而是通過外部傳入GasEnergy對(duì)象形式來設(shè)置依賴。 常用的依賴注入有如下三種方式
構(gòu)造器注入
將需要的依賴作為構(gòu)造方法的參數(shù)傳遞完成依賴注入。
class Car {
Energy mEnergy;
public Car(Energy energy) {
mEnergy = energy;
}
}
Setter方法注入
增加setter方法,參數(shù)為需要注入的依賴亦可完成依賴注入。
class Car {
Energy mEnergy;
public void setEnergy(Energy energy) {
mEnergy = energy;
}
}
接口注入
接口注入,聞其名不言而喻,就是為依賴注入創(chuàng)建一套接口,依賴作為參數(shù)傳入,通過調(diào)用統(tǒng)一的接口完成對(duì)具體實(shí)現(xiàn)的依賴注入。
interface EnergyConsumerInterface {
public void setEnergy(Energy energy);
}
class Car implements EnergyConsumerInterface {
Energy mEnergy;
public void setEnergy(Energy energy) {
mEnergy = energy;
}
}
接口注入和setter方法注入類似,不同的是接口注入使用了統(tǒng)一的方法來完成注入,而setter方法注入的方法名稱相對(duì)比較隨意。
框架取舍
依賴注入有很多框架,最有名的就是Guice,當(dāng)然Spring也支持依賴注入。Guice采用的是運(yùn)行時(shí)讀取注解,通過反射的形式生成依賴并進(jìn)行注入。這種形式不太適合Android移動(dòng)設(shè)備,畢竟這些操作都在運(yùn)行時(shí)處理,對(duì)性能要求較高。
Dagger則是Android開發(fā)適合的依賴注入庫,其同樣采用類注解的形式,不同的是它是在編譯時(shí)生成輔助類,等到在運(yùn)行時(shí)使用生成的輔助類完成依賴注入。
用還是不用
其實(shí)注入框架用還是不用,是一個(gè)問題,如若使用框架,則要求團(tuán)隊(duì)每一個(gè)人都要遵守說明來編寫代碼解決依賴注入。而這些框架其實(shí)也并非很容易就能上手,學(xué)習(xí)系數(shù)相對(duì)復(fù)雜,難以掌握,這也是需要考慮的問題。
個(gè)人觀點(diǎn)為不推薦也不反對(duì)使用這些框架,但是覺得有些時(shí)候我們寄希望于一個(gè)框架,不如平時(shí)注意這些問題,人為避免何嘗不是對(duì)自己的一種基本要求呢?
依賴查找
依賴查找和依賴注入一樣屬于控制反轉(zhuǎn)原則的具體實(shí)現(xiàn),不同于依賴注入的被動(dòng)接受,依賴查找這是主動(dòng)請(qǐng)求,在需要的時(shí)候通過調(diào)用框架提供的方法來獲取對(duì)象,獲取時(shí)需要提供相關(guān)的配置文件路徑、key等信息來確定獲取對(duì)象的狀態(tài)。
以上就是對(duì)依賴注入的資料詳細(xì)介紹,后續(xù)繼續(xù)補(bǔ)充相關(guān)資料,謝謝大家對(duì)本站的支持!
- AngularJs動(dòng)態(tài)加載模塊和依賴注入詳解
- 深入理解Javascript里的依賴注入
- 詳解AngularJS中的依賴注入機(jī)制
- 淺析依賴注入框架Autofac的使用
- 詳解Java Spring各種依賴注入注解的區(qū)別
- 擴(kuò)展ASP.NET MVC三層框架且使用StructureMap實(shí)現(xiàn)依賴注入1-Model層
- Laravel實(shí)現(xiàn)構(gòu)造函數(shù)自動(dòng)依賴注入的方法
- Javascript技術(shù)棧中的四種依賴注入詳解
- 深入解析Java的Spring框架中bean的依賴注入
- 如何用js 實(shí)現(xiàn)依賴注入的思想,后端框架思想搬到前端來
相關(guān)文章
Java 使用Socket正確讀取數(shù)據(jù)姿勢
這篇文章主要介紹了Java 使用Socket正確讀取數(shù)據(jù)姿勢,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-10-10
解決java idea新建子目錄時(shí)命名不是樹形結(jié)構(gòu)的問題
這篇文章主要介紹了解決java idea新建子目錄時(shí)命名不是樹形結(jié)構(gòu)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-08-08
關(guān)于Java?float和double精度范圍大小
這篇文章主要介紹了關(guān)于Java?float和double精度范圍大小,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-12-12
Java并發(fā)編程中的volatile關(guān)鍵字詳解
這篇文章主要介紹了Java并發(fā)編程中的volatile關(guān)鍵字詳解,volatile?用于保證我們某個(gè)變量的可見性,使其一直存放在主存中,不被移動(dòng)到某個(gè)線程的私有工作內(nèi)存中,需要的朋友可以參考下2023-08-08
在SpringBoot項(xiàng)目中實(shí)現(xiàn)給所有請(qǐng)求加固定前綴
這篇文章主要介紹了在SpringBoot項(xiàng)目中實(shí)現(xiàn)給所有請(qǐng)求加固定前綴,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-02-02

