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)
image

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

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

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,445评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,889评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,047评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,760评论 1 276
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,745评论 5 367
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,638评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,011评论 3 398
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,669评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,923评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,655评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,740评论 1 330
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,406评论 4 320
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,995评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,961评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,197评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,023评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,483评论 2 342

推荐阅读更多精彩内容