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. python 中 使用sys模块 获取运行脚本时在命令行输入的参数

    在python项目的开发的过程中, 经常需要运行各种python脚本, 有时候还需要根据不同的使用情况输入不同的参数, 如果每次都去编辑一下脚本那就太麻烦,太耗费时间了, 这时就可以使用Python自 ...

  2. Windows下TensorFlow安装指南(图文版)

    随着深度学习概念火起来,TensorFlow也跟着成为业界流行的深度学习框架.它采用CPU+GPU的并行计算模式,使得神经网络可以有效的并行计算,从以前的三层网络到现在的深层网络,深度学习+tenso ...

  3. 五:MyBatis学习总结(五)——实现关联表查询

    一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创建一张教师表和班级表,这里我们假设一个老师只负责教一个班,那么老师和班级之间的关系就是一种一对一的关 ...

  4. Swift Podfile中的 use_frameworks!

    use_frameworks! A.用cocoapods 导入swift 框架 到 swift项目和OC项目都必须要 use_frameworks!B.使用 dynamic frameworks,必须 ...

  5. 【PaddlePaddle系列】手写数字识别

      最近百度为了推广自家编写对深度学习框架PaddlePaddle不断推出各种比赛.百度声称PaddlePaddle是一个“易学.易用”的开源深度学习框架,然而网上的资料少之又少.虽然百度很用心地提供 ...

  6. Delphi获取IdHTTP1.Get(url)的返回参数

    var   ss: TStringStream; begin   ss := TStringStream.Create('');   idHTTP1.get(url, ss);   ss.Positi ...

  7. jmeter -- 在beanshell中拿到请求body参数和header参数

    beanshell: import org.apache.jmeter.config.Arguments; import org.apache.jmeter.protocol.http.control ...

  8. django遇到的坑

    博主新手,今天第一次用django,遇到了很多坑和大家分享一下啊,win8.1+python3.6! 第一步安装django,配置好环境变量 .配置好环境变量.配置好环境变量(注意是配置好,不是配置了 ...

  9. oauth2.0实现sso单点登录的方式和相关代码

    SSO介绍 什么是SSO 百科:SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他 ...

  10. Javac语法糖之增强for循环

    加强的for循环有两种,遍历数组和实现了Iterable接口的容器.javac通过visitForeachLoop()方法来实现解语法糖,代码如下: /** Translate away the fo ...