??xml version="1.0" encoding="utf-8" standalone="yes"?>精品久久久久久亚洲精品,亚洲性久久久影院,99久久精品国产亚洲http://www.tkk7.com/jinfeng_wang/category/750.htmlG-G-S,D-D-U!zh-cnTue, 27 Feb 2007 10:00:58 GMTTue, 27 Feb 2007 10:00:58 GMT60人员、资源、操作及(qing)q三者构成的权限控制http://www.tkk7.com/jinfeng_wang/archive/2007/02/14/99819.htmljinfeng_wangjinfeng_wangWed, 14 Feb 2007 06:53:00 GMThttp://www.tkk7.com/jinfeng_wang/archive/2007/02/14/99819.htmlhttp://www.tkk7.com/jinfeng_wang/comments/99819.htmlhttp://www.tkk7.com/jinfeng_wang/archive/2007/02/14/99819.html#Feedback3http://www.tkk7.com/jinfeng_wang/comments/commentRss/99819.htmlhttp://www.tkk7.com/jinfeng_wang/services/trackbacks/99819.html
在谈到其安全性的时候,很多的都是从“网l安全”的角度ȝ待问题,D不知,堡垒
的内部是最最不安全的。对付“黑客攻几Z是pȝ理员所要面对的问题Q而如何更好的
加强堡垒内部自n的安全,是在WebE序的设计中需要考虑的问题?br />
pȝ理员所要面对的|络d、操作系l?tng)安全不是我所考虑的问题,如何加强Webpȝ
自n的健h我所最最兛_(j)的事情。?br />
从“构造URL”攻d“注入SQL文”攻击,都是属于q分信Q用户输入Q而造成的安全问题?br />q恰恰应该是由应用程序自w加以重视、解决的问题?br />
Z角色的安全控制已l逐渐的被大家逐渐的接受,每个用户被分配ؓ(f)不同的角Ԍ不同的角?br />h不同的操作权限?但是如何划分角色、用戗操作权限,则是需要认真对待的问题?br />
举例Q?br />一个MISpȝ中,员工有查询工资的权限Q但是某个员工是否具有查询其他员工的权限呢?

不能深入的追问问题,详细的分辨清楚系l中到底有多角艌Ӏ每个用h在的角色Q是不能完成安全控制的?br />


btw: (tng)以上的问题,大家不妨在自qcMpȝ中自己去(g)查一下,有此问题的占l大多数吧?br />看过此文的,愿意回答“是”“否”的Q可以留aQ?tng)也当作一个调查吧?/font>


上面的这个例子,是一个很成熟的办公系l中存在的问题。用客L(fng)script脚本Q控制了(jin)用户的界面操作,D不知maxthon可以解除这个限制。此pȝ中,用户的请求都被整理ؓ(f)URLQget方式提交Q,虽然URL中的键值含义ƈ不是很明显,但是q是可以试着L击,获取U密?br />
认真的核查用L(fng)输入Q利用AOP部vQ细密的对用L(fng)输入q行核查Q是很有必要的事情?br />
某个人、某个资源、某个操作,q三个要素组l在一起则是:(x)某个人对某个资源q行某项操作
实际情况下,许多人、许多资源、对每个资源冰存在着多个操作?br />
h、资源、操作进行划分,可以得到Q?br />具体的某一cMhQ可以对某些资源Q进行某些的操作Q?q就是具体的某项权限限制?br /> (tng) (tng) (tng) 某一cMhQ则可以归纳艌Ӏ?br /> (tng) (tng) (tng) Ҏ(gu)些资源的某些操作Q则可以归纳为工作Q务?br />也就是说Q整个系l是“某个角色去完成某些工作dQ而具体的一个帐户属于某个角Ԍ某项工作则具体的是指Ҏ(gu)个资源进行某个操作”?br />
相对来说Q系l中的h员是最Ҏ(gu)辨认的,pȝ中的资源也是可以在系l的功能调查时分清楚的,pȝ中的操作则是最复杂、最隑ֈ清晰Q甚臛_pȝ完成旉?x)变化的?br />
只有分L清楚?jin)系l中的h、资源、操作,才能辨别清楚pȝ中的具体的权限限制?br />
“基于角色的安全控制”这L(fng)提法Q只提及(qing)?jin)hQ未能强调将资源、操作进行规c,q是很不充分的一U提法?br />
在Webpȝ中,pȝ在设计的q程中,分清楚资源Q分清楚操作Q极大羃?yu)每个页面的功能、提高页面功能的原子性,q也是权限控制对pȝ设计提出的一要求?br />
前面提及(qing)使用AOPq行权限控制Q现在简qC下各部g的功能:(x)
 (tng) (tng) 业务模块Q-完成具体的对某个资源的操作;
 (tng) (tng) 前台面模块Q- 完成整体面的整合;
 (tng) (tng) 安全控制模块Q-实现安全控制功能Q完成h员、角艌Ӏ工作的逻辑判断Q?br /> (tng) (tng) AOP配置整合模块Q-_合安全控制模块和业务模块;


在于如何去解冻I而是如何d现。隐藏v来的问题更是危险?br />
而如何发现问题,则完全是一个素质、能力的事情Q也许这是下一个话题?br />

jinfeng_wang 2007-02-14 14:53 发表评论
]]>
AOSD QAspect-Oriented Software Development with Use CasesQ?随想 http://www.tkk7.com/jinfeng_wang/archive/2006/01/25/29182.htmljinfeng_wangjinfeng_wangWed, 25 Jan 2006 03:17:00 GMThttp://www.tkk7.com/jinfeng_wang/archive/2006/01/25/29182.htmlhttp://www.tkk7.com/jinfeng_wang/comments/29182.htmlhttp://www.tkk7.com/jinfeng_wang/archive/2006/01/25/29182.html#Feedback0http://www.tkk7.com/jinfeng_wang/comments/commentRss/29182.htmlhttp://www.tkk7.com/jinfeng_wang/services/trackbacks/29182.htmlq几天在看AOSDQ有一些疑惑?BR>在网上找?jin)些资料Q?BR>http://canonical.blogdriver.com/canonical/639784.html

http://gigix.blogdriver.com/gigix/646694.html

http://webseminar5.unix105.cn4e.com/webseminar/AOSD.ppt

http://sunshineormer.blogdriver.com/sunshineormer/847906.html


看这个图?BR>

对应q段话:(x)“Jacobson指出每一个use case是一个功能切?slice), qؓ(f)use case中的概念扑ֈ?jin)相应的E序对应物,因而可以在后期通过AOP技术将use case slicel入到系l基架构中,从而构成一U全E徏模技术。use case中的generalization可以对应于对象承, 包含(include)可以对应于对象组合和调用, 而扩?entension)对应于AOP。某些use caseh共性,如常见的CURD(Create,Update,Read, Delete)操作Q可以被抽象为参数化的use case, q可以对应于模板(template)概念。?/P>

l合原书Q?BR>如果Reservation里面的Create(),Consume()可以真的分解QCreate()和Consume()的没有Q何关pȝ话,Zq要他们放在Reservation里面呢?是Z(jin)OOQؓ(f)?jin)要把这两个动作攑֜一个类里面Q?/P>

我的意思是Q如果真的用例之间可以被切开Q解x(chng)说的“Tangling”问题,那ؓ(f)何不在实现的时?也把他们分开呢,每个用例一个类Q类g面向q程~程Q?而不是借助于AOPq样的一个中介(貌似的隔)(j)Q最后还是将多个用例之间的代码؜杂在一起呢Q?既然AOSD把他们放在了(jin)一个类里面Q那么就说们q两个内容确实存在着“Tangling”问题的Q而这个问题是在用例分析阶D就该明的。既然存在着“Tangling”,那么又怎么有一个“切片”,他们隔开呢?

AOSD中也发现一些内容(基础l构Q即领域模型Q是无法在多个用例之间切开的,所以又提出?jin)“公q例”、“基用例”来弥补一些其原型的漏z?到现在ؓ(f)止,我还没发现AOSD中用例切片、用例模块能够多真正解决问题的思\?BR>

事实上,如果真的没有关系的用例,昄也可以在OOA/OOD的过E中分开来,而无这里的AOSD所介绍的这些手Dc(din)?BR>
当然Q对于扩展用例以?qing)非功能性需求,AOSD介绍的内容还是相当不错的?BR>
l箋(hu)研习(fn)中!。。?/P>

jinfeng_wang 2006-01-25 11:17 发表评论
]]>
two ebookhttp://www.tkk7.com/jinfeng_wang/archive/2005/05/23/5069.htmljinfeng_wangjinfeng_wangMon, 23 May 2005 03:23:00 GMThttp://www.tkk7.com/jinfeng_wang/archive/2005/05/23/5069.htmlhttp://www.tkk7.com/jinfeng_wang/comments/5069.htmlhttp://www.tkk7.com/jinfeng_wang/archive/2005/05/23/5069.html#Feedback0http://www.tkk7.com/jinfeng_wang/comments/commentRss/5069.htmlhttp://www.tkk7.com/jinfeng_wang/services/trackbacks/5069.htmlAspect Oriented Software Development with Use Cases  :  http://www18.fixdown.com/ebook/l-aosd02-2005-03-31.rar


Aspect-oriented programming (AOP) is a revolutionary new way to think about software engineering. AOP was introduced to address crosscutting concerns such as security, logging, persistence, debugging, tracing, distribution, performance monitoring, and exception handling in a more effective manner. Unlike conventional development techniques, which scatter the implementation of each concern into multiple classes, aspect-oriented programming localizes them.

Aspect-oriented software development (AOSD) uses this approach to create a better modularity for functional and nonfunctional requirements, platform specifics, and more, allowing you to build more understandable systems that are easier to configure and extend to meet the evolving needs of stakeholders.

In this highly anticipated new book, Ivar Jacobson and Pan-Wei Ng demonstrate how to apply use casesa mature and systematic approach to focusing on stakeholder concernsand aspect-orientation in building robust and extensible systems. Throughout the book, the authors employ a single, real-world example of a hotel management information system to make the described theories and practices concrete and understandable.

The authors show how to identify, design, implement, test, and refactor use-case modules, as well as extend them. They also demonstrate how to design use-case modules with the Unified Modeling Language (UML)emphasizing enhancements made in UML 2.0and how to achieve use-case modularity using aspect technologies, notably AspectJ.

Key topics include

Making the case for use cases and aspects

Capturing and modeling concerns with use cases

Keeping concerns separate with use-case modules

Modeling use-cases slices and aspects using the newest extensions to the UML notation

Applying use cases and aspects in projects

Whatever your level of experience with aspect-oriented programming, Aspect-Oriented Software Development with Use Cases will teach you how to develop better software by embracing the paradigm shift to AOSD.




Applying UML and Patterns 3rd Edition Oct 2004 : http://www18.fixdown.com/ebook/l-auap06-2005-04-05.rar 

Applying UML and Patterns is the world's #1 business and college introduction to "thinking in objects"and using that insight in real-world object-oriented analysis and design. Building on two widely acclaimed previous editions, Craig Larman has updated this book to fully reflect the new UML 2 standard, to help you master the art of object design, and to promote high-impact, iterative, and skillful agile modeling practices.

Developers and students will learn object-oriented analysis and design (OOA/D) through three iterations of two cohesive, start-to-finish case studies. These case studies incrementally introduce key skills, essential OO principles and patterns, UML notation, and best practices. You won't just learn UML diagramsyou'll learn how to apply UML in the context of OO software development.

Drawing on his unsurpassed experience as a mentor and consultant, Larman helps you understand evolutionary requirements and use cases, domain object modeling, responsibility-driven design, essential OO design, layered architectures, "Gang of Four" design patterns, GRASP, iterative methods, an agile approach to the Unified Process (UP), and much more. This edition's extensive improvements include

A stronger focus on helping you master OOA/D through case studies that demonstrate key OO principles and patterns, while also applying the UML

New coverage of UML 2, Agile Modeling, Test-Driven Development, and refactoring

Many new tips on combining iterative and evolutionary development with OOA/D

Updates for easier study, including new learning aids and graphics

New college educator teaching resources

Guidance on applying the UP in a light, agile spirit, complementary with other iterative methods such as XP and Scrum

Techniques for applying the UML to documenting architectures

A new chapter on evolutionary requirements, and much more

Applying UML and Patterns, Third Edition, is a lucid and practical introduction to thinking and designing with objectsand creating systems that are well crafted, robust, and maintainable.






