2.1.1  IoC是什么

Ioc—Inversion of Control,即“控制反转”,不是什么技术,而是一种设计思想。在Java开发中,Ioc意味着将你设计好的对象交给容器控制,而不是传统的在你的对象内部直接控制。如何理解好Ioc呢?理解好Ioc的关键是要明确“谁控制谁,控制什么,为何是反转(有反转就应该有正转了),哪些方面反转了”,那我们来深入分析一下:

谁控制谁,控制什么:传统Java SE程序设计,我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而IoC是有专门一个容器来创建这些对象,即由Ioc容器来控制对象的创建;谁控制谁?当然是IoC 容器控制了对象;控制什么?那就是主要控制了外部资源获取(不只是对象包括比如文件等)。

为何是反转,哪些方面反转了:有反转就有正转,传统应用程序是由我们自己在对象中主动控制去直接获取依赖对象,也就是正转;而反转则是由容器来帮忙创建及注入依赖对象;为何是反转?因为由容器帮我们查找及注入依赖对象,对象只是被动的接受依赖对象,所以是反转;哪些方面反转了?依赖对象的获取被反转了。

用图例说明一下,传统程序设计如图2-1,都是主动去创建相关对象然后再组合起来:

图2-1 传统应用程序示意图

当有了IoC/DI的容器后,在客户端类中不再主动去创建这些对象了,如图2-2所示:

图2-2有IoC/DI容器后程序结构示意图

1.1.2  IoC能做什么

IoC不是一种技术,只是一种思想,一个重要的面向对象编程的法则,它能指导我们如何设计出松耦合、更优良的程序。传统应用程序都是由我们在类内部主动创建依赖对象,从而导致类与类之间高耦合,难于测试;有了IoC容器后,把创建和查找依赖对象的控制权交给了容器,由容器进行注入组合对象,所以对象与对象之间是松散耦合,这样也方便测试,利于功能复用,更重要的是使得程序的整个体系结构变得非常灵活。

其实IoC对编程带来的最大改变不是从代码上,而是从思想上,发生了“主从换位”的变化。应用程序原本是老大,要获取什么资源都是主动出击,但是在IoC/DI思想中,应用程序就变成被动的了,被动的等待IoC容器来创建并注入它所需要的资源了。

IoC很好的体现了面向对象设计法则之一—— 好莱坞法则:“别找我们,我们找你”;即由IoC容器帮对象找相应的依赖对象并注入,而不是由对象主动去找。

2.1.3  IoC和DI

DI—Dependency Injection,即“依赖注入”:是组件之间依赖关系由容器在运行期决定,形象的说,即由容器动态的将某个依赖关系注入到组件之中。依赖注入的目的并非为软件系统带来更多功能,而是为了提升组件重用的频率,并为系统搭建一个灵活、可扩展的平台。通过依赖注入机制,我们只需要通过简单的配置,而无需任何代码就可指定目标需要的资源,完成自身的业务逻辑,而不需要关心具体的资源来自何处,由谁实现。

理解DI的关键是:“谁依赖谁,为什么需要依赖,谁注入谁,注入了什么”,那我们来深入分析一下:

谁依赖于谁:当然是应用程序依赖于IoC容器;

为什么需要依赖:应用程序需要IoC容器来提供对象需要的外部资源;

谁注入谁:很明显是IoC容器注入应用程序某个对象,应用程序依赖的对象;

●注入了什么:就是注入某个对象所需要的外部资源(包括对象、资源、常量数据)。

IoC和DI由什么关系呢?其实它们是同一个概念的不同角度描述,由于控制反转概念比较含糊(可能只是理解为容器控制对象这一个层面,很难让人想到谁来维护对象关系),所以2004年大师级人物Martin Fowler又给出了一个新的名字:“依赖注入”,相对IoC 而言,依赖注入”明确描述了“被注入对象依赖IoC容器配置依赖对象”。

注:如果想要更加深入的了解IoC和DI,请参考大师级人物Martin Fowler的一篇经典文章《Inversion of Control Containers and the Dependency Injection pattern》,原文地址:http://www.martinfowler.com/articles/injection.html。

