• 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注入点

     

  • 相关阅读:
    这样设计是否更好些~仓储接口是否应该设计成基础操作接口和扩展操作接口
    爱上MVC3~MVC+ZTree实现对树的CURD及拖拽操作
    Android自定义图形,图形的拼接、叠加、相容
    CSDN问答频道“华章杯”7月排行榜活动开始,丰厚奖品等你拿
    修改MyEclipse内存-------OutOfMemoryError错误
    MySQL中MySQL X.X Command Line Client一闪而过的问题
    C++组合问题
    Android编程之仿微信显示更多文字的View
    理解MapReduce哲学
    mysql 备份
  • 原文地址:https://www.cnblogs.com/tankaixiong/p/2811099.html
Copyright © 2020-2023  润新知