日期:2014-05-16 浏览次数:20900 次
面向方面编程(AOP)可用来解决当今的
许多
应用需求。其中,
Eclipse基金的AspectJ
是
其中一个比较流行的AOP实现。刚开始使用AspectJ时,可能会让初学者望而怯步。在AJDT项目的领导者——Matt
Chapman的一篇新文章中,展示了如何通过使用Eclipse的AJDT插件来使AspectJ开发变得更为容易。更多关于AspectJ的信息可以
从
InfoQ的AspectJ标签
找到。
AOP词汇表
AOP,Aspect-oriented programming:面向方面编程
Core concerns:核心关注点,
Crosscutting concerns:横切关注点
Aspect:方面
Advice:通知
Pointcut:切入点
Weave:织入
Joinpoint:联结点
如果你正在进行AspectJ开发而且还没有使用Eclipse AspectJ开发工具(AspectJ Development Tools,AJDT)的话,本文会告诉你错过了什么好东西。即使你以前用过AJDT,你也能从本文中看到一些以前不知道的特性。
越来越多的开发者正逐渐变得更加依赖功能强大的IDE。毫无疑问,人们大都还记得用Emacs或Vi编程的日子(我敢打赌有些人还在这样做),但对 不少开发者来说,像上下文助手这样的功能已经变得必不可少了——如果不用IDE你就无法写出像样的应用程序,那么你显然就是control-space一 族了(control-space是Eclipse上下文助手功能的快捷键)。
在AspectJ这样的语言里,面向方面编程提供了强大的能力并改善了模块性,但是如果没有合适的工具将会减弱程序的易理解性。当然,你可以通过察 看各个单独的Java代码来在一定程度上理解它要做什么,但是如果使用AspectJ,就会用到一些advice,那么你就可能看不到程序的全貌了。对于 普通的Crosscutting concerns(例如跟踪功能),对该concerns一无所知也没什么关系,但对于像安全或领域特有的concerns就不同了,因为它们可能是应用 程序的核心。因此,IDE支持AOP比支持OOP对程序开发的帮助更大。
通过这篇文章,我们将探究AJDT的一些特性,以展示该工具如何使你从AOP方法里获得更高的效率及更大的收益。
让我们从Java代码在普通编辑器中的样子开始吧:
现在,我们把这段代码放在Eclipse Java编辑器中比较一下:
除了语法着色外,还有个主要区别,就是编辑器左右边框上的标记。右边框上的小方块是概览标记,其用途是表示左侧边框上的标记(所在行)在整个源文件中所处的位置(而且通过鼠标左键点击小方块可以定位到该位置)。左侧的标记是advice标记,表示受到before ( ),after ( )或 around ( ) advice影响的源码位置。
从上面的截屏可以看到,在paint()方法里有两行代码受到了before advice的影响。paint()方法本身的执行也受到某advice的影响。普通advice标记图标( )表示该位置的代码同时受多种advice的影响。
如果鼠标在标记上稍作停留,将会弹出一个含有更多信息的tooltip(工具提示),你也可以用鼠标右键点击该标记弹出一个"Advised By"菜单,使用该菜单可以导航到对应的advice定义处。上图中结合点标记处( )有两个"Advised By"菜单入口,说明该方法受到了before和after两个advice的双重影响,如下图所示:
AspectJ是对Java的扩展,Eclipse惯例是在.java文件中保持纯java代码(即使在AspectJ项目中也是这样),而 用.aj文件来存放AspectJ特有代码。比如,新的aspect将被创建在.aj文件中。这意味着Java编辑器默认还是用于.java文件,而 AspectJ编辑器是用于.aj文件的。由于AspectJ编辑器是从Java编辑器扩展而来的,因此它也可用于Java代码。
这里是一个用AspectJ编辑器打开的acpect:
AspectJ编辑器表现AspectJ代码的方式被设计成与Java编辑器表现Java代码的方式相同。例如语法着色被扩展到了像 execution,around和proceed这样的AspectJ关键字上。其他的编辑操作方式都是一样的,比如Organize Imports,Add Import,和Format。(这三者都是Eclipse Java编辑器的功能。Organize Imports:可以根据代码中所引用的类自动增加缺少的import语句或删除多余的import语句;Add Import:增加缺少的import语句;Format:可以对代码书写风格进行自动整理)
上下文助手(也叫做代码补全——Code Completion)的重要性前面已经提到了。AspectJ编辑器在aspect所定义的方法内及advice代码块内(语法上类似于方法)提供了基 于Java的代码完成功能。你可以用下面的操作依据advice参数补全代码:
在上图光标位置按下Control-Space键,编辑器会给出一个选择列表,其中包含了:局域变量、advice参数mon和ticks、 AspectJ特有变量thisJointPoint和thisJointPointStaticPart、一个aspect的静态私有属性 monitorMap、以及继承自Object的方法。
Aspect也可以代表其他类声明其属性和方法。这就是众所周知的intertype declarations(这是一种功能强大的机制,利用它可以在原有类或接口的外部增加其属性或方法),且需要不同的上下文助手完成:
这儿的aspect代码片断是为Point类定义了一个叫做hasListeners的方法。在图示的位置上,代码补全功能提供的是在Point类的上下文中,而非所在asp