从Typhoon台风到控制反转-依赖注入
最近这两天台风“烟花“ 肆虐长三角,偶然间看到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