AOP 正在成为软件开发的下一个圣杯。使用 AOP,你可以将处理 aspect 的代码注入主程序,
通常主程序的主要目的并不在于处理这些 aspect。AOP 可以防止代码混乱。
为了理解 AOP 如何做到这点,考虑一下记日志的工作。日志本身不太可能是你开发的主
程序的主要任务。如果能将“不可见的”、通用的日志代码注入主程序中,那该多好啊
AOP 可以帮助你做到。
Springframework 是很有前途的 AOP 技术。作为一种非侵略性的,轻型的 AOPframewor
k,你无需使用预编译器或其他的元标签,便可以在 Java 程序中使用它。这意味着开发团
队里只需一人要对付 AOPframework,其他人还是象往常一样编程。
AOP 是很多直觉难以理解的术语的根源。幸运的是,你只要理解三个概念,就可以编写
AOP 模块。这三个概念是:advice,pointcut 和‰advisor。advice 是你想向别的程序内部不同
的地方注入的代码。pointcut 定义了需要注入 advice 的位置,通常是某个特定的类的一个‰p
ublic 方法。advisor 是 pointcut 和 advice 的装配器,是将 advice 注入主程序中预定义位置的
代码。
既然我们知道了需要使用 advisor 向主要代码中注入“不可见的”advice,让我们实现一个
SpringAOP 的例子。在这个例子中,我们将实现一个 beforeadvice,这意味着 advice 的代
码在被调用的 public 方法开始前被执行。以下是这个 beforeadvice 的实现代码:
代码:
packagecom.company.springaop.test;
importjava.lang.reflect.Method;
importorg.springframework.aop.MethodBeforeAdvice;
publicclassTestBeforeAdviceimplementsMethodBeforeAdvice{
publicvoidbefore(Methodm,Object[]args,Objecttarget)
throwsThrowable{
System.out.println("Helloworld!(by"
+this.getClass().getName()
+")");
}
}
接 口 MethodBeforeAdvice 只 有 一个 方 法 before 需 要 实 现 , 它 定 义 了 advice 的 实 现 。
before 方法共用三个参数,它们提供了相当丰富的信息。参数 Methodm 是 advice 开始后执
行的方法。方法名称可以用作判断是否执行代码的条件。 Object[]args 是传给被调用的
public 方法的参数数组。当需要记日志时,参数 args 和被执行方法的名称,都是非常有用
的信息。你也可以改变传给 m 的参数,但要小心使用这个功能;编写最初主程序的程序员
并不知道主程序可能会和传入参数的发生冲突。Objecttarget 是执行方法 m 对象的引用。
在下面的 BeanImpl 类中,每个 public 方法调用前,都会执行 advice: