【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的相关知识,敬请期待`(*∩_∩*)′!

时间: 2024-09-19 09:01:18

【SSH系列】spring中为什么要使用IOC的相关文章

Spring(一)之IOC、bean、注入

spring简介 spring的优势 概览 典型的完整Spring Web应用的模式图 IoC控制反转容器 简介 基本原理 - 容器和bean bean 容器 基于XML配置配置元数据 实例化容器 XML配置元数据的结构 bean 多种bean bean定义 bean的命名 bean的别名 实例化bean 使用静态工厂方法实例化 bean的作用域 Singleton作用域单例模式 Prototype作用域实例 Singleton beans和prototype-bean的依赖 其他作用域 初始化

【SSH系列】深入浅出spring IOC中三种依赖注入方式

spring的核心思想是IOC和AOP,IOC-控制反转,是一个重要的面向对象编程的法则来消减计算机程序的耦合问题,控制反转一般分为两种类型,依赖注入和依赖查找,依赖什么?为什么需要依赖?注入什么?控制什么?依赖注入和控制反转是一样的概念吗?接触新的知识,小编的脑袋中全是大大的问号,不过没有关系,今天这篇博文,小编主要来简单的介绍一下在spring IOC中依赖注入的方法. 依赖注入和控制反转,目的是为了使类与类之间解耦合,提高系统的可扩展性和可维护性.我们可以从以下几个方面理解: a.参与者都

【SSH系列】初识spring+入门demo

       学习过了hibernate,也就是冬天,经过一个冬天的冬眠,当春风吹绿大地,万物复苏,我们迎来了spring,在前面的一系列博文中,小编介绍hibernate的相关知识,接下来的博文中,小编将继续介绍SSH中的spring,Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,由Rod Johnson创建.简单来说,Spring是一个分层的JavaSE/EEfull-stack(一站式) 轻量级开源框架.今天这篇博文,小编将从what.why

Spring中我们用到的功能实现:基于注解的Ioc自动装配

  我们要完成自动装配,那么就要有一个存放bean对象的容器,然后要有装配的注解,那么哪些类该被存到容器呢,在spring中我们使用过@Service.@Resource等,看下面的代码,你也可以做到.     来看看这是一个简单的容器接口 /**  * 容器接口  * @author:rex  * @create_time:2014-6-26  * @version:V1.0  */ public interface Container { Object getBean(String name

谈谈Spring中的IOC和AOP概念

  IOC和AOP是spring中的两个核心的概念,下面谈谈对这两个概念的理解. 1. IOC(Inverse of Control):控制反转,也可以称为依赖倒置.         所谓依赖,从程序的角度看,就是比如A要调用B的方法,那么A就依赖于B,反正A要用到B,则A依赖于B.所谓倒置,你必须理解如果不倒置,会怎么着,因为A必须要有B,才可以调用B,如果不倒置,意思就是A主动获取B的实例:B b = new B(),这就是最简单的获取B实例的方法(当然还有各种设计模式可以帮助你去获得B的实

【SSH系列】静态代理&&动态代理

从设计模式说起 代理模式是二十三中设计模式中的一种,代理模式就是指由一个代理主题来操作真实的主题,真实的主题执行具体的业务操作,而代理主题负责其她相关业务,简而言之,代理模式可以由以下三个部分组成: a.抽象角色:通过接口或抽象类声明真实角色实现的业务方法. b.代理角色:实现抽象角色,是真实角色的代理,通过真实角色的业务逻辑方法来实现抽象方法,并可以附加自己的操作. c.真实角色:实现抽象角色,定义真实角色所要实现的业务逻辑,供代理角色调用.第一次接触代理模式的是在学习大话设计模式的时候,首先

【SSH系列】---Hibernate的基本映射

       开篇前言       在前面的博文中,小编分别介绍了[SSH系列]-- hibernate基本原理&&入门demo,通过这篇博文,小伙伴们对hibernate已经有了基本的了解,以及hibernate的核心,采用对象化的思维操作关系型数据库.     [SSH系列]-- Hibernate持久化对象的三种状态 ,通过这篇博文的讲解,小伙伴们了解到java对象的生命周期,是从通过new语句创建开始,到不再被任何引用变量引用结束,结束后它占用的内存将被JVM垃圾回收机制收回.在h

jbpm4.4整合SSH 在tomcat中启动后控制台一直查询JBPM4_JOB表

问题描述 jbpm4.4整合SSH 在tomcat中启动后控制台一直查询JBPM4_JOB表 jbpm4.4整合SSH 在tomcat中启动后控制台一直查询JBPM4__JOB表,_这是正常现象吗,应该这么解决呢????求解答 解决方案 http://download.csdn.net/detail/freedomky/4300308 是不是有业务需要重复执行. 解决方案二: 不会呀 我只整合好了SSH还没什么都没做呢 知识启动了tomcat 我的applicationContext.xml:

Spring中ApplicationContext的事件机制(二 内定事件)

在Spring中已经定义了五个标准事件,分别介绍如下: 1)ContextRefreshedEvent:当ApplicationContext初始化或者刷新时触发该事件. 2)ContextClosedEvent:当ApplicationContext被关闭时触发该事件.容器被关闭时,其管理的所有 单例Bean都被销毁. 3)RequestHandleEvent:在Web应用中,当一个http请求(request)结束触发该事件. ContestStartedEvent:Spring2.5新增的