IoC概述

  IoC(Inverse of Controller,控制反转)是spring容器的基础,AOP以及声明式事务等功能都以此为基础。对于刚开始接触Spring的程序员来说,IoC这个重要的概念比较晦涩难懂,在此通过一个例子说明这个概念。

1. 通过实例理解IoC概念

  以《墨攻》电影为例,其中有一个场景,当刘德华所饰演的墨者革离到达梁国都城下时,城上梁国守军问道:“来者何人?”刘德华回答:“墨者革离!”我们不妨通过Java语言为这个“城门叩问”的场景编写剧本,并借此理解IoC的概念,代码如下所示。

/*** 通过使用演员编排剧本*/
public class MoAttack {public void cityGateAsk() {// 演员直接侵入剧本LiuDeHua ldh = new LiuDeHua();ldh.responseAsk("墨者革离!");}
}

  通过代码我们会发现作为具体角色饰演者的刘德华直接侵入剧本,使剧本和演员直接耦合在一起。一个明智的编剧在剧情创作时应围绕故事的角色进行,而不应考虑角色的具体饰演者,这样才能在剧本投拍时自由的选择任何合适的演员,而非绑定在某一个人身上。通过以上分析,我们需要为该剧本的主人公革离定义一个接口,接口如下所示。

/*** 通过使用角色编排剧本*/
public class MoAttack {public void cityGateAsk() {// 引入革离角色接口GeLi geli = new LiuDeHua();// 通过接口展开剧情geli.responseAsk("墨者革离!");}
}

  增加GeLi角色后,该剧本的情节通过角色展开,在拍摄时角色由演员饰演。但是MoAttack却同时依赖于GeLi接口和LiuDeHua类,并没有达到我们所期盼的剧本仅依赖于角色的目的。如何让LiuDeHua和剧本无关而又完成GeLi的具体动作呢?我们可以通过导演负责剧本,角色,饰演者三者的协调。通过引入导演,使得剧本和具体饰演者解耦。
  现在,让我们看看IoC的概念,IoC的字面意思是控制反转,概念包含两方面:
    1. 控制:选择GeLi角色扮演者的控制权
    2. 反转:控制权从《墨攻》剧本中移除,转交给导演的手中
  对于软件而言,某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定,即由Spring容器借由Bean配置进行控制。因为IoC确实不够开门见山,因此业界曾进行广泛的讨论,最终软件界的泰斗级任务Martin Fowler提出了DI(Dependency Injection,依赖注入)概念用来代替IoC,即让调用类对某一接口实现类的依赖关系由第三方注入,以移除调用类对某一接口实现类的依赖。

2. IoC类型

  从注入方法上来看,IoC主要可以划分为三种类型:构造函数注入,属性注入和接口注入。Spring支持构造注入以及属性注入。下面继续使用以上的例子说明三种注入方式的区别。

2.1 构造函数注入

  通过调用类的构造函数,将接口实现类通过构造函数变量传入,代码如下所示。

public class MoAttack {private GeLi geli;// 注入革离具体饰演者public MoAttack(GeLi geli) {this.geli = geli;}public void cityGateAsk() {geli.responseAsk("墨者革离!");}
}

  MoAttack的构造函数不关心具体由谁来饰演革离这个角色,只要传入的饰演者按剧本要求完成相应的表演即可,角色的具体饰演者有导演来安排,代码如下所示。

public class Director {public void direct() {// 指定角色的饰演者GeLi geli = new LiuDeHua();// 注入具体饰演者到剧本中MoAttack moAttack = new MoAttack(geli);moAttack.cityGateAsk();}
}

  导演首先安排刘德华饰演革离,并将刘德华“注入”到《墨攻》剧本中,然后进行“城门叩问”剧情的演出工作。

2.2 属性注入

  属性注入可以有选择的通过setter方法完成调用类所需依赖的注入,更加灵活方便,代码如下所示。

public class MoAttack {private GeLi geli;// 属性注入方法public void setGeLi(GeLi geli) {this.geli = geli;}public void cityGateAsk() {geli.responseAsk("墨者革离!");}
}

  代码中为geli属性提供了一个Setter方法,以便让导演在需要时注入geli的具体饰演者,如下代码所示。

public class Director {public void direct() {MoAttack moAttack = new MoAttack();// 调用属性Setter方法注入GeLi geli = new LiuDeHua();moAttack.setGeli(geli);moAttack.cityGateAsk();}
}

  和通过构造函数注入革离饰演者不同,在实例化MoAttack剧本时,并未指定任何饰演者,而是实例化MoAttack后,在需要革离出场时,才调用setGeli()方法注入饰演者。

2.3 接口注入

  将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法。为了采取接口注入的方式,必须先声明一个ActorArrangable接口,接口如下:

public interface ActorArrangable {void injectGeli()
}

  MoAttack通过该接口提供具体的实现,代码如下。

public class MoAttack implements ActorArrangable{private GeLi geli;// 实现接口方法public void injectGeli(GeLi geli) {this.geli = geli;}public void cityGateAsk() {geli.responseAsk("墨者革离!");}
}

  Director通过ActorArrangable的injectGeli()方法完成饰演者的注入工作,代码如下。

public class Director {public void direct() {MoAttack moAttack = new MoAttack();GeLi geli = new LiuDeHua();moAttack.injectGeli(geli);moAttack.cityGateAsk();}
}

  由于通过接口注入需要额外声明一个接口,增加了类的数目,而且效果和属性注入并无本质区别,并不推荐这种注入方式。

3. 通过容器完成依赖属性关系的注入

