AP计算机科学A(APcomputer science A)复习备考攻略视频教程
43801 人在学
对于刚刚接触spring框架的朋友,肯定会了解IOC以及DI两个概念,毕竟Spring IOC使用的人太多。但是刚刚接触的朋友却分不清两者之间的差别。下面我们会对IOC和DI两者之间的差别进行简单的介绍以及对于Spring IOC的架构的简单介绍。
IOC和DI以及两者的关系
IOC(Inversion of Control控制反转)
它不是一种技术而是一种思想。当初IOC理论的提出就是为了解决对象之间的“解耦”。在传统的创建对象的方式中我们直接在对象内部通过new进行创建对象,是程序主动去创建依赖对象;而现在IOC是有专门一个容器来创建这些对象,即由IOC容器来控制对象的创建,并将依赖对象注入给调用者,这样就产生为了“依赖注入”的概念,也就是"DI"。
DI(依赖注入)
在2004年的时候,Martin Fowler探讨了同一个问题,既然IOC是控制反转,那么到底是“哪些方面的控制被反转了呢?”最后讨论出来的是“获得依赖对象的过程被反转了”。控制被反转之后,获得依赖对象的过程由自身管理变为了由IOC容器主动注入。于是,他给“控制反转”取了一个更合适的名字叫做“依赖注入(Dependency Injection)”。所谓依赖注入,就是由IOC容器在运行期间,动态地将某种依赖关系注入到对象之中。
所以说IOC的核心就是DI,而DI的最大优点就是松散耦合。调用者知道太多得依赖对象的内容就可容易导致紧密耦合的代码,反过来说就是知道的越少耦合就越松散,所以松散耦合也是IOC的核心所在。
Spring IOC的架构
在Spring IOC中容器主要有两种实现
BeanFactory(Bean工厂):org.springframework.beans.factory。BeanFactory是Spring IoC最核心的部分,IOC的基本功能都是由它实现的。
applicationContext(应用上下文):org.springframework.context。而ApplicationContext接口扩展了BeanFactory,并且还提供了Spring AOP集成、国际化处理、资源访问以及提供不同层次的context实现等功能。换句话说就是ApplicationContext就是增加了更多的企业级功能,多以现在常用的是ApplicationContext。
BeanFactory和ApplicationContext的区别以及联系
1)BeanFactory作为spring框架醉核心的接口,它提供了高级IOC的配置机制,而ApplicationContext建立在BeanFactory之上并提供了更多的面向应用的功能。例如:提供了Spring AOP集成、国际化处理、资源访问以及提供不同层次的context实现等功能。
2)ApplicationContext的实现已经提供了一系列加载不同Resource的读取器实现,就可以直接使用Resource。但是BeanFactory的实现需要通过IO读取之后再进行嗲用而不能直接使用Resource。
3)BeanFactory和ApplicationContext如何载于单实例bean:
BeanFactory在调用getBean()方法之前会延迟载入所有的Bean,在调用之后Bean才会被创建。
ApplicationContext会在上下文启动后预加载所有的单实例Bean。ApplicationContext通过预加载Bean,可以保证在你需要的时候就可以使用。
我们可以通过EcliPSe来了解BeanFactory和ApplicationContext的继承结构:
可以在图中看出ApplicationContext实际上就是HierarchicalBeanFactory接口和ListableBeanFactory接口这两个接口的子接口,而ListableBeanFactory接口表示这些Bean是可以列表的,而HierarchicalBeanFactory接口表示的是这些Bean是存在继承关系的,换句话说就是每个Bean都有可能有父类Bean。
下面是ApplicationContext的向下继承体系结构中我们经常会用到的:
本文对IOC和DI这两个初学者容易混淆的概念进行了简单的区分,也可以说,IOC和DI只是从不同的角度去描述同一件事情。通过引入IOC容器利用依赖关系注入实现对象之间的解耦。本章的后面对Spring容器的架构进行了介绍,没有用到代码去讲解,有兴趣的朋友可以自行上网查阅。