robotlegs 全面解读(二)

[b][size=large] robotlegs 全面解读(二)[/size][/b]
—swiftsuspenders解读

通过上一篇文章相信大家对基于元数据的依赖注入有了很好的理解。其实讲swiftsuspenders的文章在上网已经有很多,更有甚者对源码一一做了注解。但本人感觉一点点的阅读源码着实让人头痛。所以想从宏观上跟大家一起学习swiftsuspenders的工作机制。

首先我们先说一下它的主要组成部分;

两个主要的类:
Injector;注入器:我们通过它来实现对对象的映射及注入。
InjectionConfig;注入配置:通过它来记录存储我们的映射。(当需要给某对象的某个注入点做注入时,需要获得对应的注入配置)

两个包:
Injectionpoints;注入点对象包:此包内为所有类型的注入点对象,包括构造注入点(ConstructorInjectionPoint)、属性注入点(PropertyInjectionPoint)、方法注入点(MethodInjectionPoint)。
Injectionresults;返回类型对象包:其实就是为了表示注入的时候实际注入的是什么对象,是所映射对象本身(InjectValueResult)还是所映射对象的新实例(InjectClassResult)还是所映射对象的唯一实例(InjectSingletonResult)还是其他自定义的对象(InjectOtherRuleResult);

其他还有表示异常的InjectorError,和一个存放公共方法的Reflector对象。

下边我们以属性注入为例,来简述一下它的工作流程。

映射:

首先我们需要通过Injector的mapValue()方法映射一个需要注入的对象。如:
mapValue(AClass,myClass)
我们映射一个AClass的实例对象aClass,此时Injector会创建一个InjectionConfig
var config : InjectionConfig =new InjectionConfig(AClass);
然后设置此config对象的返回类型为InjectValueResult(返回映射对象本身,因为是属性映射)。
config.setResult(new InjectValueResult(useValue));
然后将此config存入映射字典m_mappings;
至此映射部分结束。

注入:

例:我们需要得到类Bclass的一个实例,此Bclass需要注入之前的aClass。
var bClass:BClass=injector. getInstance (BClass);


此时Injector会通过读取BClass的xml描述,得到表示BClass的注入点描述对象InjecteeDescription,此对象里边的injectionPoints记录了BClass里的所有属性、方法注入点。此处为一个属性注入点—PropertyInjectionPoint。
Injector会根据这些注入点得到对应的注入配置(即刚才的config对象),调用config.getResponse()得到需要注入的对象进行注入。

子注入器

在Injector里边有创建子注入器的方法createChildInjector();那子注入器有什么用处了?

通过阅读源码我们会发现,父注入器的映射字典m_mappings对子注入器来说是可读的,也就是说子注入器可以直接读取父注入器的映射资源。但子注入器又有会有自己的的映射字典。在注入时,子注入器会首先读取自身的映射资源,若没有会往上从父注入器里找,若还没有则会继续往上级父注入器查找。

子注入器在解决某些特殊问题上提供了方便(如经典的机器人退问题)。最为重要的是为robotlegs的多模块实现提供了便利。使各个模块即可以使用主模块的资源,又可以有自己内部的资源,平级的模块之间互不干涉。

作者:王闯
email :wangchuang1113@163.com;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值