日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

SwiftSuspenders 1.6 浅出深入 深入 2

發(fā)布時(shí)間:2025/7/14 52 豆豆
生活随笔 收集整理的這篇文章主要介紹了 SwiftSuspenders 1.6 浅出深入 深入 2 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

類解讀

Injector

?????????Injector是整個(gè)SwiftSuspenders框架的核心。與開發(fā)者打交道最多的也就是Injector類。Injector就是注入器,其功能相當(dāng)于Spring里的ApplicationContext。是IOC容器。簡(jiǎn)單的理解可以將它理解為一個(gè)工廠,當(dāng)開發(fā)者需要一個(gè)對(duì)象的時(shí)候,不是new出這個(gè)對(duì)象,而是通過Injector得到這個(gè)對(duì)象。Injector會(huì)自動(dòng)完成返回的對(duì)象的依賴注入。

?????????Injector的私有屬性如下

屬性名

功能

INJECTION_POINTS_CACHE[static]:Dictionary

一個(gè)靜態(tài)屬性,緩存所有注入器的注入點(diǎn)描述。如果一個(gè)注入器通過xml來配置注入點(diǎn),則不會(huì)和其他注入器共享注入點(diǎn)的緩存;如果不是通過xml來配置注入點(diǎn),則會(huì)所有的注入器都共享注入點(diǎn)緩存,這也是基于性能的考慮。由于分析一個(gè)類的注入點(diǎn)需要通過describeType方法解析類的XML描述,如果兩個(gè)注入器會(huì)映射相同的類,那么只需要解析一遍就可以了。注意:這個(gè)變量緩存的是類的注入點(diǎn)(InjectionPoints)信息而非注入配置(InjectionConfig)。注入器之間是不共享注入配置信息的。如A1注入器已經(jīng)映射過一次B類,如果A2注入器再映射B類時(shí),就直接使用A1注入器映射過的B類的注入點(diǎn)信息而不需要自己再一次運(yùn)算了。因?yàn)橥粋€(gè)類的注入點(diǎn)一定是相同的。

m_parentInjector : Injector

父注入器的引用

m_applicationDomain:

ApplicationDomain

注入器工作的應(yīng)用程序域

m_mappings: Dictionary

存儲(chǔ)所有該注的注入配置(InjectionConfig)

m_injecteeDescriptions: Dictionary

存儲(chǔ)該注入器相關(guān)的的注入點(diǎn)描述。如果不是通過xml進(jìn)行注入點(diǎn)配置的話,該屬性指向INJECTION_POINTS_CACHE,即所有的注入器共享類的注入點(diǎn)信息

m_attendedToInjectees: Dictionary

存儲(chǔ)已經(jīng)注入過的對(duì)象。這樣在下一次請(qǐng)求時(shí),就不需要再執(zhí)行注入操作。以提升性能。

m_xmlMetadataXML

配置注入信息的XML文件。

?

?????????Injector公有方法如下

?

方法名

功能

Injector(xmlConfig : XML = null)

構(gòu)造函數(shù),初始化注入器的一些私有變量,如果是通過xml進(jìn)行配置。就在參數(shù)里面寫入。這樣注入器就會(huì)設(shè)置為xml配置的模式。

mapValue(whenAskedFor : Class, useValue : Object, named : String = "") : *

