开篇前言

在前面的博文中,小编主要简单的介绍了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的更多相关文章

  1. Spring 框架的概述以及Spring中基于XML的IOC配置

    Spring 框架的概述以及Spring中基于XML的IOC配置 一.简介 Spring的两大核心:IOC(DI)与AOP,IOC是反转控制,DI依赖注入 特点:轻量级.依赖注入.面向切面编程.容器. ...

  2. 用通俗的语言解释 Spring 中的 DI 、IOC 和AOP概念

    DI 所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是 ...

  3. Spring中基于注解的IOC(一):基础介绍

    1. Spring中的常用注解 注解配置和xml配置要实现的功能都是一样的,都要降低程序的耦合,只是配置的形式不一样 xml中配置示例: 注解分类: 1.用于创建对象的注解 它们的作用就和在xml中编 ...

  4. spring中的控制反转IoC和依赖注入DI

    原文:http://blog.163.com/xianghuxian@126/blog/static/50639037200721345218382/ IoC(Inversion of Control ...

  5. Spring中基于注解的IOC(二):案例与总结

    2.Spring的IOC案例 创建maven项目 导入依赖 pom.xml xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" ...

  6. Spring中注解方式实现IOC和AOP

    1.IOC注解 1.1 IOC和DI的注解  IOC: @Component:实现Bean组件的定义 @Repository:用于标注DAO类,功能与@Component作用相当 @Service:用 ...

  7. [原创]java WEB学习笔记97:Spring学习---Spring 中的 Bean 配置:IOC 和 DI

    本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...

  8. Spring中IOC和AOP的详细解释

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入,和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式. IOC就是典型的工厂模式,通过s ...

  9. 理解Spring中的IOC和AOP

    我们是在使用Spring框架的过程中,其实就是为了使用IOC,依赖注入和AOP,面向切面编程,这两个是Spring的灵魂. 主要用到的设计模式有工厂模式和代理模式 IOC就是典型的工厂模式,通过ses ...

随机推荐

  1. C#在使用Assembly加载程序集时失败

    错误现象: 进行插件读取时出现错误:"尝试从一个网络位置加载程序集,在早期版本的 .NET Framework 中,这会导致对该程序集进行沙盒处理.此发行版的 .NET Framework ...

  2. [LeetCode] Subarray Sum Equals K 子数组和为K

    Given an array of integers and an integer k, you need to find the total number of continuous subarra ...

  3. codevs 2964 公共素数因数

    提交地址:http://codevs.cn/problem/2964/ 2964 公共素数因数  时间限制: 1 s  空间限制: 32000 KB  题目等级 : 白银 Silver 题解     ...

  4. [UOJ]#33. 【UR #2】树上GCD

    题目大意:给定一棵有根树,边长均为1,对于每一个i,求树上有多少个点对,他们到lca距离的gcd是i.(n<=200,000) 做法:先容斥,求出gcd是i的倍数的点对,考虑长链剖分后从小到大合 ...

  5. Mybatis整合Spring实现事务管理的源码分析

    一:前言 没有完整看完,但是看到了一些关键的地方,这里做个记录,过程会有点乱,以后逐渐补充最终归档为完整流程:相信看过框架源码的都知道过程中无法完全确定是怎样的流程,毕竟不可能全部都去测试一遍 ,但是 ...

  6. 解读Raft(一 算法基础)

    最近工作中讨论到了Raft协议相关的一些问题,正好之前读过多次Raft协议的那paper,所以趁着讨论做一次总结整理. 我会将Raft协议拆成四个部分去总结: 算法基础 选举和日志复制 安全性 节点变 ...

  7. java continue与break区别

    在循环体中跳出循环语句有continue与break语句 continue:跳出本次循环,包括本次循环continue后面的语句, break:跳出循环体,就是说一遇到break循环就结束. 代码: ...

  8. 使用word

    同样这也是生活中常用到的办公软件,word本质是一个排版软件,它与一般的编辑器不同的是,它将整个文本分成了一页一页的,当然这也是方便于打印文档. 使用word还是很容易的,一般来说需要注意以下几方面的 ...

  9. 二叉树的基本操作(含Huffman树)

    大二时候写的烂代码,翻出来复习复习(o(╯□╰)o). 代码: #include <stdio.h> #include <stdlib.h> #define Max_Size ...

  10. c语言程序第2次作业

    (一)改错题 1.输出带框文字:在屏幕上输出以下3行信息. 错误信息1:{{uploading-image-560144.png(uploading...)} 错误原因:stdio误写为stido 错 ...