【连载 Spring IoC】IoC的理解与Spring IoC的架构介绍
研究Spring的人太多了,网上的资料也数不胜数,今天开始笔者也将开始分析Spring以及Spring的源码,主要为自己更好地学习和掌握Spring的原理,其次分享到网上也是供大家学习和拍砖。
第一篇,没有写Spring的整体架构,原因是笔者对Spring的整体架构也不是非常熟悉,虽然网上有很多资料查询参考,但是笔者想不是自己研究的,就没必要搬过来,笔者写下的内容都是笔者亲自学习和研究的,并且可能写下来也会根据笔者的理解深度和广度不断更新。下面我们先来分析一下IoC。
1、什么是IoC和DI
谈到IoC,开发人员首先想到的一定是Spring IoC,因为用的人实在是太多了,不过今天笔者先要分析一下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接口两个接口的子接口。
下面我们再看一下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,确保当你需要的时候它们已经准备好了,你的应用不需要等待它们被创建。
这里我们只是对IoC作了介绍,没有过多的分析,接下来的篇章我们会慢慢对IoC进行详细分析的。
笔者的新浪微博: http://weibo.com/akakelims(昵称优雅_kaka) 欢迎大家关注和讨论技术问题。转载请注明来源: 码农博客 【连载 Spring IoC】IoC的理解与Spring IoC的架构介绍
本文链接地址: http://www.neversaydie.cc/spring-ioc-introduce/