控制反转&依赖注入

Posted zh718594493

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了控制反转&依赖注入相关的知识,希望对你有一定的参考价值。

控制反转
如果要在A里面使用C,你会怎么做呢?当然是直接去创建C的对象,也就是说,是在A类中主动去获取所需要的外部资源C,这种情况被称为正向的。那么什么是反向呢?就是A类不再主动去获取C,而是被动等待,等待IoC/DI的容器获取一个C的实例,然后反向的注入到A 类中。
技术图片

 

 技术图片

技术图片

 

依赖注入

依赖注入和控制反转是对同一件事情的不同描述,从某个方面讲,就是它们描述的角度不同。依赖注入是从应用程序的角度在描述,可以把依赖注入描述完整点:应用程序依赖容器创建并注入它所需要的外部资源;而控制反转是从容器的角度在描述,描述完整点:容器控制应用程序,由容器反向的向应用程序注入应用程序所需要的外部资源。
 
 
//代码实现控制反转&依赖注入
	class SuperMan{
		public function __construct($obj){
			$obj->call();
		}
	}
	class Xpower{
		public function call (){
			echo 111;
		}	
	}
	class Ultrabomb {
		public function call(){
			echo 222;
		}
	}
	class Container{
		protected $binds;
		protected $instances;

		public function bind($abstract,$concreate){
			if($concreate instanceof Closure){
				$this->binds[$abstract]=$concreate;
			}else{
				$this->instances[$abstract]=$concreate;
			}
		}
		public function make($abstract,$paramters=[]){
			if(isset($this->instances[$abstract])){
				return $this->instances[$abstract];
			}
			array_unshift($paramters,$this);
			return call_user_func_array($this->binds[$abstract],$paramters);
		}
	}
	$container = new Container();
	$container->bind("superman",function($container,$modelName=null){
		return new SuperMan($container->make($modelName));
	});
	$container->bind(‘xpower‘,function($container){
		return new Xpower();
	});
	$container->bind(‘ultrabomb‘,function($container){
		return new Ultrabomb();
	});
	$superman1 = $container->make(‘superman‘,[‘xpower‘]);
	$superman2 = $container->make(‘superman‘,[‘ultrabomb‘]);

  

以上是关于控制反转&依赖注入的主要内容,如果未能解决你的问题,请参考以下文章

Spring控制反转&依赖注入

c#依赖注入和控制反转的书籍

spring依赖注入,和控制反转。用自己的话说是怎么说的。最好能够用代码来解释

深层理解Spring 控制反转和依赖注入,这一篇文够了

IOC 控制反转Android 布局依赖注入 ( 布局依赖注入步骤 | 布局依赖注入代码示例 )

IOC 控制反转Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )