【连载 Spring IoC】IoC的理解与Spring IoC的架构介绍

标签: 软件编程 ioc spring 架构 | 发表时间:2013-03-07 13:36 | 作者:kaka0202
出处:http://www.neversaydie.cc

研究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/

相关 [spring ioc ioc] 推荐:

【连载 Spring IoC】IoC的理解与Spring IoC的架构介绍

- - 码农博客
研究Spring的人太多了,网上的资料也数不胜数,今天开始笔者也将开始分析Spring以及Spring的源码,主要为自己更好地学习和掌握Spring的原理,其次分享到网上也是供大家学习和拍砖. 第一篇,没有写Spring的整体架构,原因是笔者对Spring的整体架构也不是非常熟悉,虽然网上有很多资料查询参考,但是笔者想不是自己研究的,就没必要搬过来,笔者写下的内容都是笔者亲自学习和研究的,并且可能写下来也会根据笔者的理解深度和广度不断更新.

需求变化与IoC

- - 酷壳 - CoolShell.cn
【感谢 Todd投递本文 – 微博帐号:@ weidagang 】. 程序员XX遭遇车祸成植物人,医生说活下来的希望只有万分之一,唤醒更为渺茫. 可他的Lead和亲人没有放弃,他们根据XX工作如命的作风,每天都在他身边念:“XX,需求又改了,该干活了,你快来呀. ”,奇迹终于发生了,XX醒来了,第一句话:“需求又改了.

也谈谈我对IoC的理解

- - 博客园_首页
  今天看到一篇 帖子谈到了对IoC的理解,于是我自己也忍不住跳出来“理解”一番,其实我当年也被“依赖注入、控制反转”这八个字折腾的够呛,但是搞明白之后就会发现这几个字、包括IoC这个名字都纯粹是唬人的,于是今天准备用三张图来说明白这件事.   首先,IoC和DI说的是一件事,它们的中文名分别是IoC(控制反转)和DI(依赖注入),要说依赖注入,就要先说说依赖倒置原则.

Spring详解

- - CSDN博客架构设计推荐文章
Spring是一个开源的控制反转(Inversion of Control ,IoC)和面向切面(AOP)的容器框架.它的主要目的是简化企业开发.. PersonDaoBean 是在应用内部创建及维护的. 所谓控制反转就是应用本身不负责依赖对象的创建及维护,依赖对象的创建及维护是由外部容器负责的.

Spring定时

- - 行业应用 - ITeye博客
spring的定时任务配置分为三个步骤:. . . . . .

简单Spring+hessian

- - Web前端 - ITeye博客
简单的Spring+hessian. dist\modules里面的 spring-webmvc.jar . lib\caucho 里面的hessian-3.1.3.jar. 里面有个接口interface:. 建立一个model层:(实现Serializable接口). 在WEB-INF下面创建一个remoting-servlet.xml:.

Spring MVC 和 Struts2

- - CSDN博客架构设计推荐文章
Web层面的框架学习了三个Struts1和2,SpringMVC,那他们之间肯定存在一个优劣和适用的环境,Struts1和2的异同点我已经做过对比《 Struts1和Struts2》,这篇将对比下Struts2和SpringMVC的异同,下面数据基本来源于网络,本人是搜集整理所得,供大家参考. 一个项目使用什么样的技术,决定的因素很多,我所能想到的有:对系统的性能、开发的效率、团队学习的成本、业务场景等,下面尽量从这几个方面入手,来分析比较下他们之间存在的优劣.

Spring AOP详解

- - Java - 编程语言 - ITeye博客
        最近项目中遇到了以下几点需求,仔细思考之后,觉得采用AOP来解决. 一方面是为了以更加灵活的方式来解决问题,另一方面是借此机会深入学习Spring AOP相关的内容. 例如,以下需求不用AOP肯定也能解决,至于是否牵强附会,仁者见仁智者见智. 1.对部分函数的调用进行日志记录,用于观察特定问题在运行过程中的函数调用情况.

spring roo 入门

- - 企业架构 - ITeye博客
Spring官网下载STS(如果没有STS). 创建Spring Roo基础项目. 根 据ROO的提示输入jpa setup再按ctrl+space,很遗憾这个快捷键已经被输入法切换占用,不能借助提示输入命令,但我们可以打开ROO命令向导,这里我们输入jpa 可以查到这条命令的用法,根据提示增加provider和database选项来完成命令.

Spring Rmi配置

- - 企业架构 - ITeye博客
现在远程调用一般用RPC,webservice或者Rmi,而目前用的比较多的是webservice和Rmi. webservice和rmi的最主要的区别,rmi的客户端和服务端都必须是java,webservice没有这个限制,webservice是在http协议上传递xml文本文件. 与语言和平台无关,rmi是在tcp协议上传递可序列化的java对象,只能用在java虚拟机上,绑定语言.