Spring(2)----IoC基础相关推荐

  1. Spring框架IOC基础及XML的配置 第二章

    1 Spring概述 1.1 关于框架 框架的概念 框架:特指软件框架,它是我们在实际开发中解决项目需求的技术集合.运用框架可以大大简化代码的编写,缩短开发周期.同时,对后续负责项目维护的人员降低技术 ...

  2. Spring入门-ioc基础案例代码

    目录 一.ioc介绍 二.基础代码实现 1.创建接口实现类 2.传统方式创建 三.spring bean方式创建 1.配置文件 2.编写实现类 一.ioc介绍 略 导入坐标 <dependenc ...

  3. Spring入门 IOC/DI基础案例

    目录 前言 一.创建set方法让外部进行方法提供 二.配置文件 三.实际运行 前言 书接上回:Spring入门-ioc基础案例代码_年关的博客-CSDN博客 我们通过Spring方式进行了对象创建,但 ...

  4. (spring-第4回【IoC基础篇】)spring基于注解的配置

    (spring-第4回[IoC基础篇])spring基于注解的配置 基于XML的bean属性配置:bean的定义信息与bean的实现类是分离的. 基于注解的配置:bean的定义信息是通过在bean实现 ...

  5. Spring零基础入门到精通 --- IOC基础容器

    一.IOC基础容器 1.1.传统Javaweb开发的困惑 1.1.1.传统Javaweb开发代码分析-用户模块 1.1.2.传统Javaweb开发困惑及解决方案 困惑一:层与层之间紧密耦合在了一起,接 ...

  6. IoC基础篇(一)--- Spring容器中Bean的生命周期

    IoC基础篇(一)--- Spring容器中Bean的生命周期 日出日落,春去秋来,花随流水,北雁南飞,世间万物皆有生死轮回.从调用XML中的Bean配置信息,到应用到具体实例中,再到销毁,Bean也 ...

  7. Spring框架零基础学习(一):IOC|DI、AOP

    文章目录 一.IDEA创建Spring项目 二.Spring: IOC和DI 三.Spring: AOP 参考链接: HOW2J.CN:Spring idea创建一个spring项目 一.IDEA创建 ...

  8. 【Spring】Spring复习之基础和IOC

    如果对此文感兴趣,可以继续看下一篇博文,持续更新,新手学习,有问题欢迎指正:https://blog.csdn.net/renjingjingya0429/article/details/901386 ...

  9. [Spring 深度解析]第6章 Spring的IoC容器系列

    6. Spring的IoC容器系列 ​ IoC容器为开发者管理对象之间的依赖关系提供了很多便利和基础服务.有许多IoC容器供开发者选择,SpringFramework的IoC核心就是其中一个,它是开源 ...

最新文章

  1. halcon与QT联合:(5.1)瓶盖检测以及QT界面搭建
  2. Maximal Rectangle leetcode java
  3. 如何使用IMPORT关键字读取ABAP cluster表里的数据到ABAP内表
  4. 重力加速度换算_中考物理重难点汇总——公式换算大全
  5. 计算机绘图理论试题库,CAD理论试卷及答案「最新」
  6. 【Spark】Spark 报错 error writing stream metadata exitcode=1073741515
  7. 将指定路径下的所有SVG文件导出成PNG等格式的图片(缩略图或原图大小)
  8. ORA-02049: 超时: 分布式事务处理等待锁
  9. 推荐系统:非个性化推荐Non-personalized recommendation
  10. 小D课堂 - 零基础入门SpringBoot2.X到实战_第2节 SpringBoot接口Http协议开发实战_9、SpringBoot基础HTTP其他提交方法请求实战...
  11. java开发安卓app_开发安卓app常用的三种开发语言
  12. 大智慧交易系统测试软件,大智慧交易系统测试平台使用操作教程.doc
  13. 从零开发HarmonyOS(鸿蒙)运动手表小游戏——数字华容道
  14. c语言中 cos函数图像,cos图像(cos函数的图像)
  15. lte网络测试用什么软件,LTE_测试软件使用教程.doc
  16. 【CodeForces645G】Armistice Area Apportionment
  17. 检测tomcat 在CentOS 上的运行状态,发送邮件
  18. 咸鱼硬件—ZTMS开发板固件安装
  19. 【操作系统】程序执行过程
  20. mysql导入微信小程序云开发_微信小程序-云开发数据库上传json文件

热门文章

  1. arduino uno 掌控板实现数据上传到阿里云平台
  2. 将GPIO外设挂到Cortex_M3 AHB总线上详细流程扩展外设步骤总结
  3. 计算机辅助设计源程序,计算机辅助设计(插值法程序).doc
  4. python算法应用(二)——一些使用技巧
  5. 内核同步机制-读写信号量(rw_semaphore)
  6. Keil5 software packs和legacy device database分类讲解
  7. linux虚拟机能通显卡吗,英伟达 GeForce 游戏显卡正式支持虚拟机传递功能,可以完全调用...
  8. linux 服务管理
  9. Nginx反向代理其他使用方式
  10. kafka修改默认端口号