下面是 AOP 的一些基本概念
aspect (方面):实现了 cross-cutting 功能,是针对方面的模块,是为题的不同关注点,我们可以将这些方面通过某种方式加入到核心关注点中。
jointpoint (连接点):连接点是方面插入应用程序的地方,该点能被方法调用。
advice (通知): advice 是我们关注点功能的实现,它通知程序新的行为。如在权限处理中, permission advice 包括权限控制的实现代码。
pointcut (切入点): pointcut 可以指定把哪些 advice 应用到 jointpoint 上去、如何应用上去以及应用的位置。
AOP 包括三个开发步骤:
关注点分解:分解需求提取出横切关注点和一般关注点。把核心模块级关注点和系统级的横切关注点分离开来。就前面所提到的网上购物系统来说,可以分解出四个关注点:核心的订单处理、权限、日志和事务。
关注点实现:各自独立的实现这些关注点。
关注点的重新组合:在这一步里,通过创建一个模块单元来指定关注点重组的规则。重组过程被称为织入( Weaving )。以前边的网上购物系统来说,可以通过某种方式指定每个操作结束后需要记录日志、操作开始前要验证是否有权限、操作失败要事务回滚。
 
 
下面是 AspectJ 实现日志记录的一个例子:
public aspect AutoLog
{ 
pointcut publicMethods() :
execution(public * org.apache.cactus..*(..));
pointcut logObjectCalls() :
execution(* Logger.*(..));
pointcut loggableCalls() :
publicMethods() && ! logObjectCalls();
before() : loggableCalls()
{
Logger.entry(thisJoinPoint.getSignature().toString());
}
after() : loggableCalls()
{
Logger.exit(thisJoinPoint.getSignature().toString());
}
}
可以看到,这里边有很多 Java 中没有的关键字,比如 aspect pointcut 等。这些关键字都是 AspectJ 提供的,使用这些扩展我们可以用 AspectJ Java 类增加字段及方法,甚至使 Java 支持多继承。
 
 
Spring 没有自己进行 AOP 技术的实现 , 它的主要实现技术来自于 AOP 联盟( AOPAlliance )。
Spring AOP 中的术语不像 AspectJ 那样多,因而也更容易理解和学习。只要理解三个概念就可以, advice pointcut advisor
advice 是要向别的模块内部不同的地方注入的代码
pointcut 定义了需要注入 advice 的位置,通常是某个特定的类的一个 public 方法
advisor pointcut advice 的装配器,是将 advice 注入主程序中预定义位置的代码