类解读
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注入点
|