深入

这篇SwiftSuspenders 浅出深入的 深入部分主要是对SwiftSuspenders进行深度剖析,包括对SwiftSuspenders的体系结构的分析,一个对象在整个注入过程中会经历怎样的生命周期,以及对SwiftSuspenders每个类的详细解读。

术语表

首先为了表达的明确性,先列下了一些可能在文章中用到的术语。这样便于减少理解上的歧义:

为了解释清楚术语之间的关系,我们设计以下场景以进行类比:闪闪同学生病了,需要进行打针治疗。

术语名

英文

解释

依赖

Dependency

面向对象中类之间的关系,简单来说,当A类的某些功能需要B类进行辅助时,就说A类对B类有依赖。如闪闪同学需要药来治病,那么就说闪闪对药有依赖

注入

Injection

一种建立依赖关系的行为。如闪闪同学要使用药,就必须让药进入体内(引用关系)。如何让药进入体内呢?需要一个针筒,通过注射来获得药物。这就是注入。当A和B的依赖关系由C来建立。B被C注入进了A。

注入器

Injector

就是SwiftSuspenders里面的Injector类的一个实例,相当于扮演针筒的角色。

注入配置

InjectionConfig

是针对一个注入行为的配置对象。包含注入请求的类和注入名。所使用的注入器和返回结果的策略等信息。如闪闪得的是感冒,需要注射感冒药,还需要注射消炎药,这时候闪闪就要请求两种类型的药。同一种类型的药,可能还有不同的品牌,所以有的时候还需要加上请求的药的名字,就相当于注入名。注入配置就相当于一张处方单。

注入点

InjectionPoint

依赖注入分几种形式,如,构造函数注入,属性注入和方法注入。这些都称做注入点。比如打针,可以打PP,也可以打胳膊。属性注入就是对public的属性或者有setter方法进行复制,方法注入就是像某个函数传参。

注入描述

InjecteeDescription

包含了一个被注入对象的所有的注入点。比如闪闪打针,需要在胳膊打一针,需要在屁股打两针。就会描述在注入描述里面。InjecteeDescription是Injector的一个包外类。

返回策略

InjectionResult

反应了注入器以何种方式对请求进行注入,如直接新建一个B对象,然后注入A,或者以单例模式新建一个B对象,然后所有使用B的注入都会共享同一个对象等等。

体系结构

SwiftSuspenders的类图如上图所示。整个框架以Injector为核心。InjectionPoint包中包含了所有与注入点相关的类,InjectionResult包中包含了返回策略相关的类。其他的类都是配合Injector类进行工作。具体的类的解读会在下一章进行深入介绍。

其中用到的设计模式主要有策略模式,模板方法。

在InjectionResult包中主要使用了通过策略模式,作者针对不同的需求创造了不同的映射策略,如单例模式,类模式,对象模式。同时还允许开发者开发其他所需的策略。

在InjectionPoint包中主要使用了模板方法,通过让不同的子类实现initializeInjection这个钩子(hook)方法从而实现不同的注入点

对象生命周期

这一章主要从内部分析SwiftSuspender的两个主要活动:映射和注入的流程

映射顺序图

以mapClass为例,首先主程序调用Injector的mapClass方法,传入所需的参数;

然后Injector调用自身的getMapping方法,获得一个相应的注入配置对象,如果再此之前已经建立过相应的注入配置,则直接返回,如果没有,就会新建一个注入配置对象

获得注入配置对象后,就会调用得到的InjectionConfig的setResult方法设置该配置的返回策略。如为类映射是,就设置为InjectClassResult。如果是单例,则设置为InjectSingletonResult。以此类推。

最后返回设置好各项参数的InjectionConfig。同时该InjectionConfig对象就会存在Injector的m_mappings的Dictionary中。整个映射的过程就完成了。

注入顺序图

通过Injector的getInstance()方法可以获得注入后的对象。主程序通过向Injector发送类+注入名的请求以获得对象。

Injector得到请求后,调用自身的getConfigurationForRequest()方法获得相应的InjectionConfig注入配置.

获得注入配置后,调用InjectionConfig的getResponse()方法获得结果。

InjectionConfig的getResponse()方法会调用相应的InjectionResult返回策略的getResponse()方法获得结果。如果traverseAncestors设为true,那么当在当前的注入器中没有找到相应的注入配置时,还会从下至上依次遍历其祖先注入器,直到找到位置。

InjectionResult会调用Injector的instantiate()方法获得对象。

在Injector的instantiate方法会调用Injector的getInjectionPoints方法获得需要注入的类的所有的注入点。然后调用构造函数注入点先获得所请求类的实例。

在得到请求类的实例后,Injector会调用自身的InjectInto方法像这个对象的其他注入点进行依赖注入。

最后将注入完成的结果返回给程序。在注入的过程中,如果遇到被注入的对象仍然需要依赖注入,就会和上面的流程一样,对被注入的对象同样执行依赖注入,然后再将注入完的对象注入进目标对象。

转http://sswilliam.blog.163.com/blog/static/189696383201176114713922/

转载于:https://www.cnblogs.com/tankaixiong/archive/2012/12/10/2810967.html

