---------------siwuxie095

IoC,即 Inversion of Control,控制反转,它是 Spring 容器的内核

AOP、声明式事务等功能都是在此基础上开花结果,即 都依赖于 IoC

IoC 涉及代码解耦、设计模式、代码优化等问题的考量

从以下三方面来深入了解 IoC:

· IoC 的初步理解

· IoC 的注入类型

· IoC 的注入方式

IoC 的初步理解

IoC 概念重要却比较晦涩难懂,通过如下实例来说明:

实例场景:电影《无间道》中刘德华所饰演的角色刘建明在天台的对白

即:电影:无间道--->角色:刘建明--->演员:刘德华

在传统的编程模式中,是剧本和演员直接耦合,即 剧本直接指定刘德华来表演

显然,在以上剧本中,作为具体角色饰演的刘德华直接侵入到

剧本中,使剧本和演员直接耦合在了一起

一个明智的编剧,在剧情创作时,应该围绕故事的角色来进行,

而不应该考虑角色具体的饰演者,这样才能在剧本投拍时,自

由的选择演员,而并非绑定在刘德华一个人身上

通过以上分析,发现需要为主人公刘建明(角色)定义一个接口

引入剧本角色刘建明。剧本情节就通过角色来展开,在拍摄时,

角色由演员来饰演,就如上图中无间道、刘建明、和刘德华三

者之间的关系

在上图中,无间道同时依赖刘建明和刘德华,

并没有达到期望:剧本仅依赖于角色

但角色必须通过具体的演员才能拍摄完成,如何让刘德华和剧本

无关,又能完成刘建明的具体动作呢?可以引入导演

在引入导演之后,剧本和饰演者完全解耦

首先,建立一个导演类,然后导演选择一个剧本:无间道,同时为剧本指定

一个角色:刘建明,让刘建明插入到无间道中,最后让刘德华来饰演刘建明

通过引入导演,使剧本和具体的饰演者彻底解耦。对应到软件中,导演就像

是一个装配器,它来安排演员表演具体角色

IoC 的概念:IoC 从字面上看,就是 控制 和 反转

到底是什么东西的控制被反转了?对应到前面的实例:

"控制" 是指选择刘建明角色扮演者的控制权,而 "反转" 是指这种

控制权,从无间道剧本中移除,转交到导演手中

对于软件来说,即 某一个接口的具体实现类的控制权,从调用类

中移除,转交给第三方决定

因为 IoC 确实不够开门见山,因此业界曾进行了广泛的讨论,最终

软件界的泰斗级人物 Martin Fowler 提出了 DI 的概念用以代替 IoC

即 让调用类对某一接口实现类的依赖关系由第三方(容器 或 协作类)

注入,以移除调用类对某一接口实现类的依赖

"依赖注入" 这个名词显然比 "控制反转" 直接明了、易于理解

DI,即 Dependency Injection

IoC 的注入类型

从注入方法上看,主要划分为三种类型:

· 构造函数注入

· 属性注入

· 接口注入

(1)构造函数注入:

通过调用类的构造函数,将接口实现类通过构造函数变量传入

如:WuJianDao 即调用类,LiuJianming 即接口,LiuDehua 即接口实现类

(2)属性注入:

通过 Setter 方法完成调用类所需依赖的注入,更加灵活方便

如:虽然刘建明是无间道的第一主角,但并非每个场景都需要刘建明出现,

在这种情况下,通过构造函数注入并不妥当,这时可以使用属性注入

(3)接口注入:

将调用类所有依赖注入的方法抽取到一个接口中,调用类通过实现该接口提供相应的注入方法

如:ActorArrange 即接口,调用类 WuJianDao 实现该接口

由于通过接口注入需要额外声明一个接口,这无疑增加了类的数目,

而且效果和属性注入并无本质区别,因此不提倡采用这种方式

虽然 WuJianDao 和 LiuDehua 实现了解耦, WuJianDao 无需关注

角色实现类的实例化工作,但这些工作在代码中依然存在,只是转移

到 Director 类中而已

假设某一制片人想改变这一局面,在选择某个剧本后,希望通过一个

媒体海选 或 第三方中介机构 来选择导演、演员,让他们各司其职,

那剧本、导演、演员就都实现了解耦

所谓 媒体海选 和 第三方中介机构,在程序领域即是一个第三方的容器,

它帮助完成类的初始化与装配工作,让开发者从这些底层实现类的实例

化、依赖关系装配等工作中脱离出来,专注于更有意义的业务逻辑开发

工作,这无疑是一件令人向往的事情,Spring 就是这么一个容器

IoC 的注入方式

Spring 作为一个容器,通过 配置文件 或 注解 描述类和类之间的

依赖关系,自动完成类的初始化和依赖注入的工作

下面是对以上实例进行配置的配置文件片段:

通过 new XmlBeanFactory("xxx.xml") 等方式即可加载(导入)配置文件

并同时启动 IoC 容器

在容器启动时,Spring 根据配置文件的描述信息,自动实例化 Bean 并完成

