控制反转 - Inversion of Control 与依赖注
IOC 即“控制反转”,你不能把它理解为一种技术而是应该从编程思想的角度来理解它,在传统软件开发中比如说 A类
需要依赖一个对象 B
那么通俗的做法是通过 new 一个B
对象并在 A
中使用新建的 B
对象,这样可以解决需求但随之带来的问题是 A
与 B
之间的高耦合关系,不利于测试也不利于程序的扩展,为了解决这一问题我们引申出 IOC 容器与 DI 的概念。
控制反转( IOC )- Inversion of Control
理解 IOC 容器的主要作用在于理解 IOC 控制了什么以及什么是反转,举一个简单的小例子,在 Activity
中需要通过 findViewById
来初始化控件对象,对于 Activity
而言它需要这个控件去完成相应的需求,在 Activity
中主动初始化控件的操作称为主动依赖,但为了避免 Activity
与控件之间的高耦合关系,我们将初始化控件对象的操作委托给 IOC 容器
处理,由 IOC 容器
处理和提供Activity
所需要的控件对象,但实际开发中 IOC
的作用更像一个“大工厂”一样来向客户端程序提供依赖对象和外部资源,所以 IOC
控制了客户端程序中依赖对象的生成以及外部资源的获取,由上文可知在传统开发中一个类需要另一个对象直接通过 new 的操作来生成依赖对象属于主动依赖,但对于 IOC
而言它已经帮助生成了依赖对象并在程序中注入依赖对象,对于客户端程序而言它接收依赖对象的方式被反转了,由原先的主动创建到被动接收IOC容器
提供的依赖对象。
依赖注入( DI )- Dependency Injection
系统运行中,动态的向某个对象提供它所需要的其他对象,IOC容器提供了客户端所需要的依赖对象和外部资源,所以客户端程序需要依赖IOC容器,IOC容器就像打针一样将客户端程序所需要的外部资源注入到程序中。
依赖注入与控制反转的简单图解
总结
如果类A
中需要用到对象B
,那么可以在A
中主动创建B的依赖对象
,同理如果需要C
或者D
对象,那么在A
中还要依旧创建这两者的依赖,但通过引入IOC
来控制A
中所需要的依赖对象的生成和外部资源的获取,与此同时原先由A
中的主动创建依赖对象的关系转交给IOC容器
处理,A
中不在负责创建依赖对象,而A
中需要的依赖对象和外部资源由IOC
处理,A
中接收对象的方式转变为被动接收即“失去了主动创建对象的权限,可以形象的理解为控制权限的反转
”,A
只需要依赖IOC容器
并由IOC容器
注入A
所需要的资源和对象。