SwiftSuspenders 1.6 浅出深入 深入 2
類解讀
Injector
?????????Injector是整個(gè)SwiftSuspenders框架的核心。與開發(fā)者打交道最多的也就是Injector類。Injector就是注入器,其功能相當(dāng)于Spring里的ApplicationContext。是IOC容器。簡(jiǎn)單的理解可以將它理解為一個(gè)工廠,當(dāng)開發(fā)者需要一個(gè)對(duì)象的時(shí)候,不是new出這個(gè)對(duì)象,而是通過(guò)Injector得到這個(gè)對(duì)象。Injector會(huì)自動(dòng)完成返回的對(duì)象的依賴注入。
?????????Injector的私有屬性如下:
| 屬性名 | 功能 |
| INJECTION_POINTS_CACHE[static]:Dictionary | 一個(gè)靜態(tài)屬性,緩存所有注入器的注入點(diǎn)描述。如果一個(gè)注入器通過(guò)xml來(lái)配置注入點(diǎn),則不會(huì)和其他注入器共享注入點(diǎn)的緩存;如果不是通過(guò)xml來(lái)配置注入點(diǎn),則會(huì)所有的注入器都共享注入點(diǎn)緩存,這也是基于性能的考慮。由于分析一個(gè)類的注入點(diǎn)需要通過(guò)describeType方法解析類的XML描述,如果兩個(gè)注入器會(huì)映射相同的類,那么只需要解析一遍就可以了。注意:這個(gè)變量緩存的是類的注入點(diǎn)(InjectionPoints)信息而非注入配置(InjectionConfig)。注入器之間是不共享注入配置信息的。如A1注入器已經(jīng)映射過(guò)一次B類,如果A2注入器再映射B類時(shí),就直接使用A1注入器映射過(guò)的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)描述。如果不是通過(guò)xml進(jìn)行注入點(diǎn)配置的話,該屬性指向INJECTION_POINTS_CACHE,即所有的注入器共享類的注入點(diǎn)信息 |
| m_attendedToInjectees: Dictionary | 存儲(chǔ)已經(jīng)注入過(guò)的對(duì)象。這樣在下一次請(qǐng)求時(shí),就不需要再執(zhí)行注入操作。以提升性能。 |
| m_xmlMetadata:XML | 配置注入信息的XML文件。 |
?
?????????Injector公有方法如下:
?
| 方法名 | 功能 |
| Injector(xmlConfig : XML = null) | 構(gòu)造函數(shù),初始化注入器的一些私有變量,如果是通過(guò)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)求的類可以毫無(wú)關(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)求的類可以毫無(wú)關(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ì)通過(guò)構(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的父注入器是B,B的父注入器是C。B和C有相同請(qǐng)求名的注入配置。那么A只會(huì)使用B的注入配置。 |
| get attendedToInjectees() : Dictionary | 獲得所有已經(jīng)住如過(guò)的對(duì)象。 |
?
?????????Injector的私有方法如下:
| 方法名 | 功能 |
| getInjectionPoints(clazz : Class) : InjecteeDescription | 獲得一個(gè)類的注入描述(InjecteeDescription)。這個(gè)注入描述中包含了這個(gè)類所有的注入點(diǎn)信息。通過(guò)describeType方法獲得這個(gè)類的XML表示。然后查找包含Inject元數(shù)據(jù)和PostConstruct元數(shù)據(jù)的節(jié)點(diǎn)來(lái)配置相應(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)信息。大體的流程是首先清除原來(lái)類中的所有元數(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的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: TCP/IP网络协议的通俗理解,sock
- 下一篇: asp.net MVC 路由