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功能;
上一篇: 模拟服务器