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 的区别:
①支持国际化; ②支持消息机制; ③支持统一的资源加载; ④支持AOP功能;