jinfeng_wang 2005-05-23 11:23 发表评论
]]>
AOP@Work: AOP and metadata: A perfect match, Part 1 (**zz)http://www.tkk7.com/jinfeng_wang/archive/2005/03/13/1991.htmljinfeng_wangjinfeng_wangSun, 13 Mar 2005 08:21:00 GMThttp://www.tkk7.com/jinfeng_wang/archive/2005/03/13/1991.htmlhttp://www.tkk7.com/jinfeng_wang/comments/1991.htmlhttp://www.tkk7.com/jinfeng_wang/archive/2005/03/13/1991.html#Feedback0http://www.tkk7.com/jinfeng_wang/comments/commentRss/1991.htmlhttp://www.tkk7.com/jinfeng_wang/services/trackbacks/1991.html阅读全文

jinfeng_wang 2005-03-13 16:21 发表评论
]]>
IBM QAOP@Work: AOP 工具比较Q第 2 部分QzzQ?http://www.tkk7.com/jinfeng_wang/archive/2005/03/13/1990.htmljinfeng_wangjinfeng_wangSun, 13 Mar 2005 08:20:00 GMThttp://www.tkk7.com/jinfeng_wang/archive/2005/03/13/1990.htmlhttp://www.tkk7.com/jinfeng_wang/comments/1990.htmlhttp://www.tkk7.com/jinfeng_wang/archive/2005/03/13/1990.html#Feedback0http://www.tkk7.com/jinfeng_wang/comments/commentRss/1990.htmlhttp://www.tkk7.com/jinfeng_wang/services/trackbacks/1990.html
原文地址Q?A >http://www-900.ibm.com/developerWorks/cn/java/j-aopwork2/index.shtml
英文地址Q?A >http://www-128.ibm.com/developerworks/java/library/j-aopwork2/


AOP@Work:
AOP 工具比较Q第 2 部分

内容Q?/B>
构徏斚w
~织和性能
性能考虑
IDE 集成
Ҏ(gu)比?/A>
下一步是什?/A>
底线
l束?/A>
参考资?
关于作?/A>
Ҏ(gu)文的评h(hun)
相关内容Q?/B>
AOP@Work: AOP 工具比较Q第 1 部分
A look at aspect-oriented programming
Aspect-oriented development with Eclipse and AJDT
订阅:
developerWorks 时事通讯
developerWorks 订阅
(订阅CD 和下?
开发环?/SPAN>

U别: 初

Mik Kersten Q?A href="mailto:beatmik@cs.ubc.ca">beatmik@cs.ubc.caQ?
AOP 工具构徏师、咨询顾? University of British Columbia
2005 q?3 ?

Column icon在这个由两部分构成的 AOP 工具比较的第 2 部分中,面向斚w专家 Mik Kersten 把重点攑֜工具与开发环境的集成以及(qing)构徏q程上,包括?AOP 工具 IDE Ҏ(gu)的逐点比较。ؓ(f)?jin)帮助制定最l决{,在进行ȝ的时候,作者将介绍q些快速发展的工具q期的发展情况,q提供每U工具优~点的ȝ?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">注意Q本文将解释最q宣布的 AspectJ ?AspectWerkz 目合ƈ的意义?/I>

在这个由两部分构成的 AOP 工具比较?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">W?1 部分 中,介绍?4 U领先的 AOP 工具QAspectJ、AspectWerkz、JBoss AOP、Spring AOPQ实现核?AOP 机制的方式。虽然这些工具已l集中在q接Ҏ(gu)型、切入点、通知和类型间声明的思想上,但是每种工具在处?AOP 语法Ӟ仍有各自明显的优~点。正如在W?1 部分介绍的,语法的决{不仅媄(jing)响方面编E时的感?—?J琐的语?VS 更加直接、作Z码的切入?VS 注释、通知保存在相同的源文件中 VS 本地化ؓ(f) XML 中的斚w配置 —?而且q(sh)(x)对语义带来差异。现在,q一部分l探索不同技术的意义Q但q次的重Ҏ(gu)研究以上决策?AOP 工具在整体开发过E和开发环境中的集成有什么媄(jing)响?/P>

本文从深入研I?AspectJ ?Java?语言扩展的发展情况开始,重点查看代码风格在方面构建和?rn)态检查方面的优势和不뀂然后讨论每U工L(fng)不同~译方式Qƈ用最新的 AWBench 评l果说明它们Ҏ(gu)能的媄(jing)响?/P>

?AOP 工具比较的第 2 部分中,最重要的讨Z题可能是 IDE 支持。本文将Ҏ(gu)U工L(fng) IDE 支持逐个Ҏ(gu)地q行比较Qƈ对两个实际的 IDE 插gq行看得见的比较。本文还?sh)(x)介l每U工L(fng)文和库支持情况Q这两者是选择新技术实现时的重要因素?/P>

文章l尾提供?jin)对q些工具未来发展方向的一些推,概括?jin)每U工L(fng)核心(j)优势与不뀂表 1 ȝ?jin)整文章详l讨论的开发环境集成的一些关键因素?/P>

?1. AOP 工具比较Q开发环境集?/B>

关于本系?/B>
AOP@Work pd面对的是那些在面向方面编E上有些基础Qƈ且想扩展或加׃(jin)解的开发h员(有关 AOP 的背景,请参?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资?/A>Q。同 developerWorks 的大多数文章一P本系列的文章非常实用Q读完每介l新技术的文章Q都可以立即该技术投入实用?/P>

本系列文章所选择的每位作者,都在面向斚w~程领域内处于领先地位,或者具有这斚w的专家水准。许多作者都是本pd文章中介l的目和工L(fng)参与者。每文章都力图提供一个中立的评述Q以保q里所表达观点的公正性与正确性?/P>

请分别就q些文章的评论或问题?sh)它们的作者联pR要Ҏ(gu)pdq行整体评论Q可以与q蝲的负责h Nicholas Lesiecki 联系?/P>

关于本文
本文q不想突出某一U工P而是想用一U批判的、没有偏见的方式H出每种工具的优势与不。虽然作者是 AspectJ 目的参与者之一Q但是在~写本文的时候,也咨询了(jin)其他 AOP 工具目的领ghQ以保公^地展C所讨论的技术?/P>

如果读者已l读q?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">W?1 部分Q那么现在可能正惌行开发环境集成?/P>

构徏斚w
在?AOP 工具Ӟ不管是用工L(fng) IDE 支持Q还是通过 Ant 和命令行q行构徏Q?zhn)会(x)注意到的第一件事是:(x)AOP 工具与构建环境集成得怎么P在谈到构建环境集成的时候,AOP 工具之间的关键区别在于该工具是否采用?jin)语a扩展。虽?AspectJ 提供?jin)一U代码风|q种风格?Java 语言的一U扩展,但是其他三种技术都采用?jin)普?Java 语言与基?XML 和注释的斚w语言的组合。从集成的观Ҏ(gu)看,AspectJ ?Java 语言的扩展更有利Q因为方面声明拥有与cd明一L(fng)z的格式和易于编辑的方式。但从负面来看,扩展 Java 语言是个?xi)战Q因为每U解?Java 源代码的工具都必L展,才能理解斚w。结果,虽然目前有一?AspectJ 工具Q正如在Ҏ(gu)比?/A>中讨论的Q,但这个套件仍不完整?/P>

从构建环境的角度看,q些技术的主要区别是:(x)AspectJ 必须提供自己的编译器Q而其他工具可以依靠标准的 Java ~译器。AspectJ ~译器扩展了(jin) Eclipse Java ~译器,可以q Eclipse 在命令行上独立运行,也可以用?Eclipse 和其?IDE 的插件。AspectJ ~译器对 ?java???aj?文g中声明的 AspectJ ?Java 代码q行构徏Qƈ生成普通的 Java 字节码。虽然要使用新编译器q点有些不Q但是这么做可以提供切入点的?rn)态检查,而且q(sh)(x)带来很大的益处?/P>

切入点的?rn)态检?/SPAN>
在处理类ӞJava E序员对?rn)态检查的依赖很重。这意味着Q不用过多考虑Ҏ(gu)名称的拼写错误,因ؓ(f)~译器能够立x(chng)?gu)c错误。如果没有进行静(rn)态检查,那么q类错误C(jin)q行的时候才?x)被捕获。AspectJ 对于所有的斚w声明都有完整的静(rn)态检查,所?AspectJ ~译器会(x)立即指出切入点中拼写错误的引用。其?AOP 工具可以(g)查方面声明的合格E度Q但是,不管是用注释q是?XML 声明Q它们都没有提供切入点的?rn)态检查。对于典型的 Java 开发h员来_(d)q样做的后果是要投入大量_֊查看 XML |而且q(sh)(x)在运行时带来大量调试错误。如果切入点中放错一个括P那么不会(x)昄Ҏ(gu)修改的编译错误,只会(x)造成很难阅读和调试的q行时堆栈跟t?/P>

有了(jin) AspectJ ~译器,斚w代码可以得?Java 代码从静(rn)态检查得到的全部好处。如果没有该~译器,那么在键入切入点表达式时Q必非常小?j),而且q要适应通过执行应用E序扑և错误Q因为切入点的表辑ּ非常复杂Q所以这很容易带来问题?/P>

在图 1 中可以看CU工具处理切入点中括号错误的区别。图的上面显CZ(jin) AspectJ 中错误的出现方式Q图的下面显CZ(jin) AspectWerkz 中错误的出现方式?/P>

?1. ?AspectJ 中和?AspectWerkz 中定位语法错误的比较

AspectJ 的编译器在键入代码的时候就?x)主动解析方面代码,立即指出括号错误。?AspectWerkzQ则要到q行时才?x)检查出q个错误。由此可以看刎ͼ在没有切入点?rn)态检查的工具中,q类语法错误需要更多时间调试。但是,更常见、更Ҏ(gu)的问题则是因为在切入点中拼写出错误类型名q类的错误造成的。在没有q行?rn)态检查的情况下,AOP 框架无法调用M通知Q因此会(x)(zhn)无声息地失败。指出错误在哪特别费Ӟ其在初ơ接?AOP 和切入点时。有?jin)?rn)态检查,AspectJ 的编译器?x)发(gu)告,指出无法解析的类型名U或{֐。正如在后面讨论的那P在即发布的工具中,可以期盼获得?rn)态检查支持方面的提高?/P>

未来构徏环境的考虑
AOP 工具的方面声明的z性,应当有助于判断该工具?rn)态检查的优势。例如,Spring AOP 创徏通知时要q行大量 XML 的搭配。某U工兯求的手工搭配多Q花在编写和调试q个搭配的时间就?x)越多,其在有许多斚w的时候。从U极的方面来看,可以通过自动生成 XML 搭配来解册个问题。稍后将讨论 JBoss AOP ?Eclipse 插gQ它能够做到q一炏V?/P>

如果选择?AspectJ 作ؓ(f) AOP 工具Q那么所有需要用方面的 Java 目都必M?AspectJ 的编译器。对于某些项目来_(d)q可能存在问题(例如在集中指定生产构Z用的~译器的情况下)(j)。从U极斚w来说QAspectJ ~译器打替?Java ~译器。另一个有关的考虑是:(x)每种工具因ؓ(f)dҎ(gu)面的支持而带来的~译开销各不相同。下一节将详细讨论q一炏V最后,q应当记?AspectJ 的语a扩展Ҏ(gu)要求目中用的所有与构徏有关的工具都要扩展到 AspectJ。这意味着许多现成的解?Java 代码的工h法用?AspectJ 代码Q例如,基准和报告工P依赖性和风格(g)查器Q以?qing)版本控制用?diff 工具Q?/P>

语言扩展在构建集成上的利?/B>

q一节将从构建集成的角度描绘 AspectJ 的语a扩展Ҏ(gu)的一些主要利弊:(x)

- 使用普?Java 源代码的工具必须扩展才能用来处理斚w代码?BR>
- 需要用不同的~译器?BR>
+ 扩展?Java ~译器提供了(jin)全部斚w代码的完整静(rn)态检?BR>
+ ~写和调试切入点变得更加Ҏ(gu)?

