控制反转和依赖注入的理解(通俗易懂)_Spring关于控制反转的理解

f971f21ad6a576b9cc70d7eb5a2f4dc1.png

点击蓝字 关注我

01

Spring IoC是什么

 IoC(Inversion of Control,控制反转)是Spring的基础。又称作 Dependency Injection,依赖注入。

02

Spring IoC简介

 IoC是一个容器,在Spring中,它会认为一切Java资源都是Java Bean,容器的目标就是管理这些Bean和它们之间的关系。所以在Spring IoC里面装载的各种Bean,也可以理解为Java的各种资源,包括Java Bean的创建、事件、行为等,它们由IoC容器管理。除此之外,各个Java Bean之间会存在一定的依赖关系,比如班级是依赖老师于老师和学生组成的,假设老师、学生都是Java Bean,那么显然二者之间形成了依赖关系,老师和学生有教育和被教育的关系。这些Spring IoC容器都能够对其进行管理。只是Spring IoC管理对象和其依赖关系,采用的不是人为的主动创建,而是由Spring IoC自己通过描述创建的,也就是说Spring是依赖描述来完成对象的及其依赖关系的。

03

控制反转的理解

控制反转是一个比较抽象的概念,对于初学者不好理解,举例说明。在实际生活中,人们要用到一样东西时,人们的基本想法是找到东西,比如想喝杯橙汁,在没有饮品店的日子里,最直观的做法是,要买果汁机、橙子,准备开水。请注意这是你自己“主动”创造的过程,也就是一杯橙汁需要主动创造。然而到了今时今日,由于饮品店的盛行,已经没有必要自己去榨橙汁了。想喝橙汁的想法一出现,第一个想法是找到饮品店的联系方式,通过电话、微信等渠道描述你的需要、地址、联系方式等,下订单等待,过会就会有人送上橙汁了。请注意你并没有“主动”创造橙汁,也就是橙汁是由饮品店创造的,而不是你,但是你完全到达了你的要求。

上面只是举了一个很简单的例子,但是这个例子却包含了控制反转的思想,现实中系统的开发是一个团队,团队由开发者组成。现在假设你在一个电商网站负责开发工作,你熟悉商品开发交易流程,但是财务却不怎么熟悉,而团队中有些成员对于财务处理十分熟悉,在交易的过程中,商品交易流程需要调度财务的相关接口,才能得以实现,那么你的期望应该是:

1、熟悉财务流程的成员开发对应的接口

2、接口逻辑尽量简单,内部复杂的业务并不需要自己去了解,你只要通过简单的调用就能使用。

3、通过简单的描述就能获取这个接口实例,且描述应该尽量简单

  其实这完全可以和橙子的例子进行类比,橙汁就等同于财务接口,而熟悉财务接口的同事等同于饮品店,而你描述的橙汁要求、联系方式和地址,就等同于获取财务接口的实例的描述。到这里有一个事实需要注意,财务接口对象的创建不是自己的行为,而是财务开发同事的行为,但是事实上这并不是你真实的要求,因为也许你对某一领域并不精通,这个时候可以把创建对象的主动权交给别人,这就是控制反转的概念。对于财务开发者而言,他们也不了解交易系统的细则,他们同样希望有你开发交易接口。

dc1dca97e7d75065b90b1e0b01734191.gif

04

模拟主动创建对象

