Android学习之旅Android开发经验谈Android开发

控制反转 - Inversion of Control 与依赖注

2019-06-03  本文已影响3人  TengFeiGo

IOC 即“控制反转”,你不能把它理解为一种技术而是应该从编程思想的角度来理解它,在传统软件开发中比如说 A类 需要依赖一个对象 B 那么通俗的做法是通过 new 一个B对象并在 A 中使用新建的 B 对象,这样可以解决需求但随之带来的问题是 AB 之间的高耦合关系,不利于测试也不利于程序的扩展,为了解决这一问题我们引申出 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所需要的资源和对象。

参考资料

IoC 之 2.1 IoC基础 ——跟我学Spring3

上一篇下一篇

猜你喜欢

热点阅读