SwiftSuspenders 1.6-深入浅出1相关推荐

  1. Python --深入浅出Apriori关联分析算法(二) Apriori关联规则实战

    上一篇我们讲了关联分析的几个概念,支持度,置信度,提升度.以及如何利用Apriori算法高效地根据物品的支持度找出所有物品的频繁项集. Python --深入浅出Apriori关联分析算法(一) 这次 ...

  2. MSDN Webcast“深入浅出ASP.NET AJAX系列”

    课程: ASP.NET AJAX深入浅出系列课程(1):ASP.NET AJAX 概述(3月13日):对于ASP.NET AJAX的大致功能进行概述和演示,通过简单的演示让听众了解到ASP.NET A ...

  3. 5.3Role和Claims授权「深入浅出ASP.NET Core系列」

    5.3Role和Claims授权「深入浅出ASP.NET Core系列」 原文:5.3Role和Claims授权「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁. ...

  4. 深入浅出开源性能测试工具 Locust (使用篇 1)

    在<[LocustPlus序]漫谈服务端性能测试>中,我对服务端性能测试的基础概念和性能测试工具的基本原理进行了介绍,并且重点推荐了Locust这一款开源性能测试工具.然而,当前在网络上针 ...

  5. 《深入浅出iPhone/iPad开发(第2版)》——在Xcode中建立你的界面

    本节书摘来自异步社区<深入浅出iPhone/iPad开发(第2版)>一书中的在Xcode中建立你的界面,作者 [美]Dan Pilone , Tracey Pilone,更多章节内容可以访 ...

  6. 【组队学习】【35期】深入浅出Pytorch

    深入浅出Pytorch 航路开辟者:李嘉骐.牛志康.刘洋.陈安东 领航员:朱松青 航海士:管柯琴.宋泽山.林旭升 基本信息 开源内容:https://github.com/datawhalechina ...

  7. 深入浅出Pytorch:02 PyTorch基础知识

    深入浅出Pytorch 02 PyTorch基础知识 内容属性:深度学习(实践)专题 航路开辟者:李嘉骐.牛志康.刘洋.陈安东 领航员:叶志雄 航海士:李嘉骐.牛志康.刘洋.陈安东 开源内容:http ...

  8. 深入浅出Pytorch:01 课程大纲与PyTorch简介

    深入浅出Pytorch 01 课程大纲与PyTorch简介 内容属性:深度学习(实践)专题 航路开辟者:李嘉骐.牛志康.刘洋.陈安东 领航员:叶志雄 航海士:李嘉骐.牛志康.刘洋.陈安东 开源内容:h ...

  9. 今晚8点直播 | 深入浅出理解A3C强化学习

    强化学习是一种比较传统的人工智能手段,在近年来随着深度学习的发展,强化学习和深度学习逐渐结合在了一起.这种结合使得很多原来无法想象的工作有了可能,最令我们瞩目的莫过于AlphaGo战胜李世石,以及Op ...

  10. 今晚直播 | 深入浅出理解A3C强化学习

    强化学习是一种比较传统的人工智能手段,在近年来随着深度学习的发展,强化学习和深度学习逐渐结合在了一起.这种结合使得很多原来无法想象的工作有了可能,最令我们瞩目的莫过于AlphaGo战胜李世石,以及Op ...

最新文章

  1. linux批量管理矿机,华硕最新的挖矿主机板可以一次控制 20 个 GPU
  2. 2019全国普通高校学科竞赛排行榜发布
  3. 神马是敏捷?(4)——敏捷不能当饭吃
  4. 牛顿插值法及其C++实现
  5. c语言箭头指针的作用,C语言中,结构体成员变量的点和箭头
  6. 第七节: EF的三种事务的应用场景和各自注意的问题(SaveChanges、DBContextTransaction、TransactionScope)
  7. 剑指offer(刷题41-50)--c++,Python版本
  8. 揭秘 RocketMQ 新特性以及在金融场景下的实践
  9. 草稿-git的使用-for windows -1006
  10. Thread多线程用法示例
  11. oracle两表联查分页公式,Oracle中分页查询和联表查询
  12. 2021全国研究生数学建模竞赛D题思路
  13. Linux elf文件分析
  14. 七日年化收益率计算器_定投收益率该怎么算?
  15. 关于jsp跳转到servlet显示 “Served at: /JavaWebPractice”或空白页的问题
  16. 黑猴子的家:Kali Linux + Vmware 15 安装操作系统
  17. 键盘上的按键--键码 对应表
  18. 关于如何设置网页自动切换背景图片
  19. Dremel made simple with Parquet(CN)
  20. 刚刚开始学AT89S52单片机遇到的一些小问题 + 个人解决办法

热门文章

  1. Python 大括号和百分号
  2. SPRING 事务管理说明
  3. ES6,你不得不学!
  4. Android View体系(六)从源码解析Activity的构成
  5. 单例模式 - 深究剖析
  6. TypeError: 'module' object is not callable 原因分析
  7. 前端书签归纳(持续更新)
  8. 预测分析:R语言实现2.8 小结
  9. h.264码流解析_一个SPS的nalu及获取视频的分辨率
  10. 表达不同与构建不同: 对计算机的唯一真正的要求 (TrustNo.1 ) -- 待修改!!!...