值映射。將一個(gè)請(qǐng)求[類的全名+#+注入名]映射為一個(gè)已有的對(duì)象

mapClass(whenAskedFor : Class, instantiateClass : Class, named : String = "") : *

類映射,將一個(gè)請(qǐng)求[類的全名+#+注入名]映射為一個(gè)類。注意,被映射的類和請(qǐng)求的類可以毫無關(guān)系。

mapSingleton(

whenAskedFor : Class, named : String = "") : *

單例映射,將一個(gè)請(qǐng)求[類的全名+#+注入名]映射為該類的單例對(duì)象。

mapSingletonOf(

whenAskedFor : Class, useSingletonOf : Class, named : String = "") : *

單例類映射,將一個(gè)請(qǐng)求[類的全名+#+注入名]映射為另一個(gè)類的單例對(duì)象。注意,被映射的類和請(qǐng)求的類可以毫無關(guān)系。

mapRule(whenAskedFor : Class, useRule : *, named : String = "") : *

規(guī)則映射。將一個(gè)請(qǐng)求[類的全名+#+注入名]映射另一個(gè)注入配置的返回策略(個(gè)人覺得這個(gè)方法其實(shí)沒什么作用。還不如將第二個(gè)參數(shù)設(shè)為自定義的InjectionResult。這樣還可以增加可擴(kuò)展性)

getMapping

(whenAskedFor : Class, named : String = "")

根據(jù)請(qǐng)求獲得相應(yīng)的注入配置。如果已有相應(yīng)的注入配置,直接從mappings緩存里面返回,如果沒有,則會(huì)新建一個(gè)相應(yīng)的注入配置。然后保存在mapping中。

injectInto(target : Object):void

向目標(biāo)對(duì)象進(jìn)行依賴注入。(只包括屬性注入和方法注入)。構(gòu)造函數(shù)注入在生成目標(biāo)對(duì)象時(shí)就已經(jīng)完成了。

instantiate(clazz:Class):*

實(shí)例化一個(gè)類。會(huì)通過構(gòu)造函數(shù)注入方法新建這個(gè)類,然后調(diào)用injectInto方法完成這個(gè)對(duì)象的依賴注入。最后返回完成注入的對(duì)象。

unmap(clazz : Class, named : String = ""):*

解除一個(gè)映射。內(nèi)部只是將該映射的InjectionConfig的返回策略設(shè)為空。(個(gè)人認(rèn)為應(yīng)該還需要將mapping里面的引用刪掉)

hasMapping(clazz : Class, named : String = '') : Boolean

根據(jù)一個(gè)請(qǐng)求檢測(cè)是否存在相應(yīng)的注入配置(InjectionConfig)

getInstance(clazz : Class, named : String = '') : *

根據(jù)請(qǐng)求返回相應(yīng)的實(shí)例。該實(shí)例已經(jīng)完成所有的依賴注入。

createChildInjector(applicationDomain:ApplicationDomain=null) : Injector

創(chuàng)建子注入器

setApplicationDomain(applicationDomain:ApplicationDomain):void

設(shè)置注入器的應(yīng)用程序域

getApplicationDomain():ApplicationDomain

獲得注入器的應(yīng)用程序域

setParentInjector(parentInjector : Injector)

設(shè)置注入器的父注入器

getParentInjector() : Injector

獲得注入器的父注入器

purgeInjectionPointsCache()

清除注入點(diǎn)緩存。

?

?????????Injector包內(nèi)方法如下:

方法名

功能

getAncestorMapping(

whenAskedFor : Class, named : String = null) : InjectionConfig

自下而上依次從父注入器獲得請(qǐng)求的注入配置。直到找到為止。注意:只會(huì)尋找離當(dāng)前注入器最近的注入配置。如A的父注入器是BB的父注入器是CBC有相同請(qǐng)求名的注入配置。那么A只會(huì)使用B的注入配置。

get attendedToInjectees() : Dictionary

獲得所有已經(jīng)住如過的對(duì)象。

?

?????????Injector的私有方法如下:

方法名

功能

getInjectionPoints(clazz : Class) : InjecteeDescription

獲得一個(gè)類的注入描述(InjecteeDescription)。這個(gè)注入描述中包含了這個(gè)類所有的注入點(diǎn)信息。通過describeType方法獲得這個(gè)類的XML表示。然后查找包含Inject元數(shù)據(jù)和PostConstruct元數(shù)據(jù)的節(jié)點(diǎn)來配置相應(yīng)的注入點(diǎn)。最后封裝到InjecteeDescription對(duì)象中

getConfigurationForRequest(clazz : Class, named : String, traverseAncestors : Boolean = true) : InjectionConfig

根據(jù)請(qǐng)求返回相應(yīng)的注入配置(InjectionConfig)traverseAncestors決定是會(huì)從父注入器中查找。

createInjectionPointsFromConfigXML(description : XML)

xml中配置注入點(diǎn)信息。大體的流程是首先清除原來類中的所有元數(shù)據(jù)信息,然后根據(jù)配置的xml,重新添加新的元數(shù)據(jù)信息。

addParentInjectionPoints(description : XML, injectionPoints : Array) : void

從父類中找到注入點(diǎn),然后添加進(jìn)子類的注入點(diǎn)描述當(dāng)中。因?yàn)樽宇愐矐?yīng)該繼承父類的注入點(diǎn)信息。

?

?????????Injector包外類:InjecteeDescription

InjecteeDescription描述了一個(gè)類的注入點(diǎn)信息。內(nèi)含兩個(gè)公有屬性:

屬性名

功能

Ctor:InjectionPoint

構(gòu)造函數(shù)注入點(diǎn)

injectionPoints?:Array

屬性,方法和PostConstruct注入點(diǎn)

?

轉(zhuǎn)載于:https://www.cnblogs.com/tankaixiong/archive/2012/12/10/2811099.html

總結(jié)

以上是生活随笔為你收集整理的SwiftSuspenders 1.6 浅出深入 深入 2的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。