【SSH系列】spring中为什么要使用IOC
开篇前言
在前面的博文中,小编主要简单的介绍了spring的入门知识,随着学习的深入,我们知道spring最核心的两大技术,IOC和AOP,这两个技术也是spring最耀眼的地方,在后续的博文中小编将隆重介绍IOC和AOP,今天这篇博文,小编先简单的介绍一下,IOC是什么?在spring中为什么要使用IOC?IOC的优缺点以及IOC的应用。
IOC是什么?
控制反转(Inversion of Control,英文缩写为IoC)是一个重要的面向对象编程的法则来削减计算机程序的耦合问题,也是轻量级的Spring框架的核心。 控制反转一般分为两种类型,依赖注入(Dependency Injection,简称DI)和依赖查找(Dependency Lookup)。依赖注入应用比较广泛。控制反转,包含两个方面的内容,一个是控制,另一个是反转,在程序中被调用类的选择控制权从调用她的类中移除,转交给第三方裁决,这个第三方指的就是spring的容器,IOC另解,依赖注入,调用类对被调用类的依赖关系由第三方注入,以移除调用类对被调用类的引用。其实小编觉得IOC这个概念还是比较晦涩难懂的,不容易让人望文生义,不过IOC确实包含了很多的内在东西,涉及到代码解耦,设计模式,代码优化等等,接下来小编就通过一个简单的demo,来帮助小伙伴们理解IOC的概念。
从西游记到IOC
西游记,家喻户晓,老少皆宜,曲折的故事,动情的演绎,给小编的童年带来无数的欢乐和惊喜,在西游记中有不少这样的场景,每每唐僧被抓的时候,六小龄童扮演的孙悟空来到妖怪的洞口,妖怪总是问,来者何人,孙悟空回答:你孙爷爷在此,我们不妨通过一个java类为这个场景进行编剧,并且伴随古典名著来理解IOC的概念,是不是别有一番风味。
通过演员安排剧本,java代码如下所示:
public class XiYouJi { public void monsterAsk(){ //演员直接侵入剧本 LiuXiaoLingTong lxlt = new LiuXiaoLingTong (); swk .responseAsk("你孙爷爷!"); } }
通过上面的代码部分,我们发现,作为具体角色饰演者的六小龄童直接倾入到剧本中,这样,使得剧本和演员直接耦合在一起。
一个聪慧的编剧在创作的时候应该围绕故事的角色进行,而不应该考虑这个角色的具体扮演者,只有这样,孙悟空的角色任选可以从众多演员中自由的选择,而非绑定在六小龄童一个人身上,通过分析,我们知道需要用主人公孙悟空定义一个接口,代码如下所示:
public class XiYouJi { public void monsterAsk() { //引入孙悟空角色接口 SunWuKong swk = new SunWuKong(); //通过接口开展剧情 swk .responseAsk("你孙爷爷!"); } }
我们引入了剧本的角色,也就是孙悟空,剧本的情节通过角色展开,在拍摄时角色由演员饰演,通过代码我们可以知道 XiYouJi同时依赖于SunWuKong接口和LiuXiaoLingTong类,并没有达到我们所期望的剧本仅依赖于角色的目的。但是角色最终必须通过具体的演员才能完成拍摄,如何让LiuXiaoLingTong和剧本无关而又能完成SunWuKong的具体动作呢?当然是在西游记投拍时,导演将LiuXiaoLingTong安排在SunWuKong的角色上,导演将剧本、角色、饰演者装配起来。
通过引入导演,使剧本和具体饰演者解耦了。对应到软件中,导演像是一个装配器,安排演员表演具体的角色。 现在我们可以反过来讲解IoC的概念了。IoC(Inverse of Control)的字面意思是控制反转,它包括两个内容: 即控制和反转。
那到底是什么东西的“控制”被“反转”了呢?对应到前面的例子,“控制”是指选择SunWuKong角色扮演者的控制权;“反转”是指这种控制权从《西游记》剧本中移除,转交到导演的手中。对于软件来说,即是某一接口具体实现类的选择控制权从调用类中移除,转交给第三方决定。
因为IoC确实不够开门见山,因此业界曾进行了广泛的讨论,最终软件界的泰斗级人物Martin Fowler提出了DI(依赖注入:Dependency Injection)的概念用以代替IoC,即让调用类对某一接口实现类的依赖关系由第三方(容器或协作类)注入,以移除调用类对某一接口实现类的依赖。“依赖注入”这个名词显然比“控制反转”直接明了、易于理解。 那么IOC有着怎么样的优点和缺点呢?请看如下对比
IOC的优点和缺点
IOC的优点
a、实现组件之间的解耦,提高程序的灵活性和可维护性。
IOC的缺点:
a、创建对象的步骤变复杂了,不直观,当然这是对不习惯这种方式的人来说的。
b、因为使用反射来创建对象,所以在效率上会有些损耗。但相对于程序的灵活性和可维护性来说,这点损耗是微不足道的。
c、缺少IDE重构的支持,如果修改了类名,还需到XML文件中手动修改,这似乎是所有XML方式的缺憾所在。
IOC的应用:
IOC模式将耦合代码从程序中移出,放到统一的XML文件中管理。由IOC容器通过配置文件来管理对象的生命周期、依赖关系等,这样就不用重新修改并编译具体的代码,从而实现组件之间的解耦。
小编寄语:该博文小编主要简单的介绍了spring中为什么要使用ioc,结合古典名著西游记的小故事进行介绍,IOC优缺点的对比以及IOC的应用,相信小伙伴们已经有了一定的了解,在下篇博文中,小编将继续介绍spring的相关知识,敬请期待`(*∩_∩*)′!
【SSH系列】spring中为什么要使用IOC的更多相关文章
- Spring 框架的概述以及Spring中基于XML的IOC配置
Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...
- 用通俗的语言解释 Spring 中的 DI 、IOC 和AOP概念
DI 所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是 ...
- Spring中基于注解的IOC(一):基础介绍
1. Spring中的常用注解 注解配置和xml配置要实现的功能都是一样的,都要降低程序的耦合,只是配置的形式不一样 xml中配置示例: 注解分类: 1.用于创建对象的注解 它们的作用就和在xml中编 ...
- spring中的控制反转IoC和依赖注入DI
原文:http://blog.163.com/xianghuxian@126/blog/static/50639037200721345218382/ IoC(Inversion of Control ...
- Spring中基于注解的IOC(二):案例与总结
2.Spring的IOC案例 创建maven项目 导入依赖 pom.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...
- Spring中注解方式实现IOC和AOP
1.IOC注解 1.1 IOC和DI的注解 IOC: @Component:实现Bean组件的定义 @Repository:用于标注DAO类,功能与@Component作用相当 @Service:用 ...
- [原创]java WEB学习笔记97:Spring学习---Spring 中的 Bean 配置:IOC 和 DI
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- Spring中IOC和AOP的详细解释
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC就是典型的工厂模式,通过s ...
- 理解Spring中的IOC和AOP
我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,通过ses ...
随机推荐
- 学习React系列(二)——深入了解JSX
1.JX实际上是React.createElement(component,props,...children)的语法糖 2.JSX判断是否为react组件的依据是标签首字母为大写(所以要求用户自定义 ...
- jQuery系列 第三章 jQuery框架操作CSS
第三章 jQuery框架操作CSS 3.1 jQuery框架的CSS方法 jQuery框架提供了css方法,我们通过调用该方法传递对应的参数,可以方便的来批量设置标签的CSS样式. 使用JavaScr ...
- 3.如何搭建Appium自动化测试环境
整个APP自动化环境安装可以参照虫师博客安装 附以下链接: http://www.cnblogs.com/fnng/category/695788.html 下面介绍运用到工作中遇到的一些问题 1.如 ...
- Maven 项目管理工具基础知识系列(一)
一.Maven 简介 Maven 中文意为 " 内行.专家 ",是 Apache 下的一个开源项目,属于纯 Java 开发,并且只是用来管理 Java项目的,它是一款项目管理工具, ...
- BZOJ 4260 Codechef REBXOR
Description Input 输入数据的第一行包含一个整数N,表示数组中的元素个数. 第二行包含N个整数A1,A2,…,AN. Output 输出一行包含给定表达式可能的最大值. Sample ...
- ●BZOJ 2251 [2010Beijing Wc]外星联络
题链: http://www.lydsy.com/JudgeOnline/problem.php?id=2251 题解: 后缀数组,倍增,RMQ 题意:把重复次数超过 1次的子串按字典序输出它们重复的 ...
- hdu 5592 BestCoder Round #65(树状数组)
题意: ZYB有一个排列PP,但他只记得PP中每个前缀区间的逆序对数,现在他要求你还原这个排列. (i,j)(i < j)(i,j)(i<j)被称为一对逆序对当且仅当A_i>A_jA ...
- [Noi2013]向量内积
来自FallDream的博客,未经允许,请勿转载,谢谢. 两个d 维向量A=[a1,a2,...,ad]与B=[b1,b2,...,bd]的内积为其相对应维度的权值的乘积和,即: $\sum_{i=1 ...
- Codeforces Round #430 B. Gleb And Pizza
Gleb ordered pizza home. When the courier delivered the pizza, he was very upset, because several pi ...
- VB6工程在Win10系统打开提示MSCOMCTL.OCX无法加载
解决办法: 修改.vbp文件中的 00F8754DA1}#2.1#0; MSCOMCTL.OCX 改为 00F8754DA1}#2.0#0; MSCOMCTL.OCX 中间的2.1 改为 2.0