angular.js - 如何通俗易懂的解釋“依賴注入”?
問題描述
如何通俗易懂的解釋“依賴注入”?另外,依賴注入和控制反轉(zhuǎn)有區(qū)別嗎?具體是什么區(qū)別?
問題解答
回答1:已經(jīng)寫好的東西 拿來即用!
回答2:首先 什么叫依賴? 一個對象依賴與其他對象 比如var d=new Date();就是d依賴于Date對象創(chuàng)建第二 依不依賴比較好?no 為了實現(xiàn)程序的低耦合,盡量減少各組件之間的相互依賴和制約比較好,比如一個構(gòu)造函數(shù),別人已經(jīng)創(chuàng)建好了,我不用再創(chuàng)建就可以直接調(diào)用。第三 什么叫注入?意思我現(xiàn)在用的對象是別人給的,是被動創(chuàng)建的。比如
angular.module(’M1’,[’ng’,’ngRoute’]).controller(’C1’,function($scope,$http){ $scope.data = 999; $http.get().success(); })這段代碼運(yùn)行時:只需要傳入所需要的模塊的名稱,ng底層自動創(chuàng)建相關(guān)的對象,直接使用回答3:
沒有區(qū)別,只是角度不同,所指的都是同一件事。簡單來說,不需要你自己創(chuàng)對象,spring幫你將對象放到你需要的地方
回答4:都是工廠模式的升華罷了。依賴注入和控制反轉(zhuǎn)代碼原理時一回事,無非是理解上的不同而已。這些名詞實在是太高級了,其實無非是面向?qū)ο蟮囊恍┗A(chǔ)應(yīng)用而已,把很多朋友糊弄住了。這與策略模式和工廠模式一個樣。
可以參考下:http://www.nowcoder.com/questionTerminal/3be16186465a453f876729acd2e46ddf
回答6:依賴注入和控制反轉(zhuǎn)本質(zhì)上沒有區(qū)別, 只是對問題描述的角度不同。
控制反轉(zhuǎn):到底是什么東西被反轉(zhuǎn)了呢? 維基百科的定義是依賴對象的獲得被反轉(zhuǎn)了。應(yīng)用程序一般都是由很多個對象組成的。一個類中需要用到很多其他的類,最初我們是自己主動通過new關(guān)鍵字獲取其他類的實例。這樣就帶來一個問題:各個類的調(diào)用關(guān)系耦合了。
有了控制反轉(zhuǎn)之后, 我們只要被動地等待spring將類的實例注入給我們, 我們就可以直接使用了。
這樣有諸多好處, 對象集中管理, 不用自己實現(xiàn)很多單例, 解耦類的調(diào)用關(guān)系等等。
假設(shè)有2個類 A和B, 如果A中使用了new B()這樣的語句, 那就添加一條從B到A的有向邊。龐大一點的工程可能擁有上千個類, 這樣構(gòu)成的有向圖必定會異常復(fù)雜。如果用了控制反轉(zhuǎn), 在最極端的情況下, 我們所有的類都會變成獨(dú)立的點。
因為擁有了各個bean的控制權(quán), 所以還能衍生出各種強(qiáng)大的功能。spring就是建立在IoC和AOP的基礎(chǔ)上的。
回答7:有個數(shù)據(jù)庫類db,它有一個靜態(tài)方法get_db()能獲取數(shù)據(jù)庫連接對象.另外有一個需要操作數(shù)據(jù)庫的類post,它有個方法get_post()需要查詢數(shù)據(jù)庫.因為數(shù)據(jù)庫連接是公共操作,類post不想在自己內(nèi)部又去連接一次數(shù)據(jù)庫,避免耦合.所以post這個類內(nèi)部提供了一個set_db()的方法來獲取數(shù)據(jù)庫連接對象.db::get_db()作為post類的set_db()這個方法的參數(shù)傳到post類內(nèi)部,這就是依賴注入.
<?phpclass db { public static function get_db() {return new mysqli(’127.0.0.1’,’user’,’pass’,’dbname’,3306); }}class post { private $db; public function set_db($db){$this->db = $db; } public function get_post($id){return $this->db->query(’SELECT * FROM post WHERE id =’.intval($id)); }}$post = new post();$post->set_db( db::get_db() ); //注入post類依賴的數(shù)據(jù)庫連接對象var_export( $post->get_post(1024) );
對比下面的寫法,可以體會下依賴注入其實是給完全OOP的某些語言打補(bǔ)丁.
<?phpfunction db() { static $db; if ($db) {return $db; } else {$db = new mysqli(’127.0.0.1’,’user’,’pass’,’dbname’,3306);return $db; }}function get_post($id) { $db = db(); return $db->query(’SELECT * FROM post WHERE id =’.intval($id))->fetch_all();}
相關(guān)文章:
1. MySQL客戶端吃掉了SQL注解?2. php自學(xué)從哪里開始?3. mysql - AttributeError: ’module’ object has no attribute ’MatchType’4. 數(shù)據(jù)庫 - MySQL 單表500W+數(shù)據(jù),查詢超時,如何優(yōu)化呢?5. 求大神幫我看看是哪里寫錯了 感謝細(xì)心解答6. python - Django分頁和查詢參數(shù)的問題7. javascript - 圖片能在網(wǎng)站顯示,但控制臺仍舊報錯403 (Forbidden)8. javascript - 百度echarts series數(shù)據(jù)更新問題9. phpstady在win10上運(yùn)行10. python小白的基礎(chǔ)問題 關(guān)于while循環(huán)的嵌套
