java spring全解 详细教程 原理

所需积分/C币:16 2012-03-05 09:25:03 1.02MB PDF
收藏 收藏
举报

讲解spring的资料,非常适合初学者!!!
在我们进入细节以前,让我们看一下 Spring可以给一个工程带来的一些好处 ◆ Spring能有效地组织你的中间层对象,无论你是否选择使用了EJB。如果你仅仪使用了 Struts或其他的 包含了J2EE特有APIs的 framework,你会发现 Spring关注了遗留下的问题,。 ◆ Spring能消狳在许多工程上对 Singleton的过多使用。根据我的经验,这是一个主要的问题,它减少了 系统的可测试性和面向对象特性。 ◆ Spring能消狳使用各种各样格式的属性定制文件的需要,在整个应用和工程中,可通过一和一致的方法 来进行配置。曾经感到迷惑,一个特定类要査找迷幻般的属性关键宇或系统属性,为此不得不读 Javadoc乃 至源编码吗?有了 Spring,你可很简单地看到类的 JavaBean属性。倒置控制的使用(在下面讨论)帮助完 成这种筍化。 ◆spri腮g能通过接口而不是类促进好的编程习惯,減少编程代价到几乎为零。 ◆ Spring被设计为让使用它创建的应用尽可能少的依赖于他的APIs在 Spring应用屮的大多数业务对象 没有依赖于 Spring ◆使用 Spring构建的应用程序易于单元测试。 ◆ Spring能使EJB的使用成为一个实现选择,而不是应用架构的必然选择。你能选择用POJ0s或10 cal ejBs 来实觋业务接口,却不会影响调用代码。 ◆ Spring帮助你解决许多问题而无需使用HJB, Spring能提供一种H丿B的替换物,它们适于许多eb应用 例如, Spring能使用AOP提供声明性事务而不通过使用EJB容器,如果你仅仅需要与单个的数据库打交道, 甚至个需要JTA实现 ◆ Spring为数据存取提供了一致的枉架,不论是使用JDBC或0/ R mapping产品(如 Hibernate)。 Spring确实使你能通过最简单可行的解决办法解决你的问题。这些特性是冇很大价值的 总结起来, spring有如下优点 ◆低侵入式设计,代码污染极低 ◆独立于各种应用服务器,可以真正实现 Write once, Run Anywhere的承诺 Spring的D机制降低了业务对象替换的复杂性 Spring并不完全依赖于 Spring,开发者可自由选用 Spring框架的部分或全部 Spring能做什么? Spring提供许多功能,在此我将快速地依次展示共各个主要方面。首先,让我们明确 Spring范围。尽 管 Spring覆盖了许多方面,但我们已经有清炝的概念,它什么应该涉及和什么不应该涉及。 Spring的主 要目的是使J2EE易用和促进好编程习惯。 Spring不亘新开发已有的东西。因此,在 Spring中你将发现没有日志记录的包,没有连接池,没有分 布事务调度。这些均有开源项目提供(例如 Commons logging用来做所有的日志输出,或 Commons dbcp 用来作数据连接池),或由你的应用程序服务器提供。因为同样的的原因,我们没有提供0/ R mapping层, 对此,已有有好的解决办法如 Hibernate和JDO Spring的目标是使已存在的技术更加易用。例如,尽管我们没有底层事务协调处理,但我们提供了 个抽象层覆盖了JTA或仟何其他的事务策略。 Spring没有直接和其他的开源项目竞争,除卡我们感到我们能提供新的一些东西。例如,象许多开发 人员,我们从来没有为 Struts高兴过,并且感到在 MVC web framework中还有改进的余地。在某些领域 例如轻量级的Io容器和AP枉架, Spring有直接的竞争,但是在这些领域还没有已绎较为淯行的解决方 案。( Spring在这些区域是开路先锋。) Spring也得益于内在的一致性。所有的开发者都在唱同样的的赞歌,基础想法依然是 Expert 0 ne-on One J2E设计与开发的那些。并且我们已经能够使用一些主要的概念,例如倒置控制,来处理多个 领域。 Spring在应用服务器之间是可移植的ε当然保证可移植性总是一次挑战,但是我们避免任何特定平 台或非标准化,并且支持在 Weblogic, Tomcat, Resin, JBoss, WebSphere和其他的应用服务器上的用户。 Spring作为现在最伏秀的框架之一,已被广泛的使用,51CT0也曾经针对 Spring框架中的JDBC应用 做过报道。本文将从另外一个视角试图剖析出 Spring框架的作者设计 Spring框架的骨骼架构的设计理念, 有那几个核心组件?为什么需要这些组件?它们又是如何结合在一起构成 Spring的肯骼架构? Spring的 AO尸特性又是如何利用这些基础的骨骼架构来工作的? Spring中又使用了那些设计模式来完它的这种设 计的?它的这种设计理念对对我们以后的软件设计有何启示?本文将详细解答这些问题。 Spring的骨骼架构 Spring总共有十几个组件,但是真正核心的组件只有几个,下面是 Spring框架的总体架构图: 5xin的性 functon SpringLAKe 图1. Spring框架的总体架构图 从上图中可以看出 Spring框架巾的核心组件只有三个:Core、 Context和 Beans。它们构建起了整个 Spring的骨骼架枃。没有它们就不可能有A0P、Web等上层的特性功能。下面也将主要从这三个组件入手 分析 Spring Spring的设计埋念 前面介绍了 Spring的三个核心组件,如果再在它们三个屮选出核心的话,那就非 Beans组件莫属了, 为何这样说,其实 Spring就是面向Bean的痂程(BOP, Bean Oriented Programming),Bean在 Spring中 才是真正的主角 Bcan在 Spring屮作用就像 Ob jcct对0OP的意义一样,没有对象的概念就像没有面向对象编程, Spring 中没冇Bean也就没有 Spring存在的意义。就像一次演岀舞台都准备好了但是却没有演员一样。为什么要 Bean这种角色Bean或者为何在 Spring如此重要,这由 Spring框架的设计目标决定, Spring为何妇此流 行,我们用 Spring的原因是什么,想想你会发现原来 Spring解决了一个非常关键的问题他可以让你把对 象之间的依赖关系转而用配置文件来管理,也就是他的依赖注入机制。而这个注λ关系在一个叫Ioc容器 屮管理,那Ioc容器屮有又是什么就是被Bcan包裹的对象ε Spring正是通过把对象包装在Bean屮而达到 对这些对象管理以及一些列额外操作的目的。 它这种设计策咯完全类似于Java实现OP的设计理念,当然」Java本身的设计要比 Spring复杂太多 太多,但是都是构建一个数据结构,然后棖据这个数据结构设计他的生存环境,并让它在这个环境屮按照 定的规律在不停的运动,在它们的不停运动中设计一系列与环境或者与其他个伓完成信息交换。这样想 来回过头想想我们用到的其他框架都是大慨类似的设计理念。 核心组件如何协同工作 前面说Bean是 Spring中关键因素,那 Context和Core又有何作用呢?前面吧Bean比作一场演出中 的演员的话,那 Context就是这场演出的舞台背景,而Core应该就是滨出的道具了。只有他们在一起才能 具备能演岀一场好戏的最基本的条件。当然有最基本的条件还不能使这场演出脱颖而出,还要他表濆的节 目足够的精彩,这些节目就是 Spring能提供的特色功能了。 我们知道Bean包装的是 Object,而oυject必然有数据,如何给这些数据提供生存环境就是 Context 要解决的问题,村 Context来说他就是要发现每个Bean之间的关系,为它们建立这种关系并且要维护好这 种关系。所以 Context就是一个Bean关系的集合,这个关系集合又叫Ioc容器,一旦建立起这个Ioc容器 后 Spring就可以为你工作了。那Core组件又有什么用武之地呢?其实Core航是发现、延立和维护每个 Bean之间的关系所需要的一些列的工具,从这个角度看来,Core这个组件叫Util更能让你理解。 它们之间可以用下图来表示: mt组件 件 C矩 图2.三个组件关系 核心组件详解 这里将详细介绍每个组件内部类的层次关系,以及它们在运行时的时序顺序。我们在使用 Spring是应 注意的地方。 Bean组件 前面已经说明了Hean组件对 Spring的重要性,下面看看Hean这个组件式怎么设计的。Bean组件在 Spring的org. springframework. beans包下。这个包下的所有类主要解决了三件事:Bean的定义、Bean的 创建以及对Bean的解析。对 Spring的使用者来说唯一需要关心的就是Bean的创建,其他两个由 Spring 在内部帮你完成了,对你来说是透明的。 Springbean的创建时典型的工厂模式,他的顶级接口是 BeanFactory,下图是这个工厂的继承层次关 系 ①Be n li stahl eBeNnF story n Hi erarchiealBeanl artery ① i Canf 留 AulawiriCapsblelasnl y 0& CanfiguralleListalleBwanF stary Abstrse LAutamir CmpableBe anFsetaay D-faultlistsb1·B“ olFactory 图4.Bean工厂的继承关系 eanFactory有三个子类: ListableBeanFactory, HierarchicalBeanFactory和 Autowire Capable Bean Factory。但是从上图中我们可以发现最终的默认实现类是 Detaul tlistabl tory,他实现了所有 的接口。那为何要定义这么多层次的接口呢?查阅这些接口的源码和说明发现,每个接口都有他使用的场 合,它主要是为了区分在 Spring内部在操作过程中对象的传递和转化过程中,对对象的数据访问所做的 限制。例如. i stab leBeanFactory接凵表示这些Hean是可列表的,而 Hierarchi.l Bean Factory表示的是 这些Bean是有继承关系的,也就是每个Bean有可能有父 Bean. Autowire CapableBeanFactory接口定义 Bean的自动装配规则。这四个接口共同定义了Bean的集合、Bean之间的关系、以及Bean行为 Bean的定义主要自 Beandefinition摧述,如下图说明了这些类的层次关系 I 1)白 Attribute C G AttributeAccessorSupport(I G BeanMetadataElement BeanMetadataat tribnteaccessar n BeanDefinition G AbstractBe unDefinition ( )a RootBeanDefinition 图5.Bean定义的类层次关系图 Bean的定义就是完整的描述了在 Spring的配置文件中你定文的节点中所有的信息,包括各和子节点。 当 Spring成功解析你定义的一个节点后,在 Spring的内部他就被转化成 Bean Definition对象。以后所 有的操作都是对这个对象完成的 Bean的解析过程非常复杂,功能被分的很绀,因为这旦需要被扩展的地方很多,必须保证有足够的灵 活性,以应对π能的变化。Bean的解析主要就是对 Spring配置文件的解析。这个解析过程主要通过下图 中的类完成: L Beandefinitioneader (2 BeanDefinitionDocument Reader a AbstractBeanDefiniti@a DefaultBeanDefinitionDocumentReader C)a XmlBeamDefinitionReader 图6.Bean的解析类 当然还有具休对tag的解析这里并没有列出。 Context组件 Context在 Spring的org. springframework. context包下,前面已经讲解了( context组件在 Spring 中的作用,他实际上就是绘 spring提供一个运行时的环境,用以保存各个对象的状态。下面看一下这个环 境是如何构建的。 Application Context是 Context的顶级父类,他除了能标识一个应用环境的基木信息外,他还继承了 五个接口,这五个接口主要是扩展了 Context的功能。卜面是 Context的类结构图: 上L t,国3hpmy咖;国,甲!”3H国3卿 a cai(raMl小 sAlicaLes1 2e,E,网1P ,m),料,时已由15t” RYAL iuaLinnLianlaIaI 7. Context相关的类结构图 从上图中可以看出 App l icat Context继承了 BeanFactory,这也说明了 Spring容器中运行的主体 对象是Bean,另外 Application Context继承了 Resourceloader接口,使得 ApplicationContext可以访问 到任何外部资源,这将在Core中详细说明。 ApplicationContext的子类主要包含两个方面: ConfigurableapplicationContext表示该 Context是可修改的,也就是在构建 Context中用户可以动 态添加或修改已有的配置信息,它下面又有多个子类,其中最经常使用的是可更新的 Context,即 Abstract RefreshableapplicatianContext类。 Webapplication Context顾名思义,就是为web准备的 Context他可以直接访问到 ServletContext, 通常情况下,这个接口使的少。 再往下分就是按照构建 Context的文件类型,接着就是访问 Conteⅹ的方式ε这样一级一级构成了完 整的 t等级层次 总体来说 Application Context必须要完成以下几件事: ◆标识一个应用环境 ◆利用 BeanFactory创建Bean对象 保存对象关系表 ◆能够捕获各和事件 Context作为 Spring的Ioc容器,基本上整合了 Spring的大部分功能,或者说是大部分功能的基础 e组件 Core组件作为 Spring的核心组作,他其中包含∫很多的关键类,其中一个重要组成部分就是定义」 资源的访问方式。这种把所有资源都抽象成一个接口的方式很值得在以后的设计中拿来学习。下面就重要 看一下这个部分在 Spring的作用 下图是 Resource相关的类结构图: M加 aa carneum di elrksnErere Lahr he. Can OEM-sErRS THEI. 相关的类结构图 从上图可以看出 Resource接口封裝了各种可能的资源类型,也就是对使用者来说屏蔽了文件关型的不 同。对資源的提供者来说,如何把资源包装起来交给其他人用这也是一个问题,我们看到 Resource接凵 继承了 Inputstream Source接口,这个接口中有个 getInputstream方法,返回的是 Inputstream类c这样 所有的资源都被可以通过 Inputstream这个类来获取,所以也屏蔽了资源的提供者。另外还有一个问题就 是加载资源的问题,也就是资源的加载者要统一,从上图中可以看出这个仟务是由 Resourceloader接口完 成,他屏蔽了所冇的资源加载者的差异,只需要实现这个接口就可以加载所有的资源,他的默认实现是 DefaultResourceloader 下面看一下 Context和 Resource是如何建立关系的?首先看一下他们的类关系图 ① recreates------------ ① Res aurceleader Ca Defaul tResourceLaad ① ResourcePetternRegalvar &creates Ca PathMat chingResourcePatternResolver ①app1 icationConlert crater r->國由 AbstractAppli cati anlontert 图9. Context和 Resource的类关系图 从上图可以看出, Context是把资源的加载、解析和措述工作委托给了 ResourcePatternResolver类 来完成,他相当于一个接头人,他把资源的加载、解析和资源的定义整合在一起便于其他组件使用。Core 组件中还有很多类似的方式。 Ioc容器如何工作 前面介绍了Corc组件、Bcan组件和 Context组件的结构与相互关系,下面这里从使用老角度看一下 他们是如何运行的,以及我们如何让 Spring完成各神功能, Spring到底能有那些功能,这些功能是如何 得来的,下面介绍。 如何创建 BeanFactory工厂 正如图2描述的那样,Ioc容器实际上就是 Context组件结合其他两个组件共同构建了一个Bean关系 ,如何构建这个关系网?构建的入口就在 Abstractapplication Context类的 refresh方法中。这个方法 的代码如下 清单1. AbstractApplication Context, refresh 1. publ-c void refresh() throws BsansExcept-on, IliegaIStateExcep-ion 5 9 7/ Tell the subclass tc refresh tre internal bean factory

...展开详情
试读 34P java spring全解  详细教程 原理
立即下载 低至0.43元/次 身份认证VIP会员低至7折
一个资源只可评论一次,评论内容不能少于5个字
gjl1232005 很好,看了以后收益很多
2016-05-10
回复
上传资源赚积分or赚钱
最新推荐
java spring全解 详细教程 原理 16积分/C币 立即下载
1/34
java spring全解  详细教程 原理第1页
java spring全解  详细教程 原理第2页
java spring全解  详细教程 原理第3页
java spring全解  详细教程 原理第4页
java spring全解  详细教程 原理第5页
java spring全解  详细教程 原理第6页
java spring全解  详细教程 原理第7页

试读结束, 可继续读4页

16积分/C币 立即下载 >