以下纯属个人理解,如有错误,恳请留言指出,大恩先言谢。
基于:
http://codethink.me/2015/08/01/dependency-injection-theory/
1.前言
依赖注入(Dependency Injection)是用于实现控制反转(Inversion of Control)的最常见的方式之一
个人解读:
什么是控制反转啊?就是我需要一份食物,以前的流程:
*需要食物→去买菜→回来弄菜→然后煮菜→获得食物。*
所有流程都得自己控制。现在高潮了,控制反转给第三方:
*需要食物→告诉仆人(第三方)→获得食物。*
依赖注入是实现方式之一:
就是说:告诉仆人→获得食物 中的仆人如何给主人的方式。注入意思是:仆人用针把食物射主人面前的,哈哈。依赖的意思可能是主人依赖仆人,食物依赖仆人。(仆人成主宰了?)
2. 为什么需要依赖注入
因为控制反转需要依赖注入,那为什么需要控制反转?答:为了解耦。
个人解读:
尼妹解耦是啥子意思?耦又是傻纸? 答:耦合就是我中有你,你中有我(这种在一个类中直接创建另一个类的对象的代码)。解耦就是把我中的你抽离出来。
具体实例:
老同学聚会, 很多人:person1、person2、person3。。。
每个人有自己的工作:person1(job1)、person2(job2)、、、、
聚会记录者:person{name;age;tel;job}
job{company;position;address}
耦合就是 person类中含有job类,并必须在person自身定义好job
解耦就是 把job从person中分离出来,person中提供公开的进入口,让外部设置job。
e.g. Person(Job job){}//构造方式进入
Person(){public void setJob(Job job)}//setter方式
class Person implements InjectJob{}//借口方式进入
为什么要解耦:
我要修改job类增加tel的时候,还得修改person类里面的代码
我要测试person类的时候,还得写好每一个person的job;(可我只是想要测试每个人名字而已啊,还需要写好每一个的job,累)
3.依赖注入的实现方式
3.1 构造函数注入(Contructor Injection)
public void Person{
private Job job;
public Person(Job job){
this.job =job;
}
...
}
3.2 setter注入
public void Person{
private Job job;
public void setJob(Job job){
this.job =job;
}
...
}
3.3 接口注入
3.3.1 创建注入使用接口
public interface InjectJob {
void injectJob(Job Job);
}
3.3.2 person实现接口
class Person implements InjectJob {
...
public void injectJob(Job job) {
this.job= job;
}
...
}
4.最后
解耦好处:
- 修改job,无需在跑去person里面处理代码了
- 方便测试:我所有person都只写一个job,注入每一个person里面去,就可以测试person的名字了。哈哈