zoukankan      html  css  js  c++  java
  • Spring学习手札(三)理解IoC 拯救不开心

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

  • 相关阅读:
    【BZOJ1495】[NOI2006]网络收费 暴力+DP
    【BZOJ2827】千山鸟飞绝 hash+堆+SBT
    【BZOJ2905】背单词 fail树+DFS序+线段树
    【BZOJ3120】Line 矩阵乘法
    【BZOJ1441】Min 拓展裴蜀定理
    【BZOJ3195】[Jxoi2012]奇怪的道路 状压DP
    【BZOJ3416】Poi2013 Take-out 栈
    【BZOJ4244】邮戳拉力赛 DP
    【BZOJ3717】[PA2014]Pakowanie 状压DP
    【BZOJ1217】[HNOI2003]消防局的设立 树形DP
  • 原文地址:https://www.cnblogs.com/fuguoliang/p/9741755.html
Copyright © 2011-2022 走看看