个人学习_依赖注入与控制反转

以下纯属个人理解,如有错误,恳请留言指出,大恩先言谢。

基于:
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的名字了。哈哈
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值