虽然语言扩展Ҏ(gu)生来有不Q但是它的一些优点将来也可以应用到注释和 XML 风格上。把q些优点提供l注释风|正是 AspectJ ?AspectWerkz 两个团队联合q行 @Aspect 开发工作的主要动机Q而且q还表明Q如果用底层的 AOP ~译器,那么?rn)态检查也能用于注释风根{目前,虽然q存在其他研I质量的~译器,但是 AspectJ ~译器是惟一辑ֈ商业质量?AOP ~译器。注意,与采用不同编译器的必要性相关的许多x(chng)炚w是工hw所固有的。在构徏时、装入时或运行时修改q些字节码的时候,一些媄(jing)响编译新字节码的问题?sh)?x)出现。正如下一节将讨论的,q个~织QweavingQ?/I> q程是所?AOP 工具的基本过E,因ؓ(f)是它支持横切x(chng)点的模块化实现?/P>

~织和性能
正如可以用不同的机制Q例如,解释或编译成字节码或对象代码Q编译和执行 OOP E序那样QAOP 工具为构建和执行斚w提供?jin)不同的工具?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">斚w~织器(aspect weaverQ?/I> 提供?jin)按照方面中切入?gu)定的方式自动调用通知的搭配方式。编l器可以接受源代码或二进制Ş?AOP 代码作ؓ(f)输入。方面的~织对于性能和可伸羃性有影响Q其中大部分取决于编l发生在应用E序生命周期的哪一部分。方面的~织可以在以下时间发生:(x)

  • 构徏?/B> —?如果 OOP ~译器已l扩展到 AOPQ那么方面编l就是标准编译的一部分Q否则就是编译后的步骤?BR>
  • 装入?/B> —?与方面字节码的编译时~织相同Q但是,是在c装入的时候进行编l?BR>
  • q行?/B> —?拦截和基于代理的机制提供?jin)切入点匚w的手D,可以军_什么时候应当调用通知?/LI>

AspectJ ?AspectWerkz 都支持构建时和装入时~织Q但?AspectJ 更侧重于前者,?AspectWerkz 更侧重于后者。JBoss AOP ?Spring AOP 则侧重于在运行时使用动态代理和拦截器调用方面。注意,也能?Java VM 技术扩展到支持q行时编l,但目前这仍然处在研究阶段。用运行时拦截框架的关键好处是Q它很自然地扩展C(jin)斚w?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">热部|Ԍhot deploymentQ?/I>。这意味着可以在运行时ȀzL用所应用的通知?/P>

热部|是 JBoss AOP 的核?j)特性,它提供了(jin)一个应用服务器理控制収ͼ可以Ȁzd止某些斚w。在 Spring AOP 中也有热部v。加?AspectWerkz 构徏和装入时~织模型的类似扩展也支持热部|Ӏ在 AspectJ 中,用这U方式激zd止斚w需要用通知中的 ?if?试或用 “if?切入点进行。有时用术语“动?AOP”来描述热部|Ԍ但是h意,q个术语可能?x)造成误导Q因为所有的 AOP 工具都支持动态连接点模型。而且 Spring AOP 完全Z代理机制。因此,q种工具很适合_粒度的横切Q但是纯_基于代理的 AOP 不能用来通知_的连接点Q例如方法调用或字段讄Q。另一斚wQ可以在没有构徏时或装入时编l的情况下?Spring AOP 的代理,q对于某些应用服务器的部|会(x)非常有用?/P>

性能考虑
?AOP 和性能的讨ZQ需要重点关注的是关?AOP 实现的性能的争论,它们与若q年前关于对象性能问题的争论类伹{一般来_(d)使用斚w的代码执行v来与Ua(b)面向对象的解x(chng)案类|q类Ҏ(gu)中横切代码散落在整个pȝ中)(j)。在大多C业应用程序中Q执行时间由q程调用和数据库调用军_Q所以通常没有必要担心(j)使用M一U?AOP 工具时的开销?/P>

也就是说Q考虑一下AWBench 最新发布的 AOP 工具基准?x)很有h(hun)|请参?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资?/A>Q。要理解q些基准Q需要考虑 AOP 工具q行斚w~织和编译的不同技术对性能的媄(jing)响方式?/P>

AspectJ 在编译时?x)带来开销Q主要是内存和时间的使用Q因为它是在~译时执行大部分通知。在大型目中,q些开销有可能是很可观的Q而且可能带来一些问题,特别是面向方面编E的横切Ҏ(gu)通常意味着Q在切入点发生变化时Q大部分pȝ都需要重新编译。但它也意味着在运行的时候,几乎不需要ؓ(f)?jin)匹配切入点做额外的工作。另外一个运行时的性能优势来自 AspectJ ?AspectWerkz 中连接点参数的静(rn)态类型检查。这?x)带来性能飞跃Q因Z需要以反射的Ş式访问连接点上下文了(jin)。对比之下,JBoss AOP ?Spring AOP Z拦截的技术在q行时有更多的工作要做。因此,?AWBench 基准评定中可以看C个趋势:(x)AspectJ 的通知调用最快,然后?AspectWerkz、JBoss AOPQ最后是 Spring AOP。通过比较QAspectJ 的构建时开销最多,AspectWerkz ơ之QJBoss AOP 再次QSpring AOP 没有构徏时开销?/P>

拦截的性能利弊

JBoss AOP ?Spring AOP 使用的拦截和Z代理?AOP 实现主要的性能利弊是什么?

+ 构徏旉的内存和旉开销可以忽略不计?BR>
- q行时的通知调用开销Q需要决定切入点匚w?

与Q何性能度量标准一P只能把这些准则当作参考,应当l合应用E序和用情冉|考虑q些准则。例如,?Spring AOP 一起用的典型_粒度方面一般不?x)生显著的开销。这里介l的工具没有M一个有让h无法接受的硬伤。与以前的一?AspectJ ?AspectWerkz 相比Q这两种工具q行?jin)更多的优化Q其他工h在紧紧追赶。AOP ~译器相Ҏ(gu)说也是一U新发明Q目前从研究C֌到诸?AspectJ 之类的实现的优化速度也在加快。当发生q些改进的时候,正如我们期望看到的那P构徏旉?x)在不断地改q?/P>

IDE 集成
IDE 集成的目标是在熟(zhn)的 IDE 中方便地~写和构建面向方面的E序。要辑ֈq个目标Q必能够在 IDE 中调?AOP ~译器或~织器。IDE 支持的另外一个主要职责是让系l的横切l构易于D和理解?/P>

在编辑切入点Ӟ不得不运行系l才能查看结果,L受媄(jing)响的q接Ҏ(gu)非常耗时的。与此类似的问题是,开发h员在初次学习(fn) AOP 时经怼(x)问:(x)?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">怎样才能知道斚w在系l上的效果呢Q如果其他h{օ的方面会(x)影响正在处理的方面又?x)怎样呢?”通过指出什么时候连接点受通知影响QAOP 工具回答?jin)这些问题。这意味着在处理某个方法的时候,可以看到影响该方法的所有通知。反q来Q在~写斚w的时候,可以立即看到q个斚w影响?jin)哪个连接点。可以想像一下现?Java IDE 是怎样提供方便的导航方式的Q可以从一个方法导航到所有重写它的方法。这U面向对象工h持得系l的l承l构清晰可见。?AOP IDE 支持使得横切l构的效果清晰可见,从而处理某些斚w像处理对象一样容易?/P>

插g比较
每种工具都提供了(jin)不同E度?IDE 支持Q在帮助目选择合适工L(fng)时候,q点可能很重要。研I实际?AspectJ ?JBoss AOP IDE 插g可以让h对它支持的特性范围有个概c(din)下一节将q一步研I工L(fng) IDE 插g?/P>

?2 演示?jin)用?Eclipse ?AspectJ 开发工PAJDTQ如何在~辑器中呈现出横切结构,以及(qing)如何呈现Z(jin)昄斚w声明?qing)其效果而扩展的视图。关于这些特性的详细描述以及(qing)更多截屏Q请参阅参考资?/A>中的 AJDT 文章?/P>

?2. 用于 Eclipse ?AspectJ 开发工PAJDTQ插?V1.2.0

下面重点介l一?AJDT 插g的特性;列表~号与图中的标签对应Q?/P>

  1. 包浏览器昄?jin)一些方面和斚w声明。切入点和声明出现时有它们自q图标Q这些图标指Z(jin)通知?I>U类Q例如:(x)before、after {)(j)?BR>
  2. ~辑器支持显CZ(jin)l构化的注释Q允总某个斚wD到被通知成员。内容辅助弹出对话框则显CZ(jin)通知体中所有可以用的q接点上下文?BR>
  3. 文档大纲QDocument OutlineQ表C活动编辑器的横切结构,代表影响对应q接点的通知和类型间声明。方面成形器QAspect VisualiserQ(在大U下面,在这个压~的截屏中勉强可以见刎ͼ(j)昄?jin)整个包中或目中横切的整体效果QƈH出?jin)受通知影响的源代码行?BR>
  4. 受通知影响的方法显CZ(jin)可以用来D到相应方面声明的引导注释。所有其他受影响的连接点都显CZ(jin)相同的结构(例如Q受cd间声明媄(jing)响的cdQ以?qing)受通知影响的调用站炏V)(j)

?AJDT 插g一PJBoss AOP 插g也支持用视图在横切结构中D。在?3 中可以看刎ͼEclipse ?JBoss AOP 插g提供?jin)一些与 AJDT 插g相同的功能。它q有两个显著的额外特性:(x)斚w理器视图,用于查看切入点绑定;q有一?GUIQ用于创建基于枚丄切入炏V?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?2 提供?jin)这些插件特性的完整比较?/P>

?3. JBoss Eclipse 插g V1.0.1

下面重点介l一?JBoss AOP 插g的特性;列表~号与图 3 中的标签对应Q?/P>

  1. 在包览器中Q通知昑־和普?Java 成员?sh)栗?BR>
  2. 斚w理器是 jboss-aop.xml 文g的图形化昄Q可以减由于缺乏静(rn)态检查而带来的问题Q例如手工编?XML 的需要)(j)。它q对E序的横切结构提供了(jin)方便的完整系l显C?BR>
  3. Java 元素上的一个附加上下文菜单允许直接选取它们Q将它们攑օ一个切入点中,无需~辑切入点表辑ּ?/LI>

Ҏ(gu)比?/SPAN>
?2 ȝ?4 U工?IDE Ҏ(gu)当前的情况。它q提供了(jin)每种工具现有的库和文情늚ȝ。然后是详细讨论?/P>

?2. IDE 支持、库和文?/B>

下面的说明介l了(jin)每种工具?IDE 支持的关键特性:(x)

  • AspectJ —?AspectJ 主要?IDE 支持是针?Eclipse 的。Oracle JDeveloper、Borland JBuilder ?Sun NetBeans 插g也提供了(jin)不同E度?AspectJ 支持。但是,目前 JBuilder ?NetBeans 版本的开发不是很z跃Q因此大大落后于 AspectJ 语言的发行进度。随 AspectJ 提供的一个重要工h ajdocQ它可以?AspectJ E序生成 Javadoc 风格的文。对?A >?3 中看到的文档大纲中导航的横切l构Q?CODE>ajdoc 支持?HTML 文中的链接对这些结构进行导航。编辑器中的内容助手是一Ҏ(gu)Ҏ(gu),对编写方面很有帮助,寚w些对语言和各U原生切入点q(sh)太熟(zhn)的Z特别有用?BR>
  • AspectWerkz —?AspectWerkz 提供?jin)初U的 Eclipse 插g。插件的成熟度落后于核心(j) AspectWerkz 实现的成熟度Q至于真正的 IDE 支持Q不要指望从 AspectWerkz 中可以得刎ͼ虽然q是联合 @AspectJ 旉期获得的一个好处)(j)?BR>
  • JBoss AOP —?JBoss AOP 也侧重于 Eclipse 支持。JBoss ?AOP 插g提供?jin)方面管理器Q它方便?XML 配置文g的编辑。Advised Members 视图使得D横切成ؓ(f)可能。JBoss q有一个新的动态方面部|?UIQ它?JBoss AOP 提供?jin)在q行时修改应用通知的方ѝ请注意QJBoss ?AOP 插g是最q才发布的。它的成熟度q比不上 JBoss AOP 框架的其余部分?BR>
  • Spring AOP —?在编?XML 文g中的斚w规范说明书时QSpring ?Eclipse 插g?x)很有帮助,但它没有提供M特定?AOP 的功能?/LI>

