Inverse of Control,翻译成“控制反转”,是Spring的核心。IoC不是一种技术,而是一种设计思想。就是将原本在程序中手动创建对象的控制权(new Object() ),交由Spring容器来管理控制。不用new对象,直接从Spring那里获取一个对象(其内部使用的是反射技术)。

   如此,引入下面几个问题:

 谁控制,控制了什么?传统编程中,比如,我需要对象A,那么我通常的做法是 A a = new A(); 需要我主动创建对象A。而如今,IoC会有一个专门容器来创建对象,或者说是由IoC容器来控制对象的创建,我不需要它是怎么创建,什么时候创建,以及创建的方式还有销毁等,我只要它给我A,也就是说它控制了我对外部资源的获取。

为什么反转?比如,对象A,依赖对象B,以前的做法是在实例化A后,再实例化B,然后将B赋予A,也就是说需要我手动创建依赖对象,是正转。而如今,容器会帮助我查找并注入依赖对象,对象只是被动的接受依赖对象,是反转,获取依赖对象的动作反转了。当然,我也不需要关心B是怎么创建,什么时候创建,以及创建的方式还有销毁等。好莱坞法则“ Don't call me ,i will call you.”

 IoC改变了什么?以前是 I am the King,you are my queen,一切由我主宰,而引入IoC/DI,从思想上扭转“主从换位”。在应用程序上换位,在开发中,我需要什么,要获取什么资源都交由IoC容器来创建并注入我所需的资源。

   那么,IoC/DI给我们带来了什么?

首先,IoC的引入,将以前的依赖关系发生倒置。所有的类都会在Spring容器中标记,告诉Spring什么实体,什么描述,而Spring会在适当的时候把这个类交给开发人员。所有这些类有关的创建,销毁都由Spring控制,以及对象的生存周期不再由开发人员操作,全权交由Spring控制,这便是控制反转。(有人称呼为“反转控制”更加字面化理解)

其次,DI的是实现是I o C的一项工作了,IoC的一个重点就是在系统运行中,动态的向某对象提供它所需要的其他对象,并注入其内。或者说,获取依赖对象的方式反转了。

网上有个找女朋友的段子,很适合IoC/DI的解释。我想找个女朋友,首先,我要new 女(),她的性别必须是女,然后我有其他要求了,身高,体重,还有她的电话号,微信号,博客,工作,家庭…然后(此处省去N个字)。而现在不一样了,我想找女朋友,我不用绞尽脑汁,与茫茫人海中,遇到最合适的那个人,我要做的是将上面的要求列表,叫给婚姻介绍所或者媒婆,他们会有个美女列表(容器),帮我匹配姑娘,而我只需跟她聊聊天,喝喝茶,看看电影,谈个恋爱,结婚…这就是IoC。另外,姑娘出门还要精心打扮一番,找Tony老师设计下头发,胭脂口红什么的,不然不出门。当然,这些对与我来说不需要知道,我看到的符合要求的打扮漂亮的姑娘站在我面前,跟我约会,这就是DI。

  

  Spring提供IoC容器,管理开发的各种各样的Bean。主要是基于两个接口:

   BeanFactory

  ApplicationContext (继承自BeanFactory)

  由于这个接口的重要性,所以有必要在这里作一下简短的说明:

  【getBean】对应了多个方法来获取配置给Spring IoC 容器的Bean。
    ①按照类型拿bean:
      bean = (Bean) factory.getBean(Bean.class);
      注意:要求在配置中,只能有一个这种类型的实例,否则会报错
    ②按照bean 的名字拿bean:
      bean = (Bean) factory.getBean("beanName");
      注意:这种方法不太安全,IDE 不会检查其安全性(关联性)
    ③按照名字和类型拿bean:(推荐)
      bean = (Bean) factory.getBean("beanName", Bean.class);

  【isSingleton】用于判断是否单例,如果判断为真,其意思是该Bean 在容器中是作为一个唯一单例存在的。而【isPrototype】则相反,如果判断为真,意思是当你从容器中获取Bean,容器就为你生成一个新的实例。
注意:在默认情况下,【isSingleton】为ture,而【isPrototype】为false

   关于type 的匹配,这是一个按Java 类型匹配的方式

  【getAliases】方法是获取别名的方法

  ApplicationContext常见类

  ClassPathXmlApplicationContext,读取ClassPath中的资源

  FileSystemXmlApplicationContext,读取指定路径下的资源

  XmlWebApplicationContext,需要在web环境中才能执行

BeanFactory ApplicationContext 的区别:

  • BeanFactory是Spring中最底层的接口,只提供了最简单的IoC功能,负责配置,创建和管理bean。
    应用中,一般不使用BeanFactory,而推荐使用ApplicationContext(应用上下文),原因如下。
  • ApplicationContext
    1.继承了BeanFactory,拥有了基本的IoC 功能;
    2.除此之外,ApplicationContext 还提供了以下功能:

    ①支持国际化;
    ②支持消息机制;
    ③支持统一的资源加载;
    ④支持AOP功能;

