点击蓝字 关注我
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、通过简单的描述就能获取这个接口实例,且描述应该尽量简单
其实这完全可以和橙子的例子进行类比,橙汁就等同于财务接口,而熟悉财务接口的同事等同于饮品店,而你描述的橙汁要求、联系方式和地址,就等同于获取财务接口的实例的描述。到这里有一个事实需要注意,财务接口对象的创建不是自己的行为,而是财务开发同事的行为,但是事实上这并不是你真实的要求,因为也许你对某一领域并不精通,这个时候可以把创建对象的主动权交给别人,这就是控制反转的概念。对于财务开发者而言,他们也不了解交易系统的细则,他们同样希望有你开发交易接口。
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)去实现的,这个关系也要求我们自己去维护。
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();
这个过程,果汁是由贡茶所制造,我们并不关心制造的过程,我们所需要关心的是对果汁如何描述,选择哪个店去制造,这才是现今人们的习惯。
显然这个过程中我们并不需要了解饮品店是如何工作的,我们只需要关注如何描述,就能得到想要的结果。
06
总结
控制反转是一种通过描述(在Java中)可以是XML或者注解并通过第三方去产生获取特定对象的方式。
Spring中实现控制反转的是IoC容器,其实现方法是依赖注入。正如上述的例子,果汁制造器依赖于饮品店和订单去制造果汁的,而饮品店是别人去创造的。我们只需要知道它能产生果汁就可以了,并不需要去理解如何创建果汁。
Spring会提供IoC容器来管理对应的资源。
夏天到了
球分享
球点赞
球在看