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_xmlMetadataXML

配置注入信息的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的父注入器是BB的父注入器是CBC有相同请求名的注入配置。那么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/p/2811099.html