Update sites to visit Select update sites to visit while looking for new features Sites to include in search a e]The Eclipse Project Updates cal sit Nane: AJDT v Ignore features not applicable to this environment Next 图5-8使用 Eclipse自动更新功能来添加AJDT 插件安装完成后,会要求重启动,启动后即会在 Eclipse的【 Preferences】面板中,即 会看到一个【 AspectJ Compiler】的选项 插件安装完后,即可以直接在 Eclipse新建建立 Aspect.项目,如“图5-9”,或者把 个已有的项目转为 AspectJ项目,使得项目中可以支持 Aspect语法,并具具有可视化的切 面信息标识,帮助我们更好的使用 AspectJ进行AOP编程
图 5-8 使用 Eclipse 自动更新功能来添加 AJDT 插件安装完成后,会要求重启动,启动后即会在 Eclipse 的【Preferences】面板中,即 会看到一个【AspectJ Compiler】的选项。 插件安装完后,即可以直接在 Eclipse 新建建立 AspectJ 项目,如“图 5-9”,或者把一 个已有的项目转为 AspectJ 项目,使得项目中可以支持 AspectJ 语法,并具具有可视化的切 面信息标识,帮助我们更好的使用 AspectJ 进行 AOP 编程。 14
Select a wizard Create an AspectJ Project 置 izard type filter te s Java Project from Exi sting Ant Buildfile KY Plugin Project 冒 eb Service Projec H-c General 日 ②AsPe 4-C Aspect Examples +]C AspectJ Plugin Examples +C CvS jAVa 厂 Show A1 Wizards <Back Next inish Cancel 图59AJDT安装成功后可用 Eclipse来建立 Aspect Project 524 AspectJ版的 Hello world 下面演示在 Eclipse中建立 Aspect版本 Hello World,首先需要安装 AspectJ的 Eclipse 插件AJDT。然后新建一个 Aspect工程,如“图5-9”,然后新建一个demo,Hel类,内容如 package demo i public class Hello t public void sayHello () System. out. println("Hello AspectJ! " public static void main(String[] args) i h sayHello () 然后使用使用 Eclipse新建一个名为 HelloAspect的 Aspect切面,如“图5-10”所示
图 5-9 AJDT 安装成功后可用 Eclipse 来建立 AspectJ Project 5.2.4 AspectJ 版的 HelloWorld 下面演示在 Eclipse 中建立 AspectJ 版本 HelloWorld,首先需要安装 AspectJ 的 Eclipse 插件 AJDT。然后新建一个 AspectJ 工程,如“图 5-9”,然后新建一个 demo.Hello 类,内容如 下: package demo; public class Hello { public void sayHello() { System.out.println("Hello AspectJ!"); } public static void main(String[] args) { Hello h=new Hello(); h.sayHello(); } } 然后使用使用 Eclipse 新建一个名为 HelloAspect 的 Aspect 切面,如“图 5-10”所示。 15
Create a new Aspect Creates a new aspect within the current project @ Source folder spectj-demo Browse sing tYp Browse HelloAspect Modifiers public C default C private C protected 厂 privilege C issingleton C C pertarget 厂 Instan C perch C peraflowbelow C pertypewith Inter faces Add Which stubs would you like to create? public static void main(String[] ar V Inherited abstract pointcut Do you want to add comments as configured in the properties of the current project? 厂 Generate comments 图5-10在 Eclipse中新建 Aspect切面 在 HelloAspect中定义了一个名为 somePointcuto的切入点,定义了两个增强,其中一个 是在连接点前执行,一个是在连接点后执行。He1 asPect的全部代码如下所示 package demo public aspect HelloAspect i pointcut somePointcut(): execution(* Hello. sayHello())i System.out. println("要准备说He11o了..") after(: some Pointcut(i System. out. print1n("He11o已经说完! 在Hllo上点右键,使用【 Run as】→>【 Java Application】运行Hl,即会看到程序输 出结果,如“图5-11”所示
图 5-10 在 Eclipse 中新建 AspectJ 切面 在 HelloAspect 中定义了一个名为 somePointcut()的切入点,定义了两个增强,其中一个 是在连接点前执行,一个是在连接点后执行。HelloAspect 的全部代码如下所示: package demo; public aspect HelloAspect { pointcut somePointcut():execution(* Hello.sayHello()); before():somePointcut(){ System.out.println("要准备说Hello了..."); } after():somePointcut(){ System.out.println("Hello已经说完!"); } } 在 Hello 上点右键,使用【Run As】->【Java Application】运行 Hello,即会看到程序输 出结果,如“图 5-11”所示。 16
project MyEelinse Bun Ioseat Lindow yelp 2·恩扇」·0··四出G·园s H Package Bx ‰lj 日t-am a Hallas aspect He execution(·Hell0. JayE11。 syatem,ou, print1n(“要作备说He110了,,") ytem,ou,pr⊥n1n("Be11o已经说完 Hells o7 " APplextian C: trego liuma ird s o l ale D. cs He11o已经说完了 开w画a”|画5 Interaat kepler,图深入m第五章,1-lk 图5-11 Aspect版Hel的项目总体图 525 AspectJ中相关语法 前面说了,AOP主要用来解决软件中交叉关注点的问题,AOP实现要把交叉关注点的 切面模块与系统的其他关注点进行组合,即把处理交叉关注点的功能按照一定规则或策略织 入到核心关注点的模块中。这里“一定规则”是指什么,怎么来描述?这正是AOP实现的 关键所在。在 Aspect中,通过一套完整的语言定义规范,来灵活、清晰地定义、描述这个 织入过程中的“一定规则”。而我们程序员使用 AspectJ,也就是只需要掌握 Aspect的语言 规范,然后按照规则写出适合我们的实际应用程序需求的“织入规则”,最后交给 AspectJ 的编译器负责按照这些织入规则及策略来把位于切面中处理交叉关注点的模块与其他关注 点的模块组合到一起,即可实现灵活、复杂的软件功能。 我们首先来看 AspectJ中的关于AOP一些概念的定义及表示方法 ■切面( Aspect 在 AspectJ中,切面封装了切入点、通知及通知的实现代码,切面中还可以声明改变 个类的继承关系、给一个类添加属性、方法、构造函数,指定一个现有类实现一个接口等等 切面是一个独立的模块单元,跟普通的java类一样,切面中还可以定义自己属性、定义方 法。一个切面一般写在一个以a为扩展名的文件中,切面的定义根据 AspectJ切面初始化的 方式及生命周期的不同,有如下几种形式: Modifier aspect aspectName(.j Modifier aspectaspect Name issingleton(i.j modifier] aspect aspectName perthis( Pointcut)(.j [modifier] aspect aspectName pertarget( Pointcut)( Modifier] aspect aspectName perflow(Pointcut)i
图 5-11 AspectJ 版 Hello 的项目总体图 5.2.5 AspectJ 中相关语法 前面说了,AOP 主要用来解决软件中交叉关注点的问题,AOP 实现要把交叉关注点的 切面模块与系统的其他关注点进行组合,即把处理交叉关注点的功能按照一定规则或策略织 入到核心关注点的模块中。这里“一定规则”是指什么,怎么来描述?这正是 AOP 实现的 关键所在。在 AspectJ 中,通过一套完整的语言定义规范,来灵活、清晰地定义、描述这个 织入过程中的“一定规则”。而我们程序员使用 AspectJ,也就是只需要掌握 AspectJ 的语言 规范,然后按照规则写出适合我们的实际应用程序需求的“织入规则”,最后交给 AspectJ 的编译器负责按照这些织入规则及策略来把位于切面中处理交叉关注点的模块与其他关注 点的模块组合到一起,即可实现灵活、复杂的软件功能。 我们首先来看 AspectJ 中的关于 AOP 一些概念的定义及表示方法: 切面(Aspect) 在 AspectJ 中,切面封装了切入点、通知及通知的实现代码,切面中还可以声明改变一 个类的继承关系、给一个类添加属性、方法、构造函数,指定一个现有类实现一个接口等等。 切面是一个独立的模块单元,跟普通的 java 类一样,切面中还可以定义自己属性、定义方 法。一个切面一般写在一个以 aj 为扩展名的文件中,切面的定义根据 AspectJ 切面初始化的 方式及生命周期的不同,有如下几种形式: [modifier] aspect aspectName{ ... } [modifier] aspect aspectName issingleton() { ... } [modifier] aspect aspectName perthis(Pointcut) { ... } [modifier] aspect aspectName pertarget(Pointcut) { ... } [modifier] aspect aspectName percflow(Pointcut) { ... } 17
[modifier] aspect aspectName percflowbelow( Pointcut)(.. Modifier] privileged aspect 在上面的格式中,方括号"口"中的内容是可省的,一船情况下都不需要,[ modifier]可以 是 abstract、 public及 final. aspect是表示切面的关键字, aspectName表示切面的名称 aspectName后面的关键字如 issingleton等用来标识不同的切面初始化方式及生命周期 下面是一个 AspectJ切面源文件内容 public aspect AspectDemo //切面里面的属性 private int times=0 //定义一个切入点 pointcut some Pointcut():call(* Component. *(.))i //给切入点 some pointcut定义一个通知 after(: some Pointcut(( this times++i System. out, print1n("执行了内中 A: "+thisJoinPoint getsignature(). getName()) thisprint ( //切面中定义方法 private void print () System. out. println(this times 对于OOP编程来说,我们主要是针对类 class来编程,把一个类相关的属性、方法、构 造子等都封装到了类中。而对于AOP编程来说,主要就是对切面 Aspect编程,也就是把切 面相关连接点、切入点、通知以及实现、引介等都封装到切面中。通过前面的Helo及上面 的示例,我们对 Aspect有了一个初步的印象,接下来我们将对 Aspect中如何实现连接点、 切入点、通知、引介等分别作介绍。 连接点 Join point 连接接点是指程序中的某一个点。在 Aspect中,连接点分得非常细致,如一个方法、 个属性、一条语句、对象加载、构造函数等都可以作为连接点。 Aspec中的连接点主要 有下面的几种形式: 方法调用( Method Cal)-方法被调用的时 方法执行 ( Method execution)-方法体的内容执行的时; 构造函数调用( onstructor cal)-构造函数被调用时; 构造函数执行( Constructor execution)-构造函数体的内容执行时; 静态初始化部分执行( Static initializer execution)-类中的静态部分内容初始化时; 对象预初始化( Object pre-initialization),主要是指执行构造函数中的thiO及 super0时 对象初始化( Object initialization)-在初始化一个类的时候 属性引用( Field reference)-引用属性值时 属性设值( Field set)一设置属性值时 异常执行( Handler execution)-异常执行时: 通知执行( Advice execution)-当一个AOP通知(增强)行时
[modifier] aspect aspectName percflowbelow(Pointcut) { ... } [modifier] privileged aspect aspectName { ... } 在上面的格式中,方括号"[]"中的内容是可省的,一船情况下都不需要,[modifier]可以 是 abstract、public 及 final。aspect 是表示切面的关键字,aspectName 表示切面的名称, aspectName 后面的关键字如 issingleton 等用来标识不同的切面初始化方式及生命周期。 下面是一个 AspectJ 切面源文件内容: public aspect AspectDemo { //切面里面的属性 private int times=0; //定义一个切入点 pointcut somePointcut():call(* Component.*(..)); //给切入点somePointcut定义一个通知 after():somePointcut(){ this.times++; System.out.println("执行了内中 的:"+thisJoinPoint.getSignature().getName()); this.print(); } //切面中定义方法 private void print() { System.out.println(this.times); } } 对于 OOP 编程来说,我们主要是针对类 class 来编程,把一个类相关的属性、方法、构 造子等都封装到了类中。而对于 AOP 编程来说,主要就是对切面 Aspect 编程,也就是把切 面相关连接点、切入点、通知以及实现、引介等都封装到切面中。通过前面的 Helo 及上面 的示例,我们对 AspectJ 有了一个初步的印象,接下来我们将对 AspectJ 中如何实现连接点、 切入点、通知、引介等分别作介绍。 连接点(Join point) 连接接点是指程序中的某一个点。在 AspectJ 中,连接点分得非常细致,如一个方法、 一个属性、一条语句、对象加载、构造函数等都可以作为连接点。AspecJ 中的连接点主要 有下面的几种形式: 方法调用(Method Call)-方法被调用的时; 方法执行(Method execution)-方法体的内容执行的时; 构造函数调用(Constructor call)-构造函数被调用时; 构造函数执行(Constructor execution)-构造函数体的内容执行时; 静态初始化部分执行(Static initializer execution)-类中的静态部分内容初始化时; 对象预初始化(Object pre-initialization),主要是指执行构造函数中的 this()及 super()时; 对象初始化(Object initialization)-在初始化一个类的时候; 属性引用(Field reference)-引用属性值时; 属性设值(Field set)-设置属性值时; 异常执行(Handler execution)-异常执行时; 通知执行(Advice execution)-当一个 AOP 通知(增强)执行时。 18