Spring学习手札(三)理解IoC 拯救不开心

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

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

       谁控制,控制了什么?传统编程中,好比,我须要对象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容器来建立并注入我所需的资源spa

 

   那么,IoC/DI给咱们带来了什么?翻译

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

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

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

  

  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功能;

相关文章
相关标签/搜索