Spring IoC的架构介绍

1、什么是IoC和DI
谈到IoC,开发人员首先想到的一定是Spring IoC,因为用的人实在是太多了,不过今天要讲一下IoC——Inversion of Control,顾名思义就是“控制反转”的意思,是一种思想,不严谨地说也是一种模式,而Spring IoC其实只是IoC的一种具体实现,在Java开发中,IoC意味着将你设计好的对象交给容器控制,而不是传统地在你的对象内部直接控制(包括new创建,工厂创建等等)。
理解了IoC,让我们再分析一下另外一个概念,DI——Dependency Injection,即“依赖注入”,这也是我们经常会提到的概念,为什么提到IoC就一直要提到DI呢,它们是什么关系呢?下面我们先来说说IoC的作用,我们知道在Java开发中我们传统的、最基本的创建对象的方式是用new创建对象,这是一种主动的方式,即调用者需要一个类的实例,就会主动new一个出来,而IoC是依靠容器利用反射创建和查找依赖对象,并将依赖对象注入给调用者的,这也就产生了“依赖注入”这个概念,DI正是IoC最有威力的一部分。因为在一个类内部用new主要创建实例,就会导致类与类之间高耦合,而IoC则解决了这样的问题,便于测试和功能复用,更使得程序的整个体系结构变得非常灵活。
所以可以这么说IoC的核心是DI,而DI最大的优点就是松散耦合,调用者知道太多依赖对象的内容会导致紧密耦合代码,知道越少耦合就越松散,实现松散耦合正是IoC的核心所在。讲完了IoC,让我们看看Spring是如何实现IoC的呢?下面我们就详细了解Spring IoC的整体架构:
2、Spring IoC的架构:
Spring IoC容器主要有两种实现:org.springframework.beans.factory.BeanFactory(Bean工厂)和
org.springframework.contextApplicationContext(应用上下文),其中BeanFactory是Spring IoC最核心的部分,它实现了IoC的基本功能,ApplicationContext接口扩展了BeanFactory,还提供了与Spring AOP集成、国际化处理、资源访问、事件传播以及提供不同层次的context实现,简单地说,ApplicationContext 就是增加了更多支持企业级功能支持,所以现在一般情况下很少用BeanFactory,而是用ApplicationContext了。
我们可以利用Eclipse看一下BeanFactory和ApplicationContext的继承结构:
BeanFactory一共有3个子接口1个实现类,其中实现类SimpleJndiBeanFactory主要是jndi相关的。我们可以从图上的红框看到ApplicationContext其实是HierarchicalBeanFactory接口和ListableBeanFactory接口两个接口的子接口,ListableBeanFactory接口表示这些Bean是可列表的,而HierarchicalBeanFactory表示的是这些Bean是有继承关系的,也就是每个Bean有可能有父Bean。



下面我们再看一下ApplicationContext的向下继承体系结构,红框部分是我们开发中经常会用到的实现:



3、BeanFactory和ApplicationContext的联系和区别
了解了Spring IoC容器的主要架构,对于架构的详细分析我们以后再讲,先来说一下BeanFactory和ApplicationContext的联系和区别:
1、BeanFactory是Spring框架最核心的接口,它提供了高级IoC的配置机制,ApplicationContext建立在BeanFactory的基础之上,提供了更多面向应用的功能,例如提供了国际化支持和框架实践体系,更易于创建实际应用。
2、BeanFactory的实现不能直接使用Resource,而是需要通过IO读取后再调用(例如用BeanDefinitionReader读取),而ApplicationContext的实现已经提供了一系列加载不同Resource的读取器实现,可以直接使用Resource。
3、关于单实例Bean是如何被载入的:BeanFactory延迟载入所有的Bean,直到getBean()方法被调用时Bean才被创建;ApplicationContext则会在上下文启动后预加载所有的单实例Bean。通过预载入单实例Bean,确保当你需要的时候它们已经准备好了,你的应用不需要等待它们被创建。

猜你喜欢

转载自yinny.iteye.com/blog/1919999