类解读

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的父注入器是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/archive/2012/12/10/2811099.html

SwiftSuspenders 1.6 浅出深入 深入 2相关推荐

  1. Bookmarks_2012_06_13

    Bookmarks 书签栏 VeryCD 邮件 - 入职申请SVN - zengfeng@verycd.com2345网址导航-我的个性化主页-中国最好的网址站我的工作台 - 心动游戏项目管理 手册A ...

  2. SwiftSuspenders 1.6-深入浅出1

    深入 这篇SwiftSuspenders 浅出深入的 深入部分主要是对SwiftSuspenders进行深度剖析,包括对SwiftSuspenders的体系结构的分析,一个对象在整个注入过程中会经历怎 ...

  3. swiftsuspenders Memo

    核心类Injector Injector 通过下面的方法 注册和注销 inject, mapValue,mapClass,mapSingleton/mapSingletonOf,mapRule,unm ...

  4. RobotLegs框架解析

    RobotLegs框架解析 一,优点: 解耦,维护,统一规范利于分工合作. 二,框架思想 :基于Model-View-Controller元设计模式+S(service:用于接收外部数据与外部通讯 ü ...

  5. robotlegs框架吴秦大师续讲【转载】

    2012-03-21 15:56 by 吴秦, 5533 阅读, 9 评论, 收藏, 编辑 RobotLegs轻量级AS3框架 任何一个好的东西(语言.框架等)最终还取决于用的人 语言和框架本身并不能 ...

  6. 谏太宗十思疏 魏征(原文/译文)

    臣闻求木之长者,必固其根本:欲流之远者,必浚其泉源:思国之安者,必积其德义.源不深而望流之远,根不固而求木之长,德不厚而思国之安,臣虽下愚,知其不可,而况于明哲乎?人君当神器之重[1],居域中之大[2 ...

  7. 我的网页游戏开发计划[7.03更新]

    谨以此博记录我的游戏开发路程,进度将不定期在此文中更新. 想要开发一个网页游戏,下面是我的计划: 1.客户端计划用flash语言,所以需要先学习AS3和Flex. 目前AS3已经大致学完,对Flex也 ...

最新文章

  1. 暑期集训1:C++STL 练习题C:HDU-1263
  2. 这51个大数据术语,你懂的有几个?
  3. 操作系统中,进程与线程怎么设计的?
  4. 11月国内网站统计:淘宝得益于双11流量直逼腾讯
  5. java开发人员_每个Java开发人员都应该阅读的10本书
  6. IOS AppUI规格指南
  7. 编译速度谁“最快”?25岁的 C++Builder 还能打
  8. python实现生日祝福短信_Python实现好友生日提醒
  9. ios人脸识别_适用于Android和iOS的10种最佳人脸识别应用程序
  10. 基于深度学习的长江干线水位数据回归预测
  11. 敏捷经验教训, 开发总结!
  12. 期货与期权套期保值的对比研究
  13. PhotonServer MMO游戏开发
  14. 苹果删除照片不释放内存_别再胡乱清理垃圾了,只要删除这6个文件夹,瞬间释放20GB内存...
  15. 用Python绘制条形图
  16. docker原理及基本概念
  17. 猿创征文 | Java知识【Java基础语法】
  18. 换掉 Java 8 Java 1718 新特性真香
  19. 怎样对10亿个数字快速去重?——浅析位图数据结构及其应用
  20. 前端学习之理解304过程

热门文章

  1. 【NOIP模拟】T1 发电机(递推逆元+期望)
  2. BZOJ 2793: [Poi2012]Vouchers(调和级数)
  3. 9.11排序与查找(三)——给定一个排序后的数组,包括n个整数,但这个数组已被旋转过多次,找出数组中的某个元素...
  4. Node 抓取非utf-8编码页面
  5. glance系列一:glance基础
  6. 清楚xcode缓存(老是忘记所有记下来方便以后查阅)
  7. 使用Charles在iOS6上进行抓包
  8. 曾今的代码系列——获取当天最大流水号存储过程
  9. 用 WEKA 进行数据挖掘,第 3 部分: 最近邻和服务器端库
  10. CentOS7下搭建Nginx+PHP7的安装配置