最近这两天台风“烟花“ 肆虐长三角,偶然间看到ios开发中的Typhoon,那今天就聊聊依赖注入吧。

什么是Typhoon台风

Typhoon 是Objective-C和Swift语言的轻量级依赖注入工具,功能较全,容易上手。

什么是依赖注入(Dependency Injection,DI)

依赖注入是减少代码耦合度的一种常见方式。

在解释依赖注入之前我们要解释一下控制反转,因为依赖注入是实现控制反转的一种方式(另一种方式是依赖查找)。

什么是控制反转(Inversion of Control,IoC)

控制反转是面向对象编程(OOP)的一种设计原则(SOLID原则的D依赖倒置原则),用来降低代码耦合度。

描述:类A需要用到类B中的对象o,必使得要在类A要获取类B的引用,类B实例创建过程如果在类A代码中实现会使得代码耦合度增大,更改类B中的代码,可能也要去更改引用了类B的代码,很不好用;而控制反转则是将创建类B实例的控制权从类A中剥离到IOC容器控制。

依赖注入与控制反转辨析

控制反转是思想,依赖注入是技术,依赖注入是控制反转的一种实现方式。

依赖注入是从类A的角度描述的:类A需要依赖IOC容器创建并注入类A需要的外部资源;

控制反转是从IOC容器的角度描述的:IOC容器控制类A,由IOC容器反向向类A中注入类A需要的外部资源。

依赖注入与依赖查找(Dependency Lookup)的区别

依赖查找使用容器的API来查找依赖的资源,虽然降低了对象间的依赖,却让对象依赖容器,无法在容器外使用依赖对象。

依赖注入的方式

依赖注入有5种实现方式,主要使用Setter注入和构造方法注入。

构造方法注入

IOC调用带参数的构造方法来注入依赖的实例,每个参数代表一个依赖。

Set方法注入

set是更新变量值的一种方法,在接受注入的类中(上文类A)中定义Set方法,在参数中定义药注入的元素,IOC调用类A的Set方法实现注入;

接口注入

在接口中定义要注入的信息,IOC通过接口注入。

基于注解、反射注入

指的是java那种注解(而非py3那种注解),java中@Resource、@Autowired、@Qualifier都可用于注解注入

编译时注入

在编译时自动生成代码完成注入,例如golang中的wire