Spring学习手札(三)理解IoC 拯救不开心的更多相关文章

  1. Spring学习(一):理解IoC容器

    序言 记得刚毕业那会儿,出来招工作被问到Spring的核心时,都觉得简单的一笔,直接说不就是IoC(控制反转)和DI(依赖注入)么,然后省略一万字对两个名词的解释.最近空来整理了一下Spring中Io ...

  2. spring 学习(三):aop 学习

    spring 学习(三):aop 学习 aop 概念 1 aop:面向切面(方面)编程,扩展功能不修改源代码实现 2 AOP采取横向抽取机制,取代了传统纵向继承体系重复性代码 3 aop底层使用动态代 ...

  3. MyEclipse Spring 学习总结三 SpringMVC

    MyEclipse Spring 学习总结三 SpringMVC 一.SpringMVC原理 1.Springmvc 框架介绍 1)Spring 框架停工了构建Web应用程序的全功能MVC模块.Spr ...

  4. Spring学习(三)--Spring的IOC

    1.BeanFactory和FactoryBean BeanFactory是一个接口类,定义了IOC容器最基本的形式,提供了IOC容器所应该遵守的基本服务契约. FactoryBean是一个能产生或者 ...

  5. Spring学习(一) IoC

      文章部分图片来自参考资料,本文介绍的是 Spring 的两个重要概念,是学习总结. 我们依旧提出几个问题,帮助我们在学习中带着问题解答. 问题 : 如何理解Ioc,它解决了什么难题(或者说是使用它 ...

  6. Spring学习(三)——Spring中的依赖注入的方式

    [前面的话] Spring对我太重要了,做个关于web相关的项目都要使用Spring,每次去看Spring相关的知识,总是感觉一知半解,没有很好的系统去学习一下,现在抽点时间学习一下Spring.不知 ...

  7. Spring学习(二)--IOC

    一.什么是IOC? 孤傲苍狼总结的理解: https://www.cnblogs.com/xdp-gacl/p/4249939.html 我的理解(不知道对不对哈,不对的话请各位大神指出): IOC往 ...

  8. Spring学习(2)---IOC

    1.接口及面向接口编程 2.什么是IOC 3.Spring的Bean配置 4.Bean的初始化 5.Spring的常用注入方式 (一)接口 用于沟通的中介物的抽象化 实体把自己提供给我外接的一种抽象化 ...

  9. Spring学习(一)IOC

     Spring是一站式框架: (1)Spring在javaee三层结构中,每一层都提供不同的解决技术. web层:SpringMVC service层:Spring的Ioc dao层:Spring的J ...

随机推荐

  1. 740. Delete and Earn

    Given an array nums of integers, you can perform operations on the array. In each operation, you pic ...

  2. Python os.walk() 遍历出当前目录下的文件夹和文件

    os.walk目录遍历 os.walk的参数如下: os.walk(top, topdown=True, onerror=None, followlinks=False) 其中: - top是要遍历的 ...

  3. Sublime Text shift+ctrl妙用(转载)

    1 :按住shift+ctrl然后按←或→可快速选中一行中的某一部分,相当于双击鼠标选中. 当你想在代码末尾加注释的话,这个方法很好用 输入文字->光标移到文字末尾->按住shift+ct ...

  4. [Swift实际操作]七、常见概念-(11)路径URL的使用详解

    本文将为你演示网址对象(URL)的使用 首先导入需要使用的界面工具框架 import UIKit 接着初始化一个指定网址的网址对象 let url = URL(string: "https: ...

  5. Java自学路线

    万事开头难,学习Java亦是如此.而在学习的开始,选择正确的学习路线更是尤为重要.在本文中我将分享本人自学转行路上的学习路线,希望能给想自学,却不知道方向的同学带来帮助~ 1 .JavaSE 基础 这 ...

  6. 用switch函数根据选择不同的radio出现不同的视图

    html代码: <!DOCTYPE html> <html> <head> <title></title> <style type=& ...

  7. vue项目打包后路径出错

    安装完vue后搭建了一个项目,直接执行 npm run dev 是可以正常打开页面的: 但是执行 npm run build 打包项目后打开却报错了,如下: 原来是项目中的静态文件路径报错了... 然 ...

  8. 【BZOJ4184】shallot 线性基

    题目传送门:https://www.lydsy.com/JudgeOnline/problem.php?id=4184 此题如果我们不考虑删除元素这一个操作,那么就是一道裸的线性基题. 但是此题会删除 ...

  9. Linux Cluster环境下批量分发执行补丁

    转自:http://blog.csdn.net/napolunyishi/article/details/18219867 这两天做了一个需求,因为上一个版本的/tmp空间默认只分配了5G,而升级程序 ...

  10. 【数组】Container With Most Water

    题目: Given n non-negative integers a1, a2, ..., an, where each represents a point at coordinate (i, a ...