《深入 Spring2:轻量级J2EE开发框架原理与实践》 (作者:蔡世友吴嘉俊冯煜张钰) 简介: 本书首先是一本通过通俗案例讲解 Spring的教程;同时也是一本深入挖掘 Spring及相 关框架结构、设计原理的书;更是一本探讨J2EE软件开发中的艺术的书。本书还想讲述 条开源框架设计中金科玉律:思想决定一切,万变不离其宗。 本书分成四个部分,第一部分是 Spring新手上路,主要讲解轻量级构架中的相关概念 发展过程、所涉及到的相关技术及详细使用方法等:第二部分是一个综合的案例,讲解如何 使用 Spring及相关技术来构建JEE应用;第三部分是 Spring的原理部分,主要探讨 Spring 框架的结构,设计原理, Spring项目源码分析等,让我们深入到 Spring的核心;本书的第 四部分主要探讨开源领域的一些相关话题,让大家对开源有更加深入的认识。 为了能让大家了解 Spring、学会 Spring、透视 Spring的内核、掌握 Spring的设计原理、领 略Java艺术之精妙,我们为此做了很多工作。我们在 EasyJF开源交流社区上开通了一个专用 于解决轻量级J2EE开发问题的栏目,并请专人负责解决大家在学习及工作过程中遇到的问 题,网址:htp/www.easyif.com/bs。另外我们还通过EasyJF把本书核心案例作为一个持续 的开源项目,会长期根据 Spring的变更而更新,sN地址 http://svn.easvifcom/repositorv/easyif/spring-road/ 当然,由于时间仓促及作者水平有限,本书难免带有一些不成熟的观点,不可避免存在 一些问题。为此,我们将通过SVN及交流论坛对本书的补充内容进行不断更新,以确保广 大的读者能接触最新、最实用的 Spring技术。书中存在的问题及不足之处,还请您多给我 们提建议及意见,谢谢! 关于本书的电子版本发布申明 在出版社及本书全部作者的一致同意下,本书的一些重要章节将在互联网免费公开发 行,欢迎各大网站及媒体在保留作者及版权申明的前提下转载,本书电子版本不得用于收费 发布及平面发行 另外,由于本书还处于最后组稿阶段,因此,电子版与最终出版的图书内容会存在一定 的差异,我们将会通过 EasyJF官网及相关网站上对电子版进行即时更新 致谢 在创作本书的过程中, EasyJF开源的 williamRyam、天一、瞌睡虫、云淡风轻、与狼共 舞、abc、 nethod、 navig2等很多成员给予了很我们很大的帮助,在此深表感谢。 作者邮箱: 蔡世友caishikou@sina.com.cn 吴嘉俊 stef wual63com fengyu8299@126.com 张 zhangyu20030607@hotmail.com
《深入 Spring 2:轻量级 J2EE 开发框架原理与实践》 (作者:蔡世友 吴嘉俊 冯煜 张钰) 简介: 本书首先是一本通过通俗案例讲解 Spring 的教程;同时也是一本深入挖掘 Spring 及相 关框架结构、设计原理的书;更是一本探讨 J2EE 软件开发中的艺术的书。本书还想讲述一 条开源框架设计中金科玉律:思想决定一切,万变不离其宗。 本书分成四个部分,第一部分是 Spring 新手上路,主要讲解轻量级构架中的相关概念、 发展过程、所涉及到的相关技术及详细使用方法等;第二部分是一个综合的案例,讲解如何 使用 Spring 及相关技术来构建 J2EE 应用;第三部分是 Spring 的原理部分,主要探讨 Spring 框架的结构,设计原理,Spring 项目源码分析等,让我们深入到 Spring 的核心;本书的第 四部分主要探讨开源领域的一些相关话题,让大家对开源有更加深入的认识。 为了能让大家了解Spring、学会Spring、透视Spring的内核、掌握Spring的设计原理、领 略Java艺术之精妙,我们为此做了很多工作。我们在EasyJF开源交流社区上开通了一个专用 于解决轻量级J2EE开发问题的栏目,并请专人负责解决大家在学习及工作过程中遇到的问 题,网址:http://www.easyjf.com/bbs。另外我们还通过EasyJF把本书核心案例作为一个持续 的开源项目,会长期根据 Spring 的变更而更新, SVN 地址: http://svn.easyjf.com/repository/easyjf/spring-road/。 当然,由于时间仓促及作者水平有限,本书难免带有一些不成熟的观点,不可避免存在 一些问题。为此,我们将通过 SVN 及交流论坛对本书的补充内容进行不断更新,以确保广 大的读者能接触最新、最实用的 Spring 技术。书中存在的问题及不足之处,还请您多给我 们提建议及意见,谢谢! 关于本书的电子版本发布申明: 在出版社及本书全部作者的一致同意下,本书的一些重要章节将在互联网免费公开发 行,欢迎各大网站及媒体在保留作者及版权申明的前提下转载,本书电子版本不得用于收费 发布及平面发行。 另外,由于本书还处于最后组稿阶段,因此,电子版与最终出版的图书内容会存在一定 的差异,我们将会通过 EasyJF 官网及相关网站上对电子版进行即时更新。 致谢: 在创作本书的过程中,EasyJF 开源的 williamRyam、天一、瞌睡虫、云淡风轻、与狼共 舞、abc、netgod、navImg2 等很多成员给予了很我们很大的帮助,在此深表感谢。 作者邮箱: 蔡世友 caishiyou@sina.com.cn 吴嘉俊 stef_wu@163.com 冯 煜 fengyu8299@126.com 张 钰 zhangyu20030607@hotmail.com 1
《深入 Spring2:轻量级J2EE开发框架原理与实践》第五章 面向切面的编程(AOP)及在 Spring中的应用 目录 第五章面向方面的编程(AOP)及在 Spring中的应用 51AOP简介 5.1.1AOP概念 51.2AOP中的一些相关术语介绍 513AOP与OOP关系 1366 5.14AOP联盟简介 515AOP相关框架及工具简介 51.6AOP在企业级应用程序中的作用 52 AspectJ简介及快速入门 521 Aspect介绍 522 AspectJ的下载及安装 523在 Eclipse中开发 Aspect程序 524 AspectJ版的 HelloWorld. 525 Aspect.中相关语法 526一个简单的回合格斗小游戏示例 53一个简单的 Spring AOP示例 53.1定义业务组件 532使用基于 Schema的配置文件配置 Spring AOP 2223 53.3使用Java5注解配置及使用 Spring AOP 534基于AP方式来使用 Spring AOP 54 Spring中的AOP实现及应用 541简介 542 Spring AOP中对 AspectJ的支持 543 Spring AOPI配置方法 36 544切入点( Pointcut 545增强( Advice 546引介( ntroduction) 547增强器/切面封装( Advisor 44555 5.4.8 Proxy Factory Bean 55示例:模拟 Warcraft游戏 551示例简介 552核心关注点及系统主模块 553横切关注点需求引入及实现 0608 554使用 Aspect注解支持的AOP实现 555使用基于 Schema的方式配置 Spring AOP 56小结 57思考题
《深入 Spring 2:轻量级 J2EE 开发框架原理与实践》第五章 面向切面的编程(AOP)及在 Spring 中的应用 目 录 第五章 面向方面的编程(AOP)及在Spring中的应用..................................................................1 5.1 AOP简介.............................................................................................................................1 5.1.1 AOP概念..................................................................................................................1 5.1.2 AOP中的一些相关术语介绍..................................................................................3 5.1.3 AOP与OOP关系......................................................................................................6 5.1.4 AOP联盟简介..........................................................................................................6 5.1.5 AOP相关框架及工具简介......................................................................................8 5.1.6 AOP在企业级应用程序中的作用..........................................................................8 5.2 AspectJ简介及快速入门 ....................................................................................................9 5.2.1 AspectJ介绍 .............................................................................................................9 5.2.2 AspectJ的下载及安装 .............................................................................................9 5.2.3 在Eclipse中开发AspectJ程序 ..............................................................................13 5.2.4 AspectJ版的HelloWorld.........................................................................................15 5.2.5 AspectJ中相关语法 ...............................................................................................17 5.2.6 一个简单的回合格斗小游戏示例.......................................................................23 5.3 一个简单的Spring AOP示例 ..........................................................................................27 5.3.1 定义业务组件.......................................................................................................28 5.3.2 使用基于Schema的配置文件配置Spring AOP...................................................29 5.3.3 使用Java5 注解配置及使用Spring AOP .............................................................31 5.3.4 基于API方式来使用Spring AOP.........................................................................32 5.4 Spring中的AOP实现及应用............................................................................................34 5.4.1 简介.......................................................................................................................34 5.4.2 Spring AOP中对AspectJ的支持............................................................................35 5.4.3 Spring AOP配置方法 ............................................................................................36 5.4.4 切入点(Pointcut)...................................................................................................43 5.4.5 增强(Advice) ........................................................................................................47 5.4.6 引介(Introduction) ................................................................................................51 5.4.7 增强器/切面封装(Advisor)..................................................................................54 5.4.8 ProxyFactoryBean..................................................................................................57 5.5 示例:模拟Warcraft游戏................................................................................................60 5.5.1 示例简介...............................................................................................................60 5.5.2 核心关注点及系统主模块...................................................................................61 5.5.3 横切关注点需求引入及实现...............................................................................70 5.5.4 使用AspectJ注解支持的AOP实现 ......................................................................78 5.5.5 使用基于Schema的方式配置Spring AOP...........................................................83 5.6 小结..................................................................................................................................87 5.7 思考题..............................................................................................................................87 1
第五章面向方面的编程(AOP)及在 Spring中的应用 AOP全名 Aspect- Oriented Programming,中文直译为面向切面(方面)编程,当前已经成 为一种比较成熟的编程思想,可以用来很好的解决应用系统中分布于各个模块的交叉关注点 问题。在轻量级的J2EE中应用开发中,使用AOP来灵活处理一些具有横切性质的系统级 服务,如事务处理、安全检査、缓存、对象池管理等,已经成为一种非常适用的解决方案。 本章首先简单讲解AOP的相关概念以及在Java领域中最为出色的AOP实现 的应用,然后重点讲解 Spring2中AOP的实现及应用,最后通过一个有趣、完整的模拟 Warcraft游戏示例来演示 Spring2中的AOP的各种用法。 本章的主要是针对刚刚开始接触AOP编程方法、 Aspect、 Spring AOP的读者,另外 也针对熟悉 Spring2.0以前的AOP但不熟悉 Spring2中AOP使用的读者。本章主要从应用 的角度分析轻量级应用中的AOP编程以及 Spring2中AOP的使用方法,若您对AOP的实 现原理、 Spring AOP的底层构架原理及AOP高级应用技巧感兴趣,请阅读本书第三部分的 《AOP原理及实现》一章中的相关内容 51AOP简介 AOP全名 Aspect- Oriented Programming,中文直译为面向切面(方面)编程,是近两三年 来流行起来的一种编程思想,其弥补了面向对象编程(OOP)中存在的一些不足,让我们可以 编写出更加简洁、易维护、复用性更强的程序。本节主要通过一个实例引入AOP中的相关 概念,并简单介绍了AOP中的各种相关术语,然后分析了AOP与OOP的关系,介绍了AOP 联盟及其发布的API,并对当前一些AOP框架及工具作了简单介绍,最后简单分析了AOP 在企业级应用中的作用 511AOP概念 AOP全名 Aspect- Oriented Programming,中文直译为面向切面(方面)编程,是近两三年 来流行起来的一种编程思想,用来解决OOP编程中无法很好解决问题。作为一种编程思想, 其最初是由 Gregor kiczales在施乐的 Palo alto研究中心领导的一个研究小组于1997年提出。 ■问题引入 在传统OOP编程,我们通过分析、抽象出一系列具有一定属性与行为的对象,并通过 这些对象之间的协作来形成一个完整的软件功能。由于对象可以继承,因此我们可以把具有 相同功能或相冋特性的属性抽象到一个层次分明的类结构体系中。随着软件规范的不断扩 大,专业化分工越来越系列,以及OOP应用实践的不断增多,随之也暴露出了一些OOP 无法很好解决的问题。 假设我们有一个业务组件 Component,里面有3个业务方法,如下所示: public class Component i //业务方法1 public void business( //do SomeThing
第五章 面向方面的编程(AOP)及在 Spring 中的应用 AOP 全名 Aspect-Oriented Programming,中文直译为面向切面(方面)编程,当前已经成 为一种比较成熟的编程思想,可以用来很好的解决应用系统中分布于各个模块的交叉关注点 问题。在轻量级的 J2EE 中应用开发中,使用 AOP 来灵活处理一些具有横切性质的系统级 服务,如事务处理、安全检查、缓存、对象池管理等,已经成为一种非常适用的解决方案。 本章首先简单讲解 AOP 的相关概念以及在 Java 领域中最为出色的 AOP 实现 AspectJ 的应用,然后重点讲解 Spring2 中 AOP 的实现及应用,最后通过一个有趣、完整的模拟 Warcraft 游戏示例来演示 Spring2 中的 AOP 的各种用法。 本章的主要是针对刚刚开始接触 AOP 编程方法、AsepectJ、Spring AOP 的读者,另外 也针对熟悉 Spring2.0 以前的 AOP 但不熟悉 Spring2 中 AOP 使用的读者。本章主要从应用 的角度分析轻量级应用中的 AOP 编程以及 Spring2 中 AOP 的使用方法,若您对 AOP 的实 现原理、Spring AOP 的底层构架原理及 AOP 高级应用技巧感兴趣,请阅读本书第三部分的 《AOP 原理及实现》一章中的相关内容。 5.1 AOP 简介 AOP 全名 Aspect-Oriented Programming,中文直译为面向切面 (方面)编程,是近两三年 来流行起来的一种编程思想,其弥补了面向对象编程(OOP)中存在的一些不足,让我们可以 编写出更加简洁、易维护、复用性更强的程序。本节主要通过一个实例引入 AOP 中的相关 概念,并简单介绍了 AOP 中的各种相关术语,然后分析了 AOP 与 OOP 的关系,介绍了 AOP 联盟及其发布的 API,并对当前一些 AOP 框架及工具作了简单介绍,最后简单分析了 AOP 在企业级应用中的作用。 5.1.1 AOP 概念 AOP 全名 Aspect-Oriented Programming,中文直译为面向切面 (方面)编程,是近两三年 来流行起来的一种编程思想,用来解决 OOP 编程中无法很好解决问题。作为一种编程思想, 其最初是由Gregor Kiczales在施乐的Palo Alto研究中心领导的一个研究小组于1997年提出。 问题引入 在传统 OOP 编程,我们通过分析、抽象出一系列具有一定属性与行为的对象,并通过 这些对象之间的协作来形成一个完整的软件功能。由于对象可以继承,因此我们可以把具有 相同功能或相同特性的属性抽象到一个层次分明的类结构体系中。随着软件规范的不断扩 大,专业化分工越来越系列,以及 OOP 应用实践的不断增多,随之也暴露出了一些 OOP 无法很好解决的问题。 假设我们有一个业务组件 Component,里面有3个业务方法,如下所示: public class Component { //业务方法1 public void business1() { //doSomeThing1 1
//业务方法2 public void business2( //do Some Thing 2 //业务方法3 public void business() } //do 3 由于需求的变更,需要在每个方法执行前都要进行用户合法性验证,只有合法的用户才 能执行业务方法里面的内容,因此,我们在三个方法中的第一行都需要加如一个用户合法性 检验的代码。另外,我们还需要在运行方法中的实际业务逻辑前启动一个事务,在业务逻辑 代码执行完成后结束一个事务,需要在方法中加入开始事务处理及结束事务处理的代码。最 后,我们还需要在每一个方法结束后,把一些信息写入日志系统中。因此需要在每一个方法 的最后添加记录日志的代码,这时业务方法变成如下的形式 public void business() alidateUser( beginTransaction() //doSome Thing endrransaction(i writelogInfo()i 假如我们的系统有成千上万个这样业务方法,都需要执行用户权限验证、事务处理、日 志书写或审计等类似的工作,系统中就会充斥着非常多的重复性代码,造成代码书写及维护 极其不便。例如,由于需求的变更,我们要取消一部分业务方法中的开启事务或结束事务处 理的功能。此时,我们需要手工逐一删除掉这些方法中事务处理语句。 ■问题解决 我们能不能不用在业务方法中添加哪些重性的代码,而通过某种机制,让权限验证、事 务处理、日志记录等功能自动在这些方法指定的位置自动运行呢?为了能更好地解决上面提 到的问题,于是引入了AOP(即面向切面)编程思想 例如,使用 AspectJ中,我们可以定义一个切面,代码如下 void around(): call(void Component business*(.)) validateuser(i beginTransaction ( proceed ()i endTransaction()i writeLogInfo (
} //业务方法2 public void business2() { //doSomeThing2 } //业务方法3 public void business3() { //doSomeThing3 } } 由于需求的变更,需要在每个方法执行前都要进行用户合法性验证,只有合法的用户才 能执行业务方法里面的内容,因此,我们在三个方法中的第一行都需要加如一个用户合法性 检验的代码。另外,我们还需要在运行方法中的实际业务逻辑前启动一个事务,在业务逻辑 代码执行完成后结束一个事务,需要在方法中加入开始事务处理及结束事务处理的代码。最 后,我们还需要在每一个方法结束后,把一些信息写入日志系统中。因此需要在每一个方法 的最后添加记录日志的代码,这时业务方法变成如下的形式: public void businessX() { validateUser(); beginTransaction(); //doSomeThing endTransaction(); writeLogInfo(); } 假如我们的系统有成千上万个这样业务方法,都需要执行用户权限验证、事务处理、日 志书写或审计等类似的工作,系统中就会充斥着非常多的重复性代码,造成代码书写及维护 极其不便。例如,由于需求的变更,我们要取消一部分业务方法中的开启事务或结束事务处 理的功能。此时,我们需要手工逐一删除掉这些方法中事务处理语句。 问题解决 我们能不能不用在业务方法中添加哪些重性的代码,而通过某种机制,让权限验证、事 务处理、日志记录等功能自动在这些方法指定的位置自动运行呢?为了能更好地解决上面提 到的问题,于是引入了 AOP(即面向切面)编程思想。 例如,使用 AspectJ 中,我们可以定义一个切面,代码如下: public aspect MyAspect { void around():call(void Component.business*(..)) { validateUser(); beginTransaction(); proceed(); endTransaction(); writeLogInfo(); } 2
这样,所有 Component组件中返回值为void、名称以 business开头的方法都会自动具 有了用户验证、事务处理、日志记录等功能 假如要进一步使某一个包中的所有名称以 business开头、返回值为void的方法都具有 上面的功能。则只需要把上面 MyAspect中的内容修改一下即可,如下所示 void around(: call (void springroad. demo. chap5. business*(.)) alidateuser(i beginTransaction( proceed()i endrransaction ( writelogInfo( 在这里只需要知道可以使用AOP方式来实现前面的所提需求,要编译这个程序,需要 使用到 AspectJ编译器,关于 AspectJ,我们将会在本章下一节作介绍。 在AOP中,我们把前面示例中分散程序各个部分,解决同样问题的代码片段,称为问 题的切面(或方面)。一个切面可以简单的理解为解决跨越多个模块的交叉关注点问题(大多数 是一些系统级的或者核心关注点外围的问题)的模块。通过AOP可以使用一种非常简单、灵 活的方式,在切面中实现了以前需要在各个核心关注点中穿插的交叉关注的功能,从而使得 解决系统中交叉关注点问题的模块更加容易设计、实现及维护。 提供对AOP编程方法支持的平台称为AOP实现或框架,比如 Aspect、 JBOos Aol Spring AOP等 512AOP中的一些相关术语介绍 在AOP编程中,包括很多新名词及概念,如关注点、核心关注点、方面、连接点、通 知、切入点、引介等。由于AOP仍处于发展阶段,很多名称及术语没有统一的解释。因此 本书中关于AOP的一些术语均为当前主流的叫法。本章重点介绍的讲解轻量级J2EE中的 AOP框架的应用,而关于面向切面的设计及编程方法等一些话题,我们只略作介绍 ■关注点( Concern) 关注点也就是我们要考察或解决的问题。比如在一个在一个电子商务系统中,订单的处 理,用户的验证、用户日志记录等都属于关注点( ore concerns)。核心关注点,是只一个系 统中的核心功能,也就是一个系统中跟特定业务需求联系最紧密的商业逻辑。在一个电子商 务系统中,订单处理、客户管理、库存及物流管理都是属于系统中的核心关注点。除了核心 关注点以外,还有一种关注点,他们分散在每个各个模块中解决同一样的问题,这种跨越多 个模块的关注点称为横切关注点或交叉关注点( Crosscutting concerns)。在一个电子商业系统 中,用户验证、日志管理、事务处理、数据缓存都属于交叉关注点。 在AOP的编程方法中,主要在于对关注点的提起及抽象。我们可以把一个复杂的系统 看作是由多个关注点来有机组合来实现,一个典型的系统可能会包括几个方面的关注点,如 核心业务逻辑、性能、数据存储、日志、授权、安全、线程及错误检査等,另外还有开发过 程中的关注点,如易维护、易扩展等。 ■切面( Aspect 切面是一个抽象的概念,从软件的角度来说是指在应用程序不同模块中的某一个领域或
} 这样,所有 Component 组件中返回值为 void、名称以 business 开头的方法都会自动具 有了用户验证、事务处理、日志记录等功能。 假如要进一步使某一个包中的所有名称以 business 开头、返回值为 void 的方法都具有 上面的功能。则只需要把上面 MyAspect 中的内容修改一下即可,如下所示: void around(): call(void springroad.demo.chap5..business*(..)) { validateUser(); beginTransaction(); proceed(); endTransaction(); writeLogInfo(); } 在这里只需要知道可以使用 AOP 方式来实现前面的所提需求,要编译这个程序,需要 使用到 AspectJ 编译器,关于 AspectJ,我们将会在本章下一节作介绍。 在 AOP 中,我们把前面示例中分散程序各个部分,解决同样问题的代码片段,称为问 题的切面(或方面)。一个切面可以简单的理解为解决跨越多个模块的交叉关注点问题(大多数 是一些系统级的或者核心关注点外围的问题)的模块。通过 AOP 可以使用一种非常简单、灵 活的方式,在切面中实现了以前需要在各个核心关注点中穿插的交叉关注的功能,从而使得 解决系统中交叉关注点问题的模块更加容易设计、实现及维护。 提供对 AOP 编程方法支持的平台称为 AOP 实现或框架,比如 AspectJ、JBoos AOP、 Spring AOP 等。 5.1.2 AOP 中的一些相关术语介绍 在 AOP 编程中,包括很多新名词及概念,如关注点、核心关注点、方面、连接点、通 知、切入点、引介等。由于 AOP 仍处于发展阶段,很多名称及术语没有统一的解释。因此, 本书中关于 AOP 的一些术语均为当前主流的叫法。本章重点介绍的讲解轻量级 J2EE 中的 AOP 框架的应用,而关于面向切面的设计及编程方法等一些话题,我们只略作介绍。 关注点(Concern) 关注点也就是我们要考察或解决的问题。比如在一个在一个电子商务系统中,订单的处 理,用户的验证、用户日志记录等都属于关注点(Core Concerns)。核心关注点,是只一个系 统中的核心功能,也就是一个系统中跟特定业务需求联系最紧密的商业逻辑。在一个电子商 务系统中,订单处理、客户管理、库存及物流管理都是属于系统中的核心关注点。除了核心 关注点以外,还有一种关注点,他们分散在每个各个模块中解决同一样的问题,这种跨越多 个模块的关注点称为横切关注点或交叉关注点(Crosscutting Concerns)。在一个电子商业系统 中,用户验证、日志管理、事务处理、数据缓存都属于交叉关注点。 在 AOP 的编程方法中,主要在于对关注点的提起及抽象。我们可以把一个复杂的系统 看作是由多个关注点来有机组合来实现,一个典型的系统可能会包括几个方面的关注点,如 核心业务逻辑、性能、数据存储、日志、授权、安全、线程及错误检查等,另外还有开发过 程中的关注点,如易维护、易扩展等。 切面(Aspect) 切面是一个抽象的概念,从软件的角度来说是指在应用程序不同模块中的某一个领域或 3