1.0 注入器/injector
注入器是AngularJS框架實現和應用開發的關鍵,這是一個DI/IoC容器的實現。
AngularJS將功能分成了不同類型的組件分別實現,這些組件有一個統稱 - 供給者/provider, 下圖中列出了AngularJS幾個常用的內置服務:

AngularJS的組件之間不可以互相直接調用,一個組件必須通過注入器才 可以調用另一個組件。這樣的好處是組件之間相互解耦,對象的整個生命周期的管理 甩給了注入器。
注入器實現了兩個重要的功能:
集中存儲所有provider的配方
配方其實就是:名稱+類構造函數。AngularJS啟動時,這些provider首先使用其配方在注入器 內注冊。比如,http請求服務組件封裝在$httpProvider類內,它通過"$http"這個名字在注入 器內注冊。
按需提供功能組件的實例
其他組件,比如一個用戶的控制器,如果需要使用http功能,使用"$http"這個名字 向注入器請求,就可以獲得一個http服務實例了。
試着修改→_→的代碼,查看下$compile服務到底是什么?
2.0 注冊服務組件
從injector的角度看,組件就是一個功能提供者,因此被稱為供給者/Provider。 在AngularJS中,provider以JavaScript類(構造函數)的形式封裝。

服務名稱通常使用一個字符串標識,比如"$http"代表http調用服務、"$rootScope"代表根 作用域對象、"$compile"代表編譯服務...
Provider類要求提供一個$get函數(類工廠),injector通過調用該函數, 就可以獲得服務組件的實例。
名稱和類函數的組合信息,被稱為配方。injector中維護一個集中的配方庫, 用來按需創建不同的組件。這個配方庫,其實就是一個Hash對象,key就是服務名稱,value 就是類定義。
在→_→的示例中,我們定義了一個簡單的服務類,這個服務類的實例就是一個字符串:“hello,world!”。 我們使用"ezHello"作為其服務名在注入器里注冊,並通過注入器將這個實例顯示出來。
3.0 獲得注入器對象
要使用AngularJS的功能,必須首先獲取注入器。有兩種方法取得注入器。
創建一個新的注入器
可以使用angular.injector()創建一個新的注入器:
angular.injector(modules,[strictDi]);
獲取已經創建的注入器
如果AngularJS框架已經啟動,那么可以使用DOM對象的injector()方法獲 得已經創建的注入器:
varelement=angular.element(dom_element);
varinjector=element.injector();
通過注入器調用API
注入器有兩個方法可供進行API調用:invoke()和get()。
invoke()
使用注入器的invoke()方法,可以直接調用一個用戶自定義的函數體,並通過函數參數 注入所依賴的服務對象,這是AngularJS推薦和慣例的用法:
angular.injector(['ng'])
.invoke(function($http){
//do sth. with $http
});
get()
也可以使用注入器的get()方法,獲得指定名稱的服務實例:
varmy$http=angular.injector(['ng']).get('$http');
//do sth. with my$http
→_→的示例這次使用了get()方法直接獲取一個服務實例,感受一下