angularjs之我見 注入器

2021-09-12 05:23:14 字數 1744 閱讀 9752

剛開始看angularjs時,總是雲裡霧裡的,出現了很多新的理念。最後硬著頭皮看原始碼,還真發現許多奇妙處,記錄下來:

注入器injector

anguarjs的注入器主要是用來將provider作為引數注入到被注入的函式中。

其包合:

1.invoke(fn, self, locals):通過fn的引數列表(獲取[]方式指定,或$inject)得到需要注入的provider作為fn的引數呼叫fn。

注:如果提供了locals,系統會先通過locals查詢注入列表,只有找不到時,才找provider

args.push(

locals && locals.hasownproperty(key)

? locals[key]: getservice(key)

);

2.annotate(fn),獲得注入列表

有三種方式:

a.通過推測來注釋:通過函式引數推斷

b.顯式注釋:在函式中指定$inject

c.內聯注釋:通過陣列方式,最後乙個元素為函式

3.instantiate(type, locals):通過type建立乙個實力化物件,type函式預設支援di

其實他的原理是通過type建立物件,再通過invoke函式實現di,此時第二個引數self為創建立的物件。

4.get(servicename):呼叫getservice,根據servicename獲取provider,此時很重要的是provider的cache,和獲取的方式。

有兩種注入器,一種是providerinjector,另外是instanceinjector

他們的cache分別是providercache和instancecache

而且獲取方式分別為:

function () ", path.join(' <- '));}和

function (servicename)

從上可以看出,providercache一定存在指定的provider,否則會報錯。

instanceinjector獲取時,會先從providercache中獲得provider,再通過instanceinjector的invoke,對獲得的provider的$get函式做di,所以這就是為何provider必須體供$get的函式的原因。

那di是什麼時間發生的呢?

1.在module的config中

module中的config ==>providercache中的$injector的invoke,

此時$injector為providerinjector,所以config函式注入的將是providercache中的provider.

2.在module的runblocks中

此時呼叫的是instanceinjector的invoke,所以被注入的都是instancecache的provider

以下是module體供的方法:

provider ==>providercache中的$provide的provider,

factory ==>providercache中的$provide的factory,

service ==>providercache中的$provide的service,

value ==>providercache中的$provide的value,

constant ==>providercache中的$provide的constant

AngularJS 依賴注入

本篇文章參考自angularjs權威教程。乙個物件通常有三種方式可以獲得對其依賴的控制權。依賴注入是通過第三種方式實現的,其優點在於去除對依賴關係的硬編碼,可以在執行時改變甚至移除依賴關係。第一種方法和第二種,呼叫者和被呼叫者或和生產被呼叫者的工廠耦合在一起,第二種還會汙染全域性作用域。angula...

預防SQL注入之我見

1 sql注入攻擊的本質 讓客戶端傳遞過去的字串變成sql語句,而且能夠被執行。2 每個程式設計師都必須肩負起防止sql注入攻擊的責任。說起防止sql注入攻擊,感覺很鬱悶,這麼多年了大家一直在討論,也一直在爭論,可是到了現在似乎還是沒有定論。當不知道注入原理的時候會覺得很神奇,怎麼就被注入了呢?會覺...

預防SQL注入之我見

1 sql注入攻擊的本質 讓客戶端傳遞過去的字串變成sql語句,而且能夠被執行。2 每個程式設計師都必須肩負起防止sql注入攻擊的責任。說起防止sql注入攻擊,感覺很鬱悶,這麼多年了大家一直在討論,也一直在爭論,可是到了現在似乎還是沒有定論。當不知道注入原理的時候會覺得很神奇,怎麼就被注入了呢?會覺...