  虽然MoAttack和LiuDeHua实现了解耦,MoAttack无须关注角色实现类的实例化工作,但这些工作中在代码中依然存在,只是转移到Director类中。现在,通过一个第三方的容器,帮助完成类的初始化与装配工作,让开发者从这些底层实现类的实例化,依赖关系装配等工作中解脱出来,专注于更有意义的业务逻辑开发工作。
  Spring就是这样的一个容器,它通过配置文件或注解描述类和类之间的依赖关系,自动完成类的初始化和依赖注入工作。当容器启动时,Spring根据配置文件的描述信息,自动实例化Bean并完成依赖关系的装配,从容器中即可返回准备就绪的Bean实例,后续可直接使用。

Spring-IoC概念相关推荐

  1. spring源码之美三:从IOC概念入手学习Spring

    前言 spring源码里面包含了很多的模块,也提供了很多功能,如果去一一叙述这些模块及其对应的功能,必然会是长篇大论,我个人比较讨厌一开始就去介绍所有的模块的功能,虽然能够让我了解整体的项目结构,但是 ...

  2. Spring的使用——基础环境搭建以及IOC概念理解(持续更新)

    spring基础环境搭建 1.添加Spring依赖 2.编写一个Spring的配置文件 3.通过Spring的应用程序应用上下文获取对象 优点:在修改方案时可以不用修改代码,只需修改配置文件的bean ...

  3. JavaEE互联网轻量级框架整合开发(书籍)阅读笔记(6):Spring IOC容器学习(概念、作用、Bean生命周期)...

    一.IOC控制反转概念 控制反转(IOC)是一种通过描述(在Java中可以是XML或者是注解)并通过第三方去生产或获取特定对象的方式. 主动创建模式,责任在于开发者,而在被动模式下,责任归于Ioc容器 ...

  4. Spring入门到精通:第二章 IOC容器(XML方式):1.IOC概念

    百度百科表述: 控制反转(Inversion of Control,缩写为IOC),是面向对象编程中的一种设计原则,可以用来减低计算机代码之间的耦合度.其中最常见的方式叫做依赖注入(Dependenc ...

  5. b spring的ioc概念简单介绍

    –> go to 总目录 ioc-container.bean.denpendies 什么是依赖注入与控制反转? 1.介绍Spring IoC container和 Beans 2.contai ...

  6. spring ioc原理分析

    spring ioc原理分析 spring ioc 的概念 简单工厂方法 spirng ioc实现原理 spring ioc的概念 ioc: 控制反转 将对象的创建由spring管理.比如,我们以前用 ...

  7. Spring IoC是如何进行依赖注入的

    点击上方"方志朋",选择"设为星标" 回复"666"获取新整理的面试文章 依赖注入(DI) DI(Dependency Injection) ...

  8. 还不懂spring IOC核心原理?200行代码带你手撸一个

    Spring做为Java企业级应用的开源开发框架,早已成为Java后端开发事实上的行业标准,无数的公司选择Spring作为基础的开发框架. 使用Spring框架的人一定都听过Spring的IoC(控制 ...

  9. 谈谈对Spring IOC的理解

    2019独角兽企业重金招聘Python工程师标准>>> 学习过Spring框架的人一定都会听过Spring的IoC(控制反转) .DI(依赖注入)这两个概念,对于初学Spring的人 ...

  10. spring ioc原理(看完后大家可以自己写一个spring)

    在学习spring的时候,最常听到的词应该就是IOC和AOP了,下面,我从我的角度再次理解一下Spring里的IOC和AOP. IOC简介 IoC(InversionofControl):IoC就是应 ...

最新文章

  1. openpyxl.utils.exceptions.IllegalCharacterError错误
  2. linux批量创建用户和密码
  3. shell脚本按行读取文件的几种方式
  4. LSD快速直线检测的原理概要及OpenCV代码实现(CV类LineSegmentDetector)
  5. 创建对象的序列化文件 - SoapFormatter,binaryFormatter以及XmlSerializer序列化文件的比较...
  6. 数学建模——智能优化之粒子群模型详解Python代码
  7. 控件与组件的区别_5分钟学交互:手机交互组件归纳 导航篇
  8. 使用 HTMLTestRunner.py
  9. Easy Math(2018 ACM-ICPC 徐州赛区网络赛 D)
  10. 4015-基于递归的折半查找(C++)
  11. PHP连数据库生成数据字典
  12. css 的块级元素和行内元素
  13. rk1808交叉编译opencv_我用AI视觉模组DIY了一个驾驶疲劳监测仪
  14. TWINCAT3导出html,【图解】TwinCAT 3学习之添加功能库
  15. 计算机无法访问网络位置,不能访问网络位置,详细教您怎么解决
  16. 2022男神/女神完整投票系统Ver5.5.21
  17. 音频信号处理——DTW
  18. 现在还可以做公众号吗?我是如何在细分领域公众号粉丝一年不到从0到5000+增长?
  19. 程序的两种执行方式,静态语言和脚本语言
  20. 【CentOS7安装Redis及常用命令】

热门文章

  1. MATLAB2018simulink打不开MATLAB2019b的simulink,低版本simulink模型出现
  2. VS2005/SQL2005等原版镜像高速下载
  3. c语言二级指针与二维数组
  4. 深入JavaWeb技术世界15:通过项目逐步深入了解Mybatis(二)
  5. python基础(1)---python简介
  6. GlusterFS 之 POSIX ACLs
  7. 28岁自学Python转行靠谱吗?入行晚吗?
  8. 截图工具因为计算机无法使用,Win7系统自带的截图工具不能用了的解决方法
  9. Github 之 本地上传代码到 Github ,并且添加 .gitignore 文件 屏蔽一些文件上传(内附详细步骤)
  10. golang —— go语言科学记数法使用