方面
方面的定义如下:
[access specification] aspect <AspectName>
[extends class-or-aspect-name]
[implements interface-list]
[<association-specifier>(Pointcut)] {
... aspect body
}
关键字aspect申明了一个方面。每一个方面都有一个名字,程序中其他部分可以使用该名字来访问该方面。方面可以定义个访问规格、扩展一个方面或类、实现一个接口。方面体内包含了表示横切规则的代码。通知、引导、和编译时申明能够被定义在方面内。切点可以被定义在类、接口、以及方面内,在方面内的切点可以有一个访问规格,可以被申明为抽象的。而其他的通知、引导、和编译时申明不能含有访问规格。
方面和类之间类似之处:
方面可以包含数据成员和方法;
方面可以包含一个访问规格;
方面可以将自身申明为抽象的;
public abstract aspect AbstractLogging {
public abstract pointcut logPoints(); <- 抽象的切点
public abstract Logger getLogger(); <- 抽象的方法
before() : logPoints() {
getLogger().log(Level.INFO, "Before: " + thisJoinPoint);
}
}
方面可以扩展类或抽象方面,也同样可以实现接口;
public aspect BankLogging extends AbstractLogging {
public pointcut logPoints() : call(* banking..*(..));
public Logger getLogger() {
return Logger.getLogger("banking");
}
}
方面可以被包含在类或接口中作为内嵌的方面;
方面和类之间的不同之处:
方面不能直接地被实例化;
方面不能继承具体的一个方面;
方面具有一些特殊的访问权限;