下面是
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
注入主程序中预定义位置的代码