robotlegs 全面解读(二)
—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 :
[email protected];