所有的工具都依赖现有的 Java 调试器进行启动和调试。在所有的工具中,包括那些没有成熟 IDE 支持的工PAspectWerkz ?Spring AOPQ,斚wE序的调试都工作得不错。这意味着在通知中和单步执行Qsingle steppingQ中讄断点与在普?Java cM是一L(fng)?/P>

有可能错q的Ҏ(gu)?/SPAN>
目前Q所有的 IDE 插g中都q缺乏对重构的支持。所以,如果Ҏ(gu)名改变,那么本来应当仍然匚wq个Ҏ(gu)的切入点可能不再匚w。这是语a扩展不擅长的领域之一。在 AspectJ 不得不ؓ(f)重命名提供自q重构支持的时候,在某U程度上Q其他技术可以利用现有的重构支持。因为基于注释和 XML 风格的工具必L完全限定 Java 切入点当作字W串Q所以它们也可以借助重构工具Q重新命名内嵌在 XML 文g和注释中的完全限?Java 引用?/P>

支持?IDE 中?UML 视图的工兯来越多,管对这c视囄应用目前仍然存在争议。目前,q没有与 AspectJ 或其?AOP 工具兼容?UML 查看器。如果对 AspectJ E序使用 UML 查看器,查看器可能会(x)崩溃Q因为它要求的是普?Java 代码。相比之下,普通的 Java 技术会(x)把方面作为普通的 Java cLC。这样做的好处是有限的,因ؓ(f)它无法显C在通知与受影响的连接点之间Q或者通知与通过cd间声明添加的附加成员?sh)间的所有有意义的关pR?/P>

文和库
除了(jin) IDE 支持Q工L(fng)文和库支持也是评估的重要因素。每U工具都提供?jin)在U文档,但是 Spring 框架为其 AOP 功能提供的是有点分散的、以实现Z?j)的文?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">无需 EJB ?J2EE 和其他关?Spring 框架的书c会(x)很快填补q个I白。AspectJ ?AOP 工具的最好证明,目前有六本这斚w的书正在印刷。注意,可用文的状态仅仅反映了(jin)每个目已经q行的时间长短?/P>

Spring AOP 提供?jin)优U的库支持。与 Spring 框架的集成意味着它利用了(jin)依赖注入的(dependency-injectingQ方面,提供?jin)复杂成熟的事务拦截器库Q而且支持一些有的W三Ҏ(gu)面(例如 Acegi 安全性框Ӟ(j)。Spring ?AOP 库拥有在应用服务器之间移植的优点Q而且_ֿ(j)?xi)选的框架lg方式使它很容易接Ux(chng)块中其他利用 AOP 支持的部分。JBoss AOP 提供?jin)?JBoss 框架?JEMS 堆栈的其他部分的良好集成Q而且拥有目前能够得到的最丰富的方面库。这些库包括?JBoss Cache、J2EE 按需使用、JBoss remoting、异步方面和 JMX 斚w的支持。目前,虽然已经用这些工具创Z(jin)一些第三方库,?AspectJ ?AspectWerkz 不包括Q何库。未来的发行版承诺将提供库支持?/P>

下一步是什?/SPAN>
评估 AOP 工具时要考虑的最后一个因素就是它们的下一步是什么。所有这些工具都在快速走向成熟,目前的实现工作正在解册里讨论的许多问题。更有趣的是某些技术的优势正在渗透到其他技术中。例如,横切视图曄?AspectJ 所Ҏ(gu)的,但现?JBoss AOP 也提供了(jin)横切视图Q而且很快其他工具也会(x)提供。合q后?@AspectJ ?x)?AspectJ 工具支持的许多优点带?AspectWerkz 的注释风g。@AspectJ q提供了(jin)语言扩展风格与注释风g间的互操作性,q样Q语a的语法也成为开发h员的一个选择?/P>

沿着q条路,?AOP 重构的研I将?x)提供所有技术都能用的l果。用于图形选择和切入点操作?UI 从一些常见的直观推断中受益,q些直观推断能够选择和搜索结果{换成切入炏VUML 视图也会(x)开始显C?AOP 声明和联合。全面支持这些新Ҏ(gu)是有可能的Q这要感谢一些领先的 AOP 工具在语义上的汇集?/P>

长远来看Q性能应该是一个不是问题的问题。就像开发h员(sh)该担?j)虚拟方法分z开销一P他们也不用担?j)通知的调用开销。目前在很大E度上这是事实,而且随着~织器的改进Q以?qing)?JIT ?VM 的集成越来越紧密Q情况还?sh)(x)变得更好?/P>

q有另外两个势正在出现Q但是还?sh)确定。首先,AOP 的连接点模型和切入点机制的适用性超了(jin)~程语言Q对于能够从描述q行时事件的z语a中受益的其他工具来说QAOP 的连接点模型和切入点机制也很适用。随着来多的h采用 AOP 工具Q切入点的应用在调试器、profiler q类工具中的应用可能来普遍。例如,可以在特定的控制程中设|断炏V另一个正在出现的势与模型驱动的开发(model-driven development MDDQ有兟뀂由于横切的问题在系l中是如此基本的一个问题,所?MDD 工具?x)从模型化的横切l构以及(qing)生成的方面中L(fng)?/P>

以下是期望从q些工具卛_发布版本中得到的一些具体特性的列表Q?/P>

  • AspectJ ?AspectWerkz —?AspectJ 5 ?x)提供对切入?gu)型的支持Ҏ(gu)。@AspectJ 语法?x)支?AspectWerkz 注释风格?BR>
  • JBoss AOP —?参数的静(rn)态类型化、性能提高、库和更多的 IDE 支持Ҏ(gu)?BR>
  • Spring AOP —?性能提高、与 AspectJ 切入点的互操作性,以及(qing)把某?Spring AOP 服务打包?AspectJ 斚w?/LI>

底线
如果存在q里l出的优势和不Q如何判断ؓ(f)特定目选择哪个工具Q在采用某项技术时可能遇到的主要问题是什么?q里是每U工L(fng)强项与弱点的一个概括,可以帮助(zhn)制定最l决{。下面将开始介l手工编写横切问题(sh)使用 AOP 工具q行处理的优劣对比?/P>

所有工?VS 手工~码的横?/B>

- 目前q(sh)支持高 IDE Ҏ(gu)(例如重构Q?BR>
+ 一些方面天生就处于复杂pȝ中,如果没有 AOP 工具Q实C(x)变得非常脆弱Q难以发展?BR>
+ 横切变得很明,易于推理和修攏V?BR>

AspectJ

- 语言扩展要求使用已扩展的~译器和相关工具?BR>
- ~少库?BR>
+ z的斚w声明和切入点的静(rn)态检查?BR>
+ 成熟?IDE 集成?BR>
+ 丰富的文?BR>

AspectWerkz

- 不太z的斚w和切入点声明?BR>
- ~少切入点的?rn)态检查?BR>
- ~少库?BR>
+ ?AspectJ cM的机Ӟ没有语言扩展?BR>
+ 支持斚w的热部v?BR>

JBoss AOP

- ~少切入点的?rn)态检查?BR>
- ~少到其他应用服务器的移植性?BR>
+ 有丰富的企业斚w库集合可用,与丰富的 JBoss ?JEMS 库集成在一赗?BR>
+ IDE 支持降低?jin)采用难度,减少了(jin)手工编?XML 代码的需要?BR>
+ 支持斚w的动态部|Ӏ?BR>

Spring AOP

- 只能通知那些通过框架的代理机制实例化的对象?BR>
- 不适合l致的方面?BR>
- ~少处理斚w?IDE 支持?BR>
+ 单的q接Ҏ(gu)型很适于_粒度的斚wQ更Ҏ(gu)学习(fn)?BR>
+ Spring 框架集成Q易于现?Spring 用户采用?BR>
+ 跨应用服务器的方面库可移植性?BR>

l束?/SPAN>
AOP 工具目前的成p人对它的发展前景感到兴奋Q之所以特别有兴趣在这里研I这 4 U工P是因为它们目前的成熟度,以及(qing)对它们未来开发的展望。这里选择q行比较?4 U工具都_成熟Q均适用于商业开发,q且?x)在来的某个时候获得成功?/P>

仔细分析q篇׃部分构成 AOP 工具比较pd文章中讨论的该工L(fng)利弊Q这些有助于判断哪种工具最适合(zhn)的目。文中指Z(jin)工具处理斚w声明、编l以?qing)构建集成的主要区别Q概qC(jin)关键的性能问题Q还?IDE 集成的好处。本文概qC(jin) Java 语言扩展的优势与不Q这个主题对 Java 开发h员有p的意义,文章q指Z(jin) AOP 工具的一些未来发展方向?/P>

在阅L文时Q读者可能会(x)很惊讶地发现q些工具的相同点要多于它们的不同炏V这意味着不管选择哪项技术,学习(fn)曲线可以从一?AOP 工具转移到另一个。每U工L(fng)新发展会(x)l箋(hu)怺渗透。AOP 工具目前正在q速发展,可以满不断增长的用L(fng)区的需求;而且它还在不断发布新版本。不?zhn)最后采用什么样?AOP 工具Q都鼓励(zhn)加入它的用戯论列表。?zhn)的反馈?x)帮助q项重要的技术指明未来的发展方向?/P>

记着下个月l关?AOP@Work pd的下一期文章:(x)Ramnivas Laddad ?“元数据?AOPQ天生绝配”?/P>

参考资?

关于作?/SPAN>
Mik Kersten 是一的面向斚w的编E专Ӟ也是 AspectJ ?AJDT eclipse.org 目的参与者。作?Xerox PARC 的研I科学家Q他?AspectJ 构徏?IDE 支持。他正在不列颠哥伦比亚大学攻d士学位,他的主要工作是 IDE 更加面向斚w。他也向构徏开发工L(fng)公司提供咨询Q帮助公司利用、支持面向方面的~程技术?