依赖关系的装配,从容器中即可返回准备就绪的 Bean 实例,后续可直接使用

Spring 为什么会有这种神奇的力量,仅凭一个简单的配置文件,就能魔法般

地实例化并装配好程序所用的 Bean 呢?

这种神奇的力量归功于 Java 语言本身的类反射功能

【made by siwuxie095】

IoC概述的更多相关文章

  1. Spring IOC 概述

    Spring IOC 概述 IOC(Inversion of Control) 控制反转,也叫 DI(D_ependency injection_) 依赖注入.是一种设计思想.不过我并不同意所谓反转的 ...

  2. Spring框架学习-Spring和IOC概述

    一:什么是Spring框架? spring是一个分层的javase/EEfull-stack(一站式)轻量级的java开源框架.是为了解决企业开发的复杂性而创建的.框架的主要优势是分层架构,Sprin ...

  3. 【Spring】IoC概述

    Spring框架的核心概念--IoC IoC IoC是Inversion of Control的简写,翻译成汉语就是"控制反转".IoC并不是一门技术,而是一种设计思想,在Spri ...

  4. 一、Spring——IoC

    IOC概述 Spring中IOC的概念,控制反转概念其实包含两个层面的意思,"控制"是接口实现类的选择控制权:而"反转"是指这种选择控制权从调用者转移到外部第三 ...

  5. Spring 源码剖析IOC容器(一)概览

    目录 一.容器概述 二.核心类源码解读 三.模拟容器获取Bean ======================= 一.容器概述 spring IOC控制反转,又称为DI依赖注入:大体是先初始化bean ...

  6. Spring(2)——Spring IoC 详解

    Spring IoC 概述 IoC:Inverse of Control(控制反转) 读作"反转控制",更好理解,不是什么技术,而是一种设计思想,就是将原本在程序中手动创建对象的控 ...

  7. 【深入spring】IoC容器的实现

    本文乃学习整理参考而来 IoC概述: 在spring中,IoC容器实现了依赖控制反转,它可以再对象生成或初始化时直接将数据注入到对象中,也可以通过将对象引用注入到对象数据域中的方式来注入方法调用的依赖 ...

  8. Spring IOC(一)概览

    Spring ioc源码解析这一系列文章会比较枯燥,但是只要坚持下去,总会有收获,一回生二回熟,没有第一次,哪有下一次... 本系列目录: Spring IOC(一)概览 Spring IOC(二)容 ...

  9. Spring IoC的概念

    Spring IoC的基础知识 Spring 框架可以说是Java世界中最成功的框架,它的成功来自于理念,而不是技术,它最核心的理念是IoC(控制反转)和AOP(面向切面编程),其中IoC是Sprin ...

随机推荐

  1. cordova屏幕尺寸

    <platform name="android"> <!-- ldpi : 36x36 px mdpi : 48x48 px hdpi : 72x72 px xh ...

  2. Python partial function 偏函数

    Partial function 偏函数是将所要承载的函数作为partial()函数的第一个参数,原函数的各个参数依次作为partial()函数后续的参数,除非使用关键字参数. 当函数的参数个数太多, ...

  3. 每天一个Linux命令(30)ln命令

    ln命令用来为文件创建链接,连接类型分为硬链接和符号链接两种,默认的连接类型是硬连接.如果要创建符号连接必须使用"-s"选项.   (1)用法: 用法:  ln  [options ...

  4. vim有用的快捷键

    多行前插入字符: ctrl + v (进入列模式,选上要插入的行) shift + i 输入要统一插入的字符 esc (虽然从外面看着是只有一行插入了,但是按下esc后就会发现之前选的都插入了 删除多 ...

  5. Data Structure Binary Tree: Morris traversal for Preorder

    http://www.geeksforgeeks.org/morris-traversal-for-preorder/ #include <iostream> #include <v ...

  6. hd acm1017

    Problem Description Given two integers n and m, count the number of pairs of integers (a,b) such tha ...

  7. Vim 命令记录与回放

    步骤如下: q+(a..z)寄存器名: 执行你要执行的操作: q 结束操作: 调用为@+寄存器: 列子如下: 在写PHP 程序时用的比较多的是创建函数: 如 function add_in(){ } ...

  8. 利用Tkinter做的自动生成JSONSchema的小工具

    前面讲到可以使用JSONSchema做json数据校验, 但是每个接口数据都手动写jsonschema太痛苦了, 就写了个小脚本,可以直接复制接口文档的mock数据然后生成一个简单的jsonschem ...

  9. Logstash的插件

    Logstash的插件: input插件: File:从指定的文件中读取事件流: 使用FileWatch(Ruby Gem库)监听文件的变化. .sincedb:记录了每个被监听的文件的inode, ...

  10. 十八 Django框架,生成二维码

    用Python来生成二维码,需要qrcode模块,qrcode模块依赖Image 模块,所以首先安装这两个模块 生成二维码保存图片在本地 import qrcode img = qrcode.make ...