/***搅拌机***/package com.ssm.chapter9.pojo;public class Blender{  /**    *搅拌    *@param water 水描述    *@param fruit 水果描述    *@param suger 糖描述    *return 果汁    */   pubilc String mix(String water,String fruit,String suger){      String juice = "这是一杯由液体:" + water + "\n水果:" + fruit + "\n糖量:" + suger + "\n组成的果汁";      return juice;  }} /***果汁生成器***/package com.ssm.chapter9.pojo;public class JuiceMaker{  private Blender blender = null;//搅拌机  private String water;//水  private String fruit;//水果  private String suger;//糖分描述    public Blender getBlender() {        return blender;    }     public void setBlender(Blender blender) {        this.blender = blender;    }     public String getWater() {        return water;    }     public void setWater(String water) {        this.water = water;    }     public String getFruit() {        return fruit;    }     public void setFruit(String fruit) {        this.fruit = fruit;    }     public String getSuger() {        return suger;    }     public void setSuger(String suger) {        this.suger = suger;    } /**  *果汁生成  */   public String makeJuice(){      blender = new Blender();      return blender.mix(water,fruit,suger);  }}

    主动创建对象需要我们实现自己不太熟悉的工作---如何搅拌果汁,比如这里的mix方法,显然不是一个好方法,而对象果汁(juice)是需要依赖于水(water)、水果(fruit)、糖 (suger)和搅拌机(blender)去实现的,这个关系也要求我们自己去维护。

354ca9955bb1a7932f2cad91e7602507.png

05

模拟被动创建对象

  假设已经提供了果汁制造器(JuiceMaker2),那么只需要对其进行描述就可以得到果汁了。假设饮品店还会给我们提供这样的一个描述(Source)

package com.ssm.chapter9.pojo;public class JuiceMaker2{      private String beverageShop = null;   private Source source = null;    public String getBeverageShop() {        return beverageShop;    }     public void setBeverageShop(String beverageShop) {        this.beverageShop = beverageShop;    }     public Source getSource() {        return source;    }     public void setSource(Source source) {        this.source = source;    }   public String makeJuice(){    String juice = "这是一杯由" + beverageShop + "饮品店,提供的" + source.getSize() + source.getSuger() + source.getFruit();    return juice;  }} package com.ssm.chapter9.pojo;public class Source{   private String fruit;//类型   private String suger;//糖分描述   private String size;//大小杯    public String getFruit() {        return fruit;    }     public void setFruit(String fruit) {        this.fruit = fruit;    }     public String getSuger() {        return suger;    }     public void setSuger(String suger) {        this.suger = suger;    }     public String getSize() {        return size;    }     public void setSize(String size) {        this.size = size;    }}

    显然我们并不需要去关注果汁是如何制造出来的,系统采用XML对这个清单进行描述

"source"   "fruit"   "suger"   "size" 

    这里对果汁进行了描述,接着需要选择饮品店,假设选择的是贡茶

"juiceMaker2"   <property name="beverageShop" value="贡茶" />  <property name="source" value="source" /></bean>

    这里将饮品店设置为贡茶,这样就指定了贡茶为我们提供服务,而订单则引用我们之前的定义,这样使用如下代码就能得到一杯果汁了

JuiceMaker2 juiceMaker2 = (JuiceMaker2) ctx.getBean("juiceMaker2");String juice = juiceMaker2.makeJuice();

    这个过程,果汁是由贡茶所制造,我们并不关心制造的过程,我们所需要关心的是对果汁如何描述,选择哪个店去制造,这才是现今人们的习惯。5123cc01cd5bb47af420fa8e16d66bdc.png

    显然这个过程中我们并不需要了解饮品店是如何工作的,我们只需要关注如何描述,就能得到想要的结果。

06

总结

    控制反转是一种通过描述(在Java中)可以是XML或者注解并通过第三方去产生获取特定对象的方式。

    Spring中实现控制反转的是IoC容器,其实现方法是依赖注入。正如上述的例子,果汁制造器依赖于饮品店和订单去制造果汁的,而饮品店是别人去创造的。我们只需要知道它能产生果汁就可以了,并不需要去理解如何创建果汁。

     Spring会提供IoC容器来管理对应的资源。

f971f21ad6a576b9cc70d7eb5a2f4dc1.png

夏天到了

a24190fa9725d39b939b86dd922f6509.gif

球分享

a24190fa9725d39b939b86dd922f6509.gif

球点赞

a24190fa9725d39b939b86dd922f6509.gif

球在看

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值