jinfeng_wang 2005-03-13 16:20 发表评论
]]>
IBM QAOP@Work: AOP 工具比较Q第 1 部分QzzQ?/title><link>http://www.tkk7.com/jinfeng_wang/archive/2005/03/13/1989.html</link><dc:creator>jinfeng_wang</dc:creator><author>jinfeng_wang</author><pubDate>Sun, 13 Mar 2005 08:18:00 GMT</pubDate><guid>http://www.tkk7.com/jinfeng_wang/archive/2005/03/13/1989.html</guid><wfw:comment>http://www.tkk7.com/jinfeng_wang/comments/1989.html</wfw:comment><comments>http://www.tkk7.com/jinfeng_wang/archive/2005/03/13/1989.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/jinfeng_wang/comments/commentRss/1989.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/jinfeng_wang/services/trackbacks/1989.html</trackback:ping><description><![CDATA[<TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR vAlign=top> <TD><span id="wwg4ya6" class=astitle>原文地址Q?A >http://www-900.ibm.com/developerworks/cn/java/j-aopwork1/index.shtml</A><BR>英文地址Q?A >http://www-128.ibm.com/developerworks/java/library/j-aopwork3/</A><BR><BR><BR>AOP@Work: </SPAN><span id="6ayyuee" class=atitle>AOP 工具比较Q第 1 部分</SPAN></TD> <TD width=8><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=8 border=0></TD> <TD align=right width=180><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=180 border=0><BR><NOBR></NOBR></TD> <TD width=6><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=6 border=0></TD></TR> <TR vAlign=top> <TD bgColor=#000000 colSpan=5><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=100 border=0></TD></TR> <TR vAlign=top> <TD bgColor=#ffffff colSpan=5><IMG height=8 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=100 border=0></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR vAlign=top> <TD width=5><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=5 border=0></TD> <TD width="100%"> <TABLE cellSpacing=0 cellPadding=0 width=168 align=right border=0> <TBODY> <TR> <TD width=8><IMG height=21 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=5></TD> <TD width=160> <TABLE cellSpacing=0 cellPadding=0 width=160 border=0> <TBODY> <TR> <TD width=160 bgColor=#000000 height=1><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD align=middle background=/developerworks/cn/i/bg-gold.gif height=5><B>内容Q?/B></TD></TR> <TR> <TD width=160 bgColor=#666666 height=1><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD> <TABLE cellSpacing=0 cellPadding=0 width=160 border=0> <TBODY> <TR> <TD><A >选择成熟的工?/A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A >都是Z(jin)q接?/A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A >斚w比较</A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A >语法差异</A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A >语义的相似?/A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A >语言机制</A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A >l束?/A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR><!--Standard links for every dw-article--> <TR> <TD><A >参考资?</A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A >关于作?/A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A >Ҏ(gu)文的评h(hun)</A></TD></TR> <TR> <TD><IMG height=10 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width=160 border=0> <TBODY> <TR> <TD width=160 bgColor=#000000 height=1><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD align=middle background=/developerworks/cn/i/bg-gold.gif height=5><B>相关内容Q?/B></TD></TR> <TR> <TD width=160 bgColor=#666666 height=1><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD> <TABLE cellSpacing=0 cellPadding=1 width=160 border=0> <TBODY> <TR> <TD><A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">AOP Tool comparison, Part 2: Development environments</A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">A look at aspect-oriented programming</A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Aspect-oriented development with Eclipse and AJDT</A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width=160 border=0> <TBODY> <TR> <TD width=160 bgColor=#000000 height=1><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD align=middle background=/developerworks/cn/i/bg-gold.gif height=5><B>订阅:</B></TD></TR> <TR> <TD width=160 bgColor=#666666 height=1><IMG height=1 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD> <TABLE cellSpacing=0 cellPadding=1 width=160 border=0> <TBODY> <TR> <TD><A >developerWorks 时事通讯</A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD><A >developerWorks 订阅<BR xmlns:fo="http://www.w3.org/1999/XSL/Format">(订阅CD 和下?</A></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD height=1><IMG height=5 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE> <TABLE cellSpacing=0 cellPadding=0 width=160 border=0> <TBODY> <TR> <TD width=150 bgColor=#000000 colSpan=2 height=2><IMG height=2 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR> <TR> <TD width=150 bgColor=#ffffff colSpan=2 height=2><IMG height=2 alt="" src="http://www-900.ibm.com/developerworks/cn/i/c.gif" width=160></TD></TR></TBODY></TABLE></TD></TR></TBODY></TABLE><span id="6u4iogs" class=atitle2>语言机制</SPAN><BR> <TABLE cellSpacing=0 cellPadding=0 border=0> <TBODY> <TR vAlign=top align=left> <TD> <P>U别: 中</P></TD></TR></TBODY></TABLE> <P><A ><NAME>Mik Kersten</NAME></A><BR>AOP 工具构徏师、咨询顾? University of British Columbia<BR>2005 q?2 ?</P> <BLOCKQUOTE><ABSTRACT-EXTENDED>AOP 技术的时代已经来(f)Q但是怎样才能为项目选择正确的工具呢Q在新推出的 <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">AOP@Work</I> pd的第一文章中Q面向方面(aspect-orientedQ的~程专家 Mik Kersten 比?4 个领先的 AOP 工具QAspectJ、AspectWerkz、JBoss AOP ?Spring AOPQ,帮助大家判断应该选择哪一个工兗本文由两个部分l成Q在文中Q作者将重点介绍q些工具的语a机制和不同技术的优劣。他分别?4 U工L(fng)写同一个示例,让读者感觉到它们之间的高U区别。他q将讨论每种工具的语法技术对 AOP 语义产生的效果。在文章l束Ӟ作者将对工L(fng)核心(j)语言机制Q例如切入点匚w和组合、通知的格式、连接点上下文)(j)q行深入比较?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">注意Q本文将解释最q宣布的 AspectJ ?AspectWerkz 目合ƈ的意义?/I></ABSTRACT-EXTENDED></BLOCKQUOTE> <P>面向斚w~程QAOPQ在 Java?q_上变得日益流行。随着 AOP 出版物和?x)议的增加,q项技术的工具与实现越来越多。虽然h们很清楚 AOP 是面向对象技术的补充Q但?Java 开发h员该如何评估当前?AOP 工具Q特别是每项新技术实现的优劣Q这斚w则相对不那么清楚?/P> <P>本文有两部分Q而且本文q是 developerWorks 上一个新?AOP pd的第一文章。在本文中,概q?AOP 工具当前的技术状况,比较对于该技术而言最成熟的一些方法:(x)AspectJ、AspectWerkz、JBoss AOP、和 Spring AOPQƈҎ(gu)与每U方法的采用有关的问题。文中还?sh)(x)解释最q宣布的 AspectJ ?AspectWerkz 目合ƈ的意义(请参?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资?/A>Q?/P> <P>本文无意作ؓ(f) AOP 的介l或某个特定 AOP 实现的入门读物。而是对目前使用最普遍?AOP 技术进行概q。对每个工具的语a机制和工h持的内在优劣q行探讨Q将有助于ؓ(f)目选择最合适的技术。这里定义的指标q(sh)(x)让读者更加容易地评估卛_推出?AOP 工具和特性。关?developerWorks 上介l?AOP 的最新文章列表,请参?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资?/A>?/P> <P>h意本文有两个部分Qؓ(f)?jin)方便读者,两部分同时发布。第 1 部分侧重于这 4 个领先工具各自的 AOP 语言机制处理技术,其中包括工具的方面语法(aspect syntaxQ和切入点的表示、用来声明方面的机制范围{主题?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">W?2 部分</A>l箋(hu)深入介绍领先?AOP 实现如何与现有的开发环境、工具和库进行集成。这一部分包括以下主题Q方面设计器、IDE 插g、可伸羃性和 AOP 工具来的发展方向,q包括对最q?AspectJ ?AspectWerkz 目合ƈ的关注?/P> <P><A name=IDAVCESB><span id="sa24wy2" class=atitle2>选择成熟的工?/SPAN></A><BR>AOP 是一Ҏ(gu)技术,所以,q不是现有的所有工具都已经成熟到适用于商业开发。判断成熟度的一个主要因素是用户的采用程度。在考虑把一Ҏ(gu)~程技术应用到商用之前Q这Ҏ(gu)术必Mz跃的用L(fng)区的反馈中得到强化。表 1 昄?aosd.net 上列出的目前可以使用?AOP 工具Q请参阅<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资?/A>Q。每个工L(fng)用户列表贴子数量可以表明它的用户基数Q省略了(jin)贴子的实际数量,因ؓ(f)单独一个月的统计可能给读者造成误解Q?/P> <P><A name=table-survey><B>?1. ?2004 q?11 ?AOP 工具用户列表中的贴子数量</B></A><BR><IMG height=160 alt="" src="http://www-900.ibm.com/developerworks/cn/java/j-aopwork1/table-survey.gif" width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P> <P> <TABLE cellSpacing=0 cellPadding=5 width="30%" align=right border=1> <TBODY> <TR> <TD background=/developerworks/cn/i/bg-gold.gif> <P><A name=sidebar1><B>关于q个pd</B></A><BR><I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">AOP@Work</I> pd面对的是在面向方面编E上有些基础Q同时想扩展或加p斚w?jin)解的开发h员。同 developerWorks 的大多数文章一Pq个pd非常实用Q读完每介l新技术的文章Q都可以立即其投入使用?/P> <P>个系列选择的每个作者都是面向方面编E领域的领导或专家。许多作者都是系列文章中介绍的项目和工具的参与者。每文章都力图提供一个中立的评述Q以保q里表达的观点的公正与正?/P> <P>请就文章的评论或问题分别与这些文章的作者联pR要对这个系列整体进行评论,可以与这个系列的负责?<A href="mailto:ndlesiecki@yahoo.com" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Nicholas Lesiecki</A> 联系?/P> <P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">关于本文</B><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">本文q不想突出某一个工P而是要用一U批判的、没有偏见的方式H出每个工具的优势与不。虽然作者是 AspectJ 目的参与者之一Q但是在~写本文的时候,也咨询了(jin)其他 AOP 工具目的领ghQ以保公^地展C所讨论的技术?/P></TD></TR></TBODY></TABLE></P> <P>h?Spring ?AOP 部分没有形成一个独立的下蝲或用L(fng)团,所以用户基数相当比例的用户可能没有l?Spring AOP 发脓(chung)Q而是投在别的主题?sh)?jin)。在 aosd.net 上还列出?4 个额外的工具Q但是它们要么缺乏用戯坛,要么?11 月没有脓(chung)子?/P> <P>AOP 工具虽然没有列在表中前四位,但它在技术上可能非常成熟Q可是缺乏较大的用户基数意味着它们q没有经受过采纳E度试。虽然在本文~写的时候,它们q(sh)适合于商业开发,但是q些工具的日后发展还是值得x(chng)的。通过上表的比较,q可以看出非 Java q_?AOP 工具没有 Java q_的工h熟,但是应当注意 .NET ?C++ 工具的用L(fng)区正在成ѝ?/P> <P>Ҏ(gu)?1Q可以看出,从用户采用度的角度来_(d)AspectJ、AspectWerkz、JBoss AOP ?Spring AOP 是领先的工具。所有这些工具都是适合用于商业开发中的开源项目。按字母序它们排列如下,包括它们 V1.0 版本的发布日期:(x)</P> <UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <LI><B>AspectJ</B> —?2001 q由 Xerox PARC ?AOP 组发行。目前主在 eclipse.org 上,?IBM 支持。版本已l更新到 1.2.1?BR><BR> <LI><B>AspectWerkz</B> —?2002 q发布,?BEA Systems 支持。版本更新到 2.0RC2?BR><BR> <LI><B>JBoss AOP</B> —?2004 q作?JBoss 应用E序服务器框架的扩展发布。版本更新到 1.0?BR><BR> <LI><B>Spring AOP</B> —?2004 q作?Spring 框架的扩展发布。版本更新到 1.1.3. <BR><BR></LI></UL> <P><A name=IDAXEESB><span id="2mku4uu" class=atitle2>都是Z(jin)q接?/SPAN></A><BR>本文介绍的每?AOP 工具都采用了(jin)q接点(join pointQ模型和机制Q显式地声明E序的横切结构。虽然各个工具实现这个框架的技术非常相|但是理解底层机制对于?jin)解每项技术的优劣是非帔R要的。在q一节中Q将回顾 AOP 的连接点模型以及(qing)利用q接Ҏ(gu)型的语言模型?/P> <P><A name=IDA3EESB><span id="iswys4u" class=atitle3>支持机制</SPAN></A><BR>AOP 工具的设计目标是把横切的问题Q例如认证和事务理Q模块化。在单独使用面向对象技术实现的的时候,处理q些问题的代码会(x)分散在整个系l中Q这U分散造成理和发展横切结构时出现不必要的困难。与对象提供?jin)一U能够清楚地捕获l承l构的语a机制cMQAOP 也ؓ(f)横切问题的良好模块化提供?jin)同L(fng)好处。位于每?AOP 工具核心(j)的是<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">q接Ҏ(gu)?/I>Q它提供?jin)一U机Ӟ可以识别出在哪里发生?jin)横切?/P> <P><I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">q接?/I> 是ȝ序和斚w盔R的地斏V静(rn)态连接点允许斚w定义cM的新成员。动态连接点是方面执行与E序执行盔R的地斏V例如,普通的 Java E序执行Ҏ(gu)调用、字D设|这L(fng)q接炏V再比如_(d)误(g)虑一下这样一个问题:(x)Ҏ(gu)?<CODE>Account</CODE> 状态的zdq行监视Q就像在 Ramnivas Laddad ?<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">AspectJ in Action</I> 一书中讨论的那P请参?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资?/A>Q??1 中的序囄Z(jin)?<CODE>Account</CODE> 操作上Ş成的一些动态连接点?/P> <P><A name=figure1><B>?1. H出?jin)选中的动态连接点?UML 序列?/B></A><BR><IMG height=481 alt="" src="http://www-900.ibm.com/developerworks/cn/java/j-aopwork1/figure-sequence.gif" width=455 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P> <P>下面的编号与图中的编号对应:(x)</P> <OL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <LI><I>Ҏ(gu)执行</I> q接点,与方法返回之前的生命周期对应?BR><BR> <LI><I>控制程</I> 捕捉在控制流E序列中出现的各个连接点Q在q个例子中,?<CODE>debit()</CODE> Ҏ(gu)调用下方的序列描qC(jin)?<CODE>debit()</CODE> 调用中发生的全部q接炏V?BR><BR> <LI><I>字段讉K</I> q接点对应着字段的读和写Q在q个例子中,?<CODE>Account</CODE> cM?<CODE>name</CODE> 字段q行?jin)赋倹{?/LI></OL> <P> <TABLE cellSpacing=0 cellPadding=5 width="30%" align=right border=1> <TBODY> <TR> <TD background=/developerworks/cn/i/bg-gold.gif> <P><A name=sidebar2><B>AspectJ ?AspectWerkz 目合ƈ</B></A><BR>AOP 技术正在迅速地向前发展Q在本文?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">W?2 部分</A>H出?jin)领先?AOP 工具的预计的发布计划。有一个那些思想前的读者会(x)特别感兴的主题Q这是最q?AspectJ ?AspectWerkz 目的合qӞq一合ƈ?x)?AOP 的发展前景带来重大的变化。一些开发h员在q些目上进行合作,生 AspectJ 5Q这是一U单一工具Q融合了(jin)q里介绍?AspectJ ?AspectWerkz 的语法?/P> <P>重要的是要注?AspectWerkz q没有正在消失。它?yu)成为编?AspectJ E序的另一U方法,q更名ؓ(f) <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">@AspectJ 风格</I>。在q里可以看到Q语法是 AOP 实现之间的主要区别因素,而核?j)?AOP 机制通常非常怼?AspectWerkz ?AspectJ 的相似性得这两种技术可以联合。合q可以在提供斚w语法的时候提供更多的灉|性,同时保留着关键的好处(例如?rn)态类型化和成熟的工具支持Q。有兛_q的l节以及(qing)相关文档Q可以从<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">参考资?/A>中得到。虽然本文重Ҏ(gu)在立d可以开始用的工具上,但是q里概述的指标和优劣也适用于未来的发行版(例如 AspectJ 5Q?/P></TD></TR></TBODY></TABLE></P> <P><A name=IDAVHESB><span id="yq4kmm4" class=atitle3>切入炏V通知和类型间声明</SPAN></A><BR>AOP 工具提供?jin)识别连接点集合的机Ӟ叫?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">切入点(pointcutQ?/I>?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">通知QadviceQ?/I> 机制指定在程序执行过E中遇到匚w的切入点时应当采取什么行动。另外,cd间声明(inter-type declarationQ(开攄或؜合类提供?jin)在现有cd上声明额外成员的Ҏ(gu)。切入点、通知和类型间声明l合在一P?AOP 语言可以清楚地表达横切问题?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">斚w</I> 声明可以在标准的 Java 字段和方法之外包含这三类成员。方面代表一套模块化良好的横切结构。如下所C,不同?AOP 技术实现这些方法的技术各不相同。但是,每种技术的核心(j)Q都是连接点的访问、编辑、命名和抽象机制?/P> <P>切入点可以通过昑ּ枚D方式描述q接炚w合。应当用一个示例指?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?1</A> 所C的 <CODE>Account</CODE> 的利息的三个Ҏ(gu)调用。虽然枚丑֏能很有用Q但是用l构化属性的方式表示q接炚w常更方ѝ这cd于属性的切入点可以表CZ套与“每个针?<CODE>Account</CODE> 子类型的调用”匹配的q接点,却不必强q程序员枚Dq些子类型。这样做可以保证向系l添加由 <CODE>Account</CODE> 扩展的新cLQ新cM(x)自动与切入点匚w?/P> <P>切入Ҏ(gu)?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">复合QcompositionQ?/I>Q这允许把单的切入点组合成更复杂的切入炏V例如,可以把所?<CODE>Account</CODE> 调用的切入点限制在那些针对特定类或控制流E进行的调用中。切入点?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">命名QnamingQ?/I>机制提高?sh)(jin)可L和复合性。对<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">抽象QabstractionQ?/I>?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">具体化(concretizationQ?/I>的支持,可以更加Ҏ(gu)地创建通用库,对于要应用库的特定应用程序的切入Ҏ(gu)_(d)q些库可以独立定义。最后,对切入点?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">公开q接点状?/I> 的支持允许对诸如正在执行对象和方法参Ccȝ讉K事项q行商量?/P> <P><A name=IDAHZJSB><span id="2oc4w24" class=atitle2>斚w比较</SPAN></A><BR>如前所qͼ所?AOP 工具的底层机刉是连接点和切入点、通知和类型间声明的概c(din)在q些工具中,可以注意到的主要区别是斚w声明~写?qing)应用到pȝ上的方式。这些工具可用以下方法中的一U进行方面声明:(x)使用cM Java 的代码、注释或 XML。对于某些开发h员来_(d)熟?zhn)?Java 语言~程斚w的知识,要比熟?zhn)语言扩展技术的优劣更重要,q些内容?x)在后面的小节中讨论。对于其他h来说Q了(jin)解注释和 XML 技术在集成上的优势Q要比痛苦地把切入点当作字符串来操作更重要?/P> <P>在这一节中Q将使用一个常见的CZ指出每个工具在方面声明技术上的差异。请考虑<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?1</A> 所C的 <CODE>Account</CODE> cȝ授权{略q样一个示例。在面向对象的实CQ最常见到的Q就是对认证的调用分散在 <CODE>Account</CODE> cȝ众多Ҏ(gu)以及(qing)需要认证的其他cM。在 AOP 实现中,可以明确地用一个方面捕莯个行为,而不必修Ҏ(gu)U帐L(fng)代码。不用什么工具声明,q个斚w都需要具备以下特征:(x)</P> <UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <LI>一?I>切入?/I>Q捕?<CODE>banking.Account</CODE> cM所有公共方法的执行?BR> <LI>一U引用正在认证的 <CODE>Account</CODE> 的方式?BR><BR> <LI><I>通知</I>Q在切入Ҏ(gu)定的q接点上调用 <CODE>Account</CODE> 的认证?/LI></UL> <P>现在Q请看这几个领先?AOP 工具各自是如何处理这个方面的?/P> <P><A name=IDAV0JSB><span id="wogu444" class=atitle3>AspectJ</SPAN></A><BR>Aspect 中的斚w声明cM?Java 语言中的cd明,如图 2 所C。由?AspectJ ?Java 语言语法和语义的扩展Q所以它提供?jin)自q一套处理方面的关键字。除?jin)包含字D和Ҏ(gu)之外QAspectJ 的方面声明还包含切入点和通知成员。示例中的切入点使用?jin)修饰符QmodifierQ和通配W(wildcardQ模式来表达“所有公共方法”。对帐户的访问,?<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">pointcut</I> 参数提供。通知使用q个参数Q而切入点则用 <CODE>this(account)</CODE> 把它l定。这样做的效果,是捕获?jin)正在执行的?gu)所隶属 <CODE>Account</CODE> 对象。否则,通知的主体与Ҏ(gu)的主体相伹{通知可以包含认证代码Q或者就像在q个CZ中一P可以调用其他Ҏ(gu)?/P> <P><A name=figure2><B>?2. AspectJ 的方?</B></A><BR><IMG height=222 alt="" src="http://www-900.ibm.com/developerworks/cn/java/j-aopwork1/figure-aspectj.gif" width=579 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P> <P>构徏 AspectJ E序与构?Java E序cMQ其中包括调?AspectJ 的递增~译器,构徏所有的目源文Ӟ包括普通的 Java 源文件。运?AspectJ E序也与q行 Java E序一Ph意要?<CODE>aspectjrt.jar</CODE> 库添加到c\径中。要对在pȝ中应用哪个方面进行配|,必须把它们加入包含列表或从中删除Q包含列表会(x)传递给~译器,可以通过 IDE 支持传递包含列表,如果正在 Ant 环境或命令行q行工作Q也可以通过?lst?包含文g传递。注意,在第 2 部分中,讨论构?AOP E序的细节以?qing)方面设计的概念?/P> <P><A name=IDAX1JSB><span id="ww24yas" class=atitle3>AspectWerkz</SPAN></A><BR>AspectWerkz ?AspectJ 之间的重要区别就是:(x) <CODE>Authentication</CODE> 现在是一个普通的 Java c,而不是一个方面。AspectWerkz、JBoss AOP ?Spring AOP 都在没有改变 Java 语言语法的情况下加入?jin)方面语义。AspectWerkz 提供?jin)两U进?AOP 声明的途径。最常用的是注释Q注释可以采用图 3 中的 Java V5.0 风格Q也可以Z(jin)?J2SE V1.4 兼容采用 Javadoc 风格。AspectWerkz q支持另外一U基?XML 的方面声明风根{XML 风格与下面介l的 JBoss AOP 的风格类|把方面声明放在单独的 XML 文g中?/P> <P>h意通知是普通的Ҏ(gu)声明。按照约定,它被当作不同cd的方法声明,因ؓ(f)不应当显式地调用它,而是应该在满特定切入点时自动运行它。AspectWerkz 的切入点声明是附加到切入点“方法”的字符串|也可以在 XML 文g中独立存在。所以,没有切入点的 <CODE>import</CODE> 机制Q所有的cd引用必须完全规范。对正在q行?<CODE>Account</CODE> 对象的访问技术与 AspectJ 相同。请注意Q规划的 <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">@AspectJ</I> 语法看v来与 AspectWerkz 注释的语法非常相伹{?/P> <P><A name=figure3><B>?3. AspectWerkz 的方?/B></A><BR><IMG height=391 alt="" src="http://www-900.ibm.com/developerworks/cn/java/j-aopwork1/figure-aspectwerkz.gif" width=579 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P> <P>构徏 AspectWerkz E序?x)涉及(qing)一个标准的 Java 构徏Q然后会(x)涉及(qing)到后处理。要q行 AspectWerkz E序Q必L AspectWerkz 库放在类路径中。在使用不可插入的方面的情况下,?aop.xml 文g配置pȝ中一些方面的包含情况?/P> <P><A name=IDA02JSB><span id="yi4kcac" class=atitle3>JBoss AOP</SPAN></A><BR>JBoss AOP Z XML 的方面来声明风格Q如?4 所C。JBoss 也支持与?3 所C相似的注释风格。在 XML 风格中,斚w、切入点和通知声明都以 XML 形式表示的。通知的实玎ͼ用的是普通的 Java Ҏ(gu)Q由 JBoss AOP 框架调用。切入点和切入点到通知的绑定都在方面中?XML 注释声明。JBoss 没有昑ּ地绑?<CODE>Account</CODE> 参数Q而是提供?jin)对当前正在执行的对象的反射讉KQ因此需要把cd转换到对应的cd。注意,卛_发布?JBoss ?x)提供一些静(rn)态类型的切入点参数来解决q一问题?/P> <P><A name=figure4><B>?4. JBoss AOP 的方?</B></A><BR><IMG height=364 alt="" src="http://www-900.ibm.com/developerworks/cn/java/j-aopwork1/figure-jboss.gif" width=588 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P> <P>?JBoss 构徏斚w只包括普通的 Java 构徏。JBoss AOP 的运行时截取框架Qinterception frameworkQ负责管理切入点匚w和通知调用。需要对启动和类路径做一些配|,但是 JBoss AOP ?IDE 插g替用户做?jin)这些工作。方面在 jboss-aop.xml 文g中配|?/P> <P><A name=IDAR3JSB><span id="o4ocecy" class=atitle3>Spring AOP</SPAN></A><BR>查看?5 中的 Spring AOP CZӞ可以注意到其中的 XML 比前面介l的技术多。与 JBoss AOP cMQSpring 的通知实现是带有特D参数的 Java Ҏ(gu)Q由 Spring 框架调用。XML 描述 <CODE>accountBean</CODE>QSpring 框架通过它访?<CODE>Account</CODE> 对象Q包括通知使用的拦截器 <I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">advisor</I> ?qing)其匚w模式Q还有应用到模式?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">向前QbeforeQ?/I> 通知?/P> <P><A name=figure5><B>?5. Spring AOP 的方?</B></A><BR><IMG height=579 alt="" src="http://www-900.ibm.com/developerworks/cn/java/j-aopwork1/figure-spring.gif" width=584 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P> <P>Spring AOP 的技术虽然提供了(jin)更加_的配|,但在它用于 XML Ӟ它与 JBoss AOP 非常cM。构建、运行和配置 Spring AOP 斚w的过E与 JBoss AOP 相同Q但 Spring AOP 依赖的是 Spring 框架方便的、最化的运行时配置Q所以不需要独立的启动器。请注意Q用这个技术,只能通知?Spring 框架(g)索出的对象?/P> <P><A name=IDAQ4JSB><span id="cuw22ye" class=atitle2>语法差异</SPAN></A><BR>正如上面的图所展示的,AOP 工具之间的关键差异就是处理方面声明的方式。AspectJ ?Java 语言的扩展,用它可以完全在代码中Ҏ(gu)面进行声明。AspectWerkz ?JBoss AOP 支持用方面元数据?Java 代码q行注释Q或者在独立?XML 文g中对斚wq行声明。在 Spring AOP 中,则完全用 XML Ҏ(gu)面进行声明。所以,在三U不同的技术中Q对斚wq行~程的感觉可能非怸同。用 AspectJ ?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">代码风格</I>Q方面和切入点声明感觉v来就?Java 代码。而用 JBoss AOP ?AspectWerkz ?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">注释风格</I>Q感觉v来就像在现有 Java 元素上做的附加标{。而用 Spring AOP 风格Q以?AspectWerkz ?JBoss AOP ?<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">XML 风格</I> Ӟ感觉像使用独立的声明?XML 语言?/P> <P>每种技术都有它的优势,具体要由使用者决定哪个更适合需求。所以在q一节,简要地讨论一些能够有助于q行决策的要炏V?/P> <P><A name=IDA44JSB><span id="aa2qsi4" class=atitle3>自己的风格是什么?</SPAN></A><BR>不管选择哪个 AOP 工具Q用通知M时只涉及(qing)C?Java 代码。如果需要修改切入点Q那么区别是非常透明的。在使用 XML 风格Ӟ像?Spring AOP 中)(j)Q修改切入点包括Q从通知扑ֈ XML 文g中对应的切入点声明。从正面来说Q这Ҏ(gu)术把切入点和斚w配置的工作全都局限于本地Q但是如果要~辑许多通知和切入点Q而且要在 Java ?XML 之间重复地翻来覆去,那么q项工作׃(x)变得很繁琐?/P> <P>如果使用 AspectWerkz ?JBoss AOP 提供的注释风|那么可以把切入点的表达g XML 转移?Java 成员的注释。这样可以更Ҏ(gu)地ƈ发处理通知体和切入炏V如果选择?AspectJ 的代码风|那么׃(x)发现处理切入Ҏ(gu)觉就像处理代码,而不像是处理非结构化的字W串倹{从 Java 代码能得到的一切(例如“import”语句)(j)Q都可以用于切入炏V对比之下,如果?AspectWerkz、JBoss AOP ?Spring AOP ?XML 和注释风|L需要在规范切入点中的类型引用?/P> <P><A name=IDAF5JSB><span id="w2immua" class=atitle3>z还是繁琐?</SPAN></A><BR>斚w声明的风格对每个工具中用的斚w有很大的影响。例如,支持?XML 中声明方面的工具Q也支持在同一 XML 文g中对斚w应用到系l的方式q行配置。在前面的小节中Q只展示?jin)切入点和方面声明,但是cd间声明同样受到风格选择的媄(jing)响。在 AspectJ 中,cd间方法声明看h像正常的方法声明,引用的技术也一栗而在其他技术中Q则要指定一个类Q扩展额外的混合cdƈl承那些额外的成员,通过注释?XML d新方法。注意,目前 AspectJ 是惟一提供使用切入点的?rn)态强制机制的工具。表 2 比较?jin)这些工具?AOP 语法的关键元素的处理技术?/P> <P><A name=table2><B>?2. 比较领先?AOP 工具中的语法</B></A><BR><IMG height=122 alt="" src="http://www-900.ibm.com/developerworks/cn/java/j-aopwork1/table-syntax.gif" width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P> <P>昄Q从?2-5 的方面声明来看,代码风格是处?AOP 声明最z的技术。它不需要对通知命名Q也不需要显式地调用通知。代码风g需要显式地把通知l定到切入点Q就?XML 风格那样Q,也不需要把通知l定?<CODE>return</CODE> 语句Q这?AspectWerkz 的切入点“方法”所需要的Q。对于可以在 <A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?3</A> ?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?4</A> ?XML 中看到的复杂设计QAspectJ ?Java 语言q行的语法扩展允许直接表C些设计。用 AspectJ ~写斚wQ感觉v来更像是~写 Java 代码Q避免了(jin)冗余的键入,因此出错也就更少。从不好的一面来_(d)Java 的语法扩展代价巨大,而注释和 XML 风格有它们独特的优势。最明显的就?XML 风格可以控制切入点和通知的绑定。这对于扩展和配|方面非常有益,在下面一节中讨点以?qing)不同风格带来的其他优缺炏V?/P> <P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">代码风格与注释和 XML 的比?/B><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">那么Q应当采用代码风|q是用注释或 XML 声明斚w呢?以下是基?AspectJ ?Java 代码的一些技术的优缺Ҏ(gu)ȝQ?/P> <UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <LI>明语法充分利用对 Java 代码的熟(zhn),减少键入错误Q错误更少? <LI>切入Ҏ(gu)一U实体,因此更容易对它们q行处理? <LI>对于许多开发h员,?XML q行声明性编E要比用 Java 语言扩展更熟(zhn)? <LI>通知到切入点的绑定不能由开发h员控制?/LI></UL> <P>如果q个结仍然无法~小决策范围Q那么不要担?j)。除?jin)用每种风格~写q些斚w的感觉之外,q有更多需要考虑的东ѝ当在下一节中查看语义的时候,语法决策q(sh)(x)出现Q而且也会(x)影响在第 2 部分中讨论的工具支持?/P> <P><A name=IDASAKSB><span id="44oieca" class=atitle2>语义的相似?/SPAN></A><BR>虽然工具的方面声明风g间存在主要的语法差异Q但是核?j)?AOP 语义是类似的。每个工具都有完全相同的q接Ҏ(gu)型的概念Q都把连接点作ؓ(f) Java E序中的关键点,把切入点作ؓ(f)匚wq接点的机制Q把通知作ؓ(f)指定q接点匹配时执行操作的机制?/P> <P><A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?3</A> ?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?4</A> ȝ?jin)每U技术的语义。?zhn)可以注意刎ͼ命o(h)规范上有许多微小的差异和变化Q但是各U技术最l聚合在相同的核?j)概念上。这U聚合有很大的好处,因ؓ(f)q意味着学习(fn)曲线很容易从一?AOP 技术{Ud另外一?AOP 技术。剩下来要考虑的就是每U技术的差异所带来的优劣了(jin)?/P> <P><A name=IDABBKSB><span id="o4segma" class=atitle3>回到q接?/SPAN></A><BR>一?AOP 工具q接Ҏ(gu)型的表达方式军_?jin)可用的q接点粒度,以及(qing)q接点如何匹配。每?AOP 工具都提供了(jin)大量用于q接点匹配的原生切入炏V有些原生切入点只与特定cd的连接点匚wQ例如,Ҏ(gu)执行Q。其他切入点能够Ҏ(gu)q接点的公共属性(例如Q在某个控制程中的所有连接点Q匹配Q何类型的q接炏V连接点的类型以?qing)它们特定的切入点,可以分成以下几组Q?/P> <UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <LI><B>调用QInvocationQ?/B>—?调用或执行方法和其他代码元素时的炏V?BR><BR> <LI><B>初始化(InitializationQ?/B>—?初始化类和对象时的点?BR><BR> <LI><B>讉KQAccessQ?/B>—?d某些字段时的炏V?BR><BR> <LI><B>异常处理QException handlingQ?/B>—?抛出和处理异怸错误时的炏V?BR><BR></LI></UL> <P>另外Q也支持以下没有cd的切入点分类Q?/P> <UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <LI><B>控制程QControl flowQ?/B>—?在某个流E控制流E中的连接点?BR><BR> <LI><B>包含QContainmentQ?/B>—?与包含在某个cLҎ(gu)中的代码位置对应的连接点?BR><BR> <LI><B>条gQConditionalQ?/B>—?特定预测为真的连接点?/LI></UL> <P>如表 3 所C,每个工具实现q接Ҏ(gu)型的方式Q以?qing)它们用来匹配连接点的原生切入点Q都略有差异。注意,在某些情况下Q在括号中表C)(j)Q连接点不用切入Ҏ(gu)识?/P> <P><A name=table3><B>?3. q接点和用来匚wq接点的原生切入?/B></A><BR><IMG height=258 alt="" src="http://www-900.ibm.com/developerworks/cn/java/j-aopwork1/table-pointcuts.gif" width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P> <P><A name=IDAXCKSB><span id="2mw4kk4" class=atitle3>要富于表现力q是要简单?</SPAN></A><BR>在这里主要的优劣在于富于表现力和单性的比较。更加完整和_的切入点集合允许通过斚w讉KE序执行中更多有的炏V例如,与持久性有关的斚w可能需要访问对象的初始化连接点。但是这cd整性也?x)带来额外的复杂性和更陡峭的学习(fn)曲线。许?Java E序员ƈ不区分调用和执行Q而且没有几个人需要理解初始化的微妙之处。而且许多常用的方面被当作是辅助性的Q所以是否有表现力与应用E序的功能ƈ没有紧密耦合。在常用的辅助性方面,例如监视和日志,通常只利用了(jin)_粒度的切入点(例如Ҏ(gu)执行Q。从反面来看Q更q泛的切入点集合实具备量入为出的属性,因ؓ(f)切入点可以边用边学。如果不想用切入点制作程序,那么?x)造成面向对象代码的强刉构,例如Q以 <CODE>init()</CODE> Ҏ(gu)的Ş式公开cȝ初始化?/P> <P>AspectJ ?AspectWerkz 的连接点模型差不多完全融合,而且已经成ؓ(f)最q的合ƈ的关键促(j)q者之一。JBoss AOP 模型几乎同样有表现力Q只是ؓ(f)?jin)简单性而遗漏了(jin)一些不太常用的q接炏V一个明昄差异是:(x)?JBoss Aop 中,不能把控制流E表C成“在q个切入点的执行之下的所有连接点”。相反,E序员需要手动列?gu)用堆栈中的每个调用?/P> <P>Spring AOP 采用?jin)不同的技术,目的是限制它的连接点模型的表现力。这使它特别Ҏ(gu)采用Q而且对于一些粗_度的横切很有用。即发行的版本与 AspectJ 集成Q提供与_横切机制的互操作性?/P> <P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">q接Ҏ(gu)型的表现力与单性的比较</B><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><BR xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">一些项目可以从更有表现力的q接Ҏ(gu)型(例如 AspectWerkz、AspectJ ?JBoss AOP 提供的)(j)L(fng)Q所以最好还是采?Spring AOP _粒度的方便性?以下是更有表现力的模型固有优~点的一个ȝQ多考虑一下这些方面会(x)Ҏ(gu)有所帮助Q?/P> <UL xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"> <LI>?jin)解更多知?? <LI>对于_粒度的横切和辅助性方面,只需要很的切入炏V? <LI>没有_的切入点Q许多方面就不能表达? <LI>使用新切入点的学?fn)曲U是随用随学?/LI></UL> <P><A name=IDAODKSB><span id="w2u42om" class=atitle2>语言机制</SPAN></A><BR>我将用每U技术语a机制的详l对比结?AOP 工具比较的第一部分的讨论。表 4 ?4 个工L(fng) AOP 语言的概括。下面讨Z(jin)最明显的区别?/P> <P><A name=table4><B>?4. 领先?AOP 工具的语义概?/B></A><BR><IMG height=275 alt="" src="http://www-900.ibm.com/developerworks/cn/java/j-aopwork1/table-semantics.gif" width=600 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"></P> <P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">切入点匹配和复合</B>QAspectJ、AspectWerkz ?JBoss AOP 提供?jin)类似的cd模式支持。它们三个都允许{֐斚w的匹配,对于 Java 5 应用E序来说Q这些匹配包括注释和泛型。AspectJ ?AspectWerkz 提供?jin)一U简z的引用多个cd的技术(例如 <CODE>Account+</CODE> 表示帐户的所有子cdQ。所有的工具都支持通配W匹配。Spring AOP q提供了(jin)Ҏ(gu)则表辑ּ的支持。虽然这看v来可能是一个强大的优势Q但q是要指出其他技术已l选择?jin)放弃正则表辑ּQ好让切入点读v来不是太难,同时不会(x)存在潜在的损実뀂切入点复合操作W基本上都是相同的。Spring AOP 不提供“非”操作,q个操作通常与没有在 Spring AOP q接Ҏ(gu)型的容器QcontainmentQ连接点l合使用?/P> <P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">通知形式</B>QAspectJ 支持比其他技术更多的通知形式Q?JBoss AOP 只支持一U通知形式。每U通知形式都可以表达成 <CODE>around</CODE> 通知Q所?JBoss 的技术是无限的,而且它确实提供了(jin)额外的简单性。不好的一面是它损׃(jin)z性,q一点可以从需要进行额外的调用才能l箋(hu)执行原来的方法调用(?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?4</A> 所C)(j)看得出来Q而如果用 <CODE>before</CODE> q行通知Q这一点就是不必要的。还h意,通知去遵守普通的 Java 规则Q就像注释和 XML 风格做的那样Q,在一些情况下Ҏ(gu)出问题,因ؓ(f)q些规则是ؓ(f)Ҏ(gu)设计的。AspectJ 拥有把被通知Ҏ(gu)的异常“Y化”的能力Q这很有用,但是不符合方法异常检的标准语义?/P> <P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">q接点上下文</B>Q在 AspectJ ?AspectWerkz 中,通过指定和绑定切入点参数讉K动态连接点的状态,cM于在 Java 语言中声明方法参数的技术(请参?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?2</A> ?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">?3</A>Q。这接点上下文提供了(jin)?rn)态类型化的好处。JBoss AOP ?Spring AOP 反射性地讉Kq接点的状态,q消除了(jin)在切入点表达式中参数l定的复杂性,代h(hun)是参数静(rn)态类型化。Java E序员(sh)(fn)惯了(jin)Ҏ(gu)参数?rn)态类型化带来的好处,同时q可以从切入点参数的?rn)态类型化得到同样的好处。所以,?JBoss AOP 最q的发行版本中,有提供静(rn)态类型化的“args?的计划?/P> <P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">实例?/B>Q在所有的工具中,斚w的实例化是由 <CODE>per</CODE> 子句控制的。正如所料,Spring AOP 的实例化模型更简单。对于额外的实例化机制的支持Q则意味着可以把方面编写成只能应用于特定的动态上下文环境中,不用~写代码保存q个上下文ƈ试其他斚w是否该应用这个方面。主要的区别因素?AspectJ 支持在每个控制流E进行方面初始化QAspectWerkz 支持每个U程的初始化Q?JBoss 则支持每个连接点的初始化。哪U最有用则取决于具体的需求?/P> <P><B xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">扩展?/B>Q方面的扩展性支持库斚w的部|Ԍq样可以在日后ؓ(f)特定E序而将q些库方面具体化。例如,一个方面库可以提供应用E序监视需要的全部逻辑和基设施。但是,要采用某个特定项目的库,那么库用的切入点必L展成应用E序特定的连接点。AspectJ 用抽象方面支持扩展性,抽象斚w包含抽象的切入点和具体的通知。扩展抽象方面的子方面必d体化切入炏VAspectWerkz ?JBoss AOP 使用?jin)完全不同的技术,没有使用抽象切入Ҏ(gu)制。扩展是通过生成斚w的子cRƈ?XML 中或通过注释定义新的通知l定而实现的。切入点到通知的显式绑定ؓ(f) AspectWerkz ?JBoss AOP 提供?jin)显著优势,从而可以很Ҏ(gu)地把斚w扩展到新pȝQ无需要生成子cR方面库的用数据正在日益增多,q些决定与其他技术用的 Java 风格的承和切入点绑定相比,AspectJ Ҏ(gu)?AOP l承形式是更好还是更差?/P> <P>每项技术在处理 AOP 的语a机制Ӟ都提供了(jin)自己独特的优~点。用一个简单的列表来ȝq些优缺Ҏ(gu)不可能的Q因为对于不同的目Q每Ҏ(gu)术的好处是各不相同的。但是,以上信息为选择工具或者遇到关键问题时L替代品提供了(jin)指南?/P> <P><A name=IDALFKSB><span id="gwqu4m4" class=atitle2>l束?/SPAN></A><BR>为项目选择一?AOP 工具所面(f)的难题在于比较每U工L(fng)优劣Q同时不要让自己q失其中。AOP工具比较的第一部分?4 U领先的 AOP 技术的核心(j)机制QƈҎ(gu)?jin)它们的怼与不同之处?/P> <P>如果本文是在十年之前报道一Ҏ(gu)的模块化技术,那么我们可能此打住Q开始用自己选择的风格来~写斚w —?可能是在命o(h)行用 Emacs 或其他文本编辑器构徏。但是今天,如果没有深入研究一Ҏ(gu)技术如何与现有的开发环境和其他工具集成Qh们是不会(x)L地考虑采用它的?/P> <P>所以,<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">本文的第二部?/A>把重Ҏ(gu)在集成因素对 AOP工具选择的媄(jing)响。在其他因素之中Q将讨论每个工具如何处理斚w的编译与设计Q以?qing)如何依?IDE 集成与工h持将它们都组合在一赗我q(sh)(x)比较q些工具的基本特性,看看它们背后到底是什么,包括q一步探?AspectJ ?AspectWerkz 目合ƈ之后我们可以期盼从中得到什么?/P> <P><A name=resources><span id="uuqsci2" class=atitle2>参考资?</SPAN></A> <UL> <LI>(zhn)可以参阅本文在 developerWorks 全球站点上的 <A target=_blank xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">英文原文</A>?BR><BR> <LI>请参?<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">AOP@Work</I><A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">AOP Tool comparison, Part 2: Development environments</A>QdeveloperWorks,2005 q?2 月)(j)Q在文中Q作者重点介l了(jin)与开发环境的工具集成和构E?BR><BR> <LI>误至第 2 部分Q这一部分介绍 IDE 集成Q?A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Develop aspect-oriented development with Eclipse and AJDT</A>QdeveloperWorksQ?004 q?9 月)(j)?BR><BR> <LI>Eclipse.org 中包含关?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">AspectJ and AspectWerkz joining forces</A> 的最新发布版本?BR><BR> <LI>请参?Eclipse ProjectQ学?fn)更多关?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">AspectJ</A> 的知识?BR><BR> <LI>Codehaus 中包含关?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">AspectWerkz</A> 的信息?BR><BR> <LI>要学?fn)更多关于JBoss AOP 的内容,请参?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">JBoss</A>?BR><BR> <LI>Spring 框架?Web 站点中包括关?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Spring AOP</A> 的信息?BR><BR> <LI>要学?fn)更?Java q_?AOP 的基知识Q请?Nicholas Lesiecki 撰写?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Improve modularity with aspect-oriented programming</A>QdeveloperWorksQ?002 q?1 月)(j)开始?BR><BR> <LI>?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">A look at aspect-oriented programming</A>Q?I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">The Rational Edge</I>Q?004 q?1 月)(j)中,Gary Pollice 用一个登录示例介l了(jin) AOP 的基本概c(din)?BR><BR> <LI>本文中用的 <CODE>Account</CODE> CZ最初出现在 Ramnivas Laddad 撰写?<I xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><A >AspectJ in Action</A></I>QManningQ?003 q_(d)(j)?BR><BR> <LI>?1 中的用户基数调查是以最初显C在 <A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">aosd.net</A> 上的信息为基Q这些调查数据也是每q召开?Aspect-Oriented Software Development ?x)议所使用数据的来源?BR><BR> <LI>?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"><I>developerWorks</I> Java 技术专?/A>可以扑ֈ数百有?Java 各个斚w的技术文章?BR><BR> <LI>请参?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Developer Bookstore</A>Q以获得技术书c的完整清单Q其中包括数百本 <A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">Java 相关主题</A>的书c?BR><BR> <LI>q请参阅 Java 技术专区,?developerWorks 那里获得侧重?Java 的免?<A xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">教程</A>的完整清单?BR></LI></UL> <P></P> <TABLE cellSpacing=0 cellPadding=0 width="100%" border=0> <TBODY> <TR> <TD><A name=author1></A><span id="kqk4yus" class=atitle2>关于作?/SPAN><BR>Mik Kersten 是一的面向斚w的编E专Ӟ也是 AspectJ ?AJDT eclipse.org 目的参与者。作?Xerox PARC 的研I科学家Q他?AspectJ 构徏?IDE 支持。他正在不列颠哥伦比亚大学攻d士学位,他的主要工作是 IDE 更加面向斚w。他也向构徏开发工L(fng)公司提供咨询Q帮助公司利用、支持面向方面的~程技术?/TD></TR></TBODY></TABLE><BR clear=all></TD></TR></TBODY></TABLE><img src ="http://www.tkk7.com/jinfeng_wang/aggbug/1989.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/jinfeng_wang/" target="_blank">jinfeng_wang</a> 2005-03-13 16:18 <a href="http://www.tkk7.com/jinfeng_wang/archive/2005/03/13/1989.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item></channel></rss> <footer> <div class="friendship-link"> <p>лǵվܻԴȤ</p> <a href="http://www.tkk7.com/" title="亚洲av成人片在线观看">亚洲av成人片在线观看</a> <div class="friend-links"> </div> </div> </footer> վ֩ģ壺 <a href="http://www-01313.com" target="_blank">ҹƷ߹ۿ</a>| <a href="http://wwwbu610.com" target="_blank">91߹ۿ</a>| <a href="http://tjbdyx.com" target="_blank">޾Ʒ˳߹ۿ</a>| <a href="http://gtja1668.com" target="_blank">߾ƷƵѹۿ</a>| <a href="http://27simnjingmiguan.com" target="_blank">޳ɫwwwþվҹ</a>| <a href="http://changfafangzhi.com" target="_blank">avëƬһ</a>| <a href="http://zjszbwzl.com" target="_blank">ղþǿѵĿ</a>| <a href="http://xdxdl.com" target="_blank">޹ƷԲӰ</a>| <a href="http://sdzsks.com" target="_blank">椸ѹۿƵ</a>| <a href="http://416164.com" target="_blank">Ůһһ鴤Ƶ</a>| <a href="http://zhongxueping888.com" target="_blank">ŷ޹ۺ</a>| <a href="http://343dd.com" target="_blank">պĻպ</a>| <a href="http://s8sb.com" target="_blank">˿Ƶ</a>| <a href="http://bd0574.com" target="_blank">պëƬһƵ</a>| <a href="http://szgreater.com" target="_blank">þ޹ƷAVϼ</a>| <a href="http://9akk.com" target="_blank">AƵվ</a>| <a href="http://dodxs.com" target="_blank">һƷһavһˬˬ</a>| <a href="http://kkjk123.com" target="_blank">av뾫Ʒۺ </a>| <a href="http://www5xsq.com" target="_blank">Ƶ߹ۿƵ</a>| <a href="http://89kino.com" target="_blank">ѹۿƵ</a>| <a href="http://rushiruhua.com" target="_blank">Ƶ߹ۿ</a>| <a href="http://arkinbokis.com" target="_blank">ŷëƬAƵ޷</a>| <a href="http://beidemei.com" target="_blank">99Ƶ99߹ۿ</a>| <a href="http://516698.com" target="_blank">ɫëƬѹۿ</a>| <a href="http://nblfkj.com" target="_blank">޹bvվ</a>| <a href="http://sxgzjssb.com" target="_blank">޾ƷŮþ777777</a>| <a href="http://glgg99.com" target="_blank">Ƶ97</a>| <a href="http://2266511.com" target="_blank">ѳ˸Ƶ</a>| <a href="http://87fulitv.com" target="_blank">a߹ۿƵ</a>| <a href="http://0415ss.com" target="_blank">ձ޸߹ۿ</a>| <a href="http://c2277.com" target="_blank">޾ƷƬ</a>| <a href="http://siqingsizu.com" target="_blank">þþþޱٸ</a>| <a href="http://fshomppa.com" target="_blank">ŮƵ</a>| <a href="http://zhaosifuwang.com" target="_blank">պ伤Ƶ߲ </a>| <a href="http://www-63228.com" target="_blank">AVһDV</a>| <a href="http://my77789.com" target="_blank">ᰡͣѿ</a>| <a href="http://shmtweld.com" target="_blank">ݽվƵ</a>| <a href="http://mychjp.com" target="_blank">͵Ƶѹۿ</a>| <a href="http://773311h.com" target="_blank">AëƬëƬ</a>| <a href="http://66661660.com" target="_blank">һ߹ۿ</a>| <a href="http://txtmp3.com" target="_blank">AVɫ߹ۿ</a>| <script> (function(){ var bp = document.createElement('script'); var curProtocol = window.location.protocol.split(':')[0]; if (curProtocol === 'https') { bp.src = 'https://zz.bdstatic.com/linksubmit/push.js'; } else { bp.src = 'http://push.zhanzhang.baidu.com/push.js'; } var s = document.getElementsByTagName("script")[0]; s.parentNode.insertBefore(bp, s); })(); </script> </body>