面向方面编程(Aspect-Oriented Programming, AOP)是一个令人兴奋的新模式。就开发软件系统而言,它的影响力将会和有15到20年的面向对象一样。面向方面编程和面向对象编程不但不是互相竞争的技术而且是可以很好的互补。面向对象编程主要用于为同一对象层次的公用行为建模。它的弱点是将公共行为应用于多个无关对象模型之间。而这恰恰是AOP适合的地方。AOP允许定义交叉的关系,那些关系应用于跨国分开的,非常不同的对象模型。AOP允许你层次化功能性而不是嵌入功能性,那使得代码有更好的可度性和易于维护性。我喜欢认为OOP是自上而下的软件开发,而AOP是自左而右的软件开发,它们是完全直交的技术,并且互相很好的补充。
在OOP的工具里是继承,封装和多态,而AOP的组件是通知/拦截器,导言,元数据和pintcuts.让我们看一下这些定义。
通知/拦截器
一个通知是一个逻辑,这个逻辑有特定的事件触发。它是行为,这个行为能够被插入在调用者和被调用者之间,在一个方法调用者和实际的方法之间。通知是AOP真正的关键。通知允许你去透明的应用一些事物,像日志和记录到一个存在的对象模型。
在 JBoss AOP中,我们用拦截器是实现了通知。你能够定义拦截器,它拦截方法调用,构造器调用和域访问。后面,我们将阐明怎样应用这些拦截器到一个存在的对象模型。
导言
导言是一个增加方法或者域到一个存在的类中的途径。它们甚至允许你改变当前存在的类是显的接口,并且引入一个混合的类,这个类是实现了新的接口。导言允许你带入多继承到一般的Java类。导言一个主要的用例是当你有一个方面,你想让这个方面有一个运行时间借口时。你想应用你的方面跨越不同的对象层次,但是你仍然要应用开发者去能够调用特定方面的APIs.
导言能够是一个方法,它将一个新的API绑定到一个存在的对象模型。Apple apple = new Apple();
LoggingAPI logging = (LoggingAPI)apple;
Apple.setLoggingLevel(VERBOSE);
元数据
元数据是能够绑定到一个类的附加信息,在静态或者运行时间。元数据更加有力力量的是,你能够动态绑定元数据到一个给定的对象实例。元数据非常强大的,当你真正编写应用于任何对象的一般方面,而逻辑需要知道制定类的信息时。在使用的一个好的元数据类比就是EJB规范。在EJB的XML发布描述符中,你需要定义基于每一个方法的事务属性。应用服务器指导什么时候,什么地方开始,挂起或者提交一个事务,因为你在BEAN的XML的配置文件中的元数据内已经定义如方法:Required,RequiresNew,Support等等,它们绑定在你的EJB类和事务管理之间。
C#把元数据成为了这个语言的组成部分。XDoclet是另一个动作的元数据的例子。如果你曾经用过XDoclet生成过EJB文件和发布描述符,你就会知道元数据的力量。在 JDK1.5中,当元数据被加入java语言中,JCP一致同意。(见JSR175)。尽管直到JSR175成为了事实,一个好的AOP框架也应该提供一种机制去定义在运行时间有效的类级元数据。
Pointcuts
如果拦截器,导言和元数据是AOP的特征,那么pointcuts就是粘合剂。Pointcuts告诉AOP框架,那些拦截器绑定到那些类, 什么原数据将应用于那些类或者那一个导言将被传入那些类。Pointcuts定义各种AOP特征将怎样应用于你应用中的类。
在动作中的AOP
例1.使用拦截器
JBoss 4.0带了一个AOP框架。这个框架和JBoss应用服务器紧密地结合,但是你也能够在你的应用中,单独的运行它。直到你看了动作中看到它,你才会完全的理解这个概念,所以让我们用一个来自于JBoss AOP的例子,来说明这个模块所有的部分是如何一起工作的。在这章余下的部分,我们将建立一个例子来跟踪使用AOP的框架。