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

  • 相关阅读:
    MVC3、如何应用EntityFramework 连接MySql 数据库 Kevin
    DEV EXPRESS Summary Footer 不显示 Kevin
    装饰模式 Kevin
    Dev 控件 GridControl 控件 二次绑定数据源的问题。 Kevin
    System.InvalidOperationException 异常 Kevin
    LINQ to XML Kevin
    代理模式——代码版“吊丝的故事” Kevin
    VS2012 中的设备 面板 Kevin
    maven 学习笔记(三)创建一个较复杂的 eclipse+android+maven 工程
    maven 学习笔记(一)eclipse+android+maven
  • 原文地址:https://www.cnblogs.com/fuguoliang/p/9741755.html
Copyright © 2011-2022 走看看