SwiftSuspenders 1.6 浅出深入 深入 2
類解讀
Injector
?????????Injector是整個SwiftSuspenders框架的核心。與開發者打交道最多的也就是Injector類。Injector就是注入器,其功能相當于Spring里的ApplicationContext。是IOC容器。簡單的理解可以將它理解為一個工廠,當開發者需要一個對象的時候,不是new出這個對象,而是通過Injector得到這個對象。Injector會自動完成返回的對象的依賴注入。
?????????Injector的私有屬性如下:
| 屬性名 | 功能 |
| INJECTION_POINTS_CACHE[static]:Dictionary | 一個靜態屬性,緩存所有注入器的注入點描述。如果一個注入器通過xml來配置注入點,則不會和其他注入器共享注入點的緩存;如果不是通過xml來配置注入點,則會所有的注入器都共享注入點緩存,這也是基于性能的考慮。由于分析一個類的注入點需要通過describeType方法解析類的XML描述,如果兩個注入器會映射相同的類,那么只需要解析一遍就可以了。注意:這個變量緩存的是類的注入點(InjectionPoints)信息而非注入配置(InjectionConfig)。注入器之間是不共享注入配置信息的。如A1注入器已經映射過一次B類,如果A2注入器再映射B類時,就直接使用A1注入器映射過的B類的注入點信息而不需要自己再一次運算了。因為同一個類的注入點一定是相同的。 |
| m_parentInjector : Injector | 父注入器的引用 |
| m_applicationDomain: ApplicationDomain | 注入器工作的應用程序域 |
| m_mappings: Dictionary | 存儲所有該注的注入配置(InjectionConfig) |
| m_injecteeDescriptions: Dictionary | 存儲該注入器相關的的注入點描述。如果不是通過xml進行注入點配置的話,該屬性指向INJECTION_POINTS_CACHE,即所有的注入器共享類的注入點信息 |
| m_attendedToInjectees: Dictionary | 存儲已經注入過的對象。這樣在下一次請求時,就不需要再執行注入操作。以提升性能。 |
| m_xmlMetadata:XML | 配置注入信息的XML文件。 |
?
?????????Injector公有方法如下:
?
| 方法名 | 功能 |
| Injector(xmlConfig : XML = null) | 構造函數,初始化注入器的一些私有變量,如果是通過xml進行配置。就在參數里面寫入。這樣注入器就會設置為xml配置的模式。 |
| mapValue(whenAskedFor : Class, useValue : Object, named : String = "") : * | 值映射。將一個請求[類的全名+#+注入名]映射為一個已有的對象 |
| mapClass(whenAskedFor : Class, instantiateClass : Class, named : String = "") : * | 類映射,將一個請求[類的全名+#+注入名]映射為一個類。注意,被映射的類和請求的類可以毫無關系。 |
| mapSingleton( whenAskedFor : Class, named : String = "") : * | 單例映射,將一個請求[類的全名+#+注入名]映射為該類的單例對象。 |
| mapSingletonOf( whenAskedFor : Class, useSingletonOf : Class, named : String = "") : * | 單例類映射,將一個請求[類的全名+#+注入名]映射為另一個類的單例對象。注意,被映射的類和請求的類可以毫無關系。 |
| mapRule(whenAskedFor : Class, useRule : *, named : String = "") : * | 規則映射。將一個請求[類的全名+#+注入名]映射另一個注入配置的返回策略(個人覺得這個方法其實沒什么作用。還不如將第二個參數設為自定義的InjectionResult。這樣還可以增加可擴展性) |
| getMapping (whenAskedFor : Class, named : String = "") | 根據請求獲得相應的注入配置。如果已有相應的注入配置,直接從mappings緩存里面返回,如果沒有,則會新建一個相應的注入配置。然后保存在mapping中。 |
| injectInto(target : Object):void | 向目標對象進行依賴注入。(只包括屬性注入和方法注入)。構造函數注入在生成目標對象時就已經完成了。 |
| instantiate(clazz:Class):* | 實例化一個類。會通過構造函數注入方法新建這個類,然后調用injectInto方法完成這個對象的依賴注入。最后返回完成注入的對象。 |
| unmap(clazz : Class, named : String = ""):* | 解除一個映射。內部只是將該映射的InjectionConfig的返回策略設為空。(個人認為應該還需要將mapping里面的引用刪掉)。 |
| hasMapping(clazz : Class, named : String = '') : Boolean | 根據一個請求檢測是否存在相應的注入配置(InjectionConfig) |
| getInstance(clazz : Class, named : String = '') : * | 根據請求返回相應的實例。該實例已經完成所有的依賴注入。 |
| createChildInjector(applicationDomain:ApplicationDomain=null) : Injector | 創建子注入器 |
| setApplicationDomain(applicationDomain:ApplicationDomain):void | 設置注入器的應用程序域 |
| getApplicationDomain():ApplicationDomain | 獲得注入器的應用程序域 |
| setParentInjector(parentInjector : Injector) | 設置注入器的父注入器 |
| getParentInjector() : Injector | 獲得注入器的父注入器 |
| purgeInjectionPointsCache() | 清除注入點緩存。 |
?
?????????Injector包內方法如下:
| 方法名 | 功能 |
| getAncestorMapping( whenAskedFor : Class, named : String = null) : InjectionConfig | 自下而上依次從父注入器獲得請求的注入配置。直到找到為止。注意:只會尋找離當前注入器最近的注入配置。如A的父注入器是B,B的父注入器是C。B和C有相同請求名的注入配置。那么A只會使用B的注入配置。 |
| get attendedToInjectees() : Dictionary | 獲得所有已經住如過的對象。 |
?
?????????Injector的私有方法如下:
| 方法名 | 功能 |
| getInjectionPoints(clazz : Class) : InjecteeDescription | 獲得一個類的注入描述(InjecteeDescription)。這個注入描述中包含了這個類所有的注入點信息。通過describeType方法獲得這個類的XML表示。然后查找包含Inject元數據和PostConstruct元數據的節點來配置相應的注入點。最后封裝到InjecteeDescription對象中 |
| getConfigurationForRequest(clazz : Class, named : String, traverseAncestors : Boolean = true) : InjectionConfig | 根據請求返回相應的注入配置(InjectionConfig)。traverseAncestors決定是會從父注入器中查找。 |
| createInjectionPointsFromConfigXML(description : XML) | 從xml中配置注入點信息。大體的流程是首先清除原來類中的所有元數據信息,然后根據配置的xml,重新添加新的元數據信息。 |
| addParentInjectionPoints(description : XML, injectionPoints : Array) : void | 從父類中找到注入點,然后添加進子類的注入點描述當中。因為子類也應該繼承父類的注入點信息。 |
?
?????????Injector包外類:InjecteeDescription
InjecteeDescription描述了一個類的注入點信息。內含兩個公有屬性:
| 屬性名 | 功能 |
| Ctor:InjectionPoint | 構造函數注入點 |
| injectionPoints?:Array | 屬性,方法和PostConstruct注入點 ? |
轉載于:https://www.cnblogs.com/tankaixiong/archive/2012/12/10/2811099.html
總結
以上是生活随笔為你收集整理的SwiftSuspenders 1.6 浅出深入 深入 2的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: TCP/IP网络协议的通俗理解,sock
- 下一篇: